以文本方式查看主题 - 曙海教育集团论坛 (http://sun4.cn/bbs/index.asp) -- DSP6000系统开发 (http://sun4.cn/bbs/list.asp?boardid=29) ---- TMS320C6000系列DSP的Flash启动设计 (http://sun4.cn/bbs/dispbbs.asp?boardid=29&id=1628) |
|||||||
-- 作者:wangxinxin -- 发布时间:2010-11-22 14:16:42 -- TMS320C6000系列DSP的Flash启动设计 随着近年来数字信号处理器(DSP)技术的迅猛发展,其越来越广泛地应用于国民经济的各个领域中 ![]() ![]() ![]() C6000系列DSP的启动加载方式包括不加载、主机加载和EMIF加载3种 3种加载方式的比较:不加载方式仅限于存储器0地址不是必须映射到RAM空间的器件,否则在RAM空间初始化之前CPU会读取无效的代码而导致错误;主机加载方式则要求必须有一外部主机控制DSP的初始化,这将增加系统的成本和复杂度,在很多实际场合是难以实现的;EMIF加载方式的DSP与外部ROM/Flash接口较为自由,但片上Bootloader工具自动搬移的代码量有限(1 KB/64 KB) 1 EMIF加载分析 实际应用中,通常采用的是EMIF加载方式,把代码和数据表存放在外部的非易失性存储器里(常采用Flash器件) 下面以TMS320C6000系列中最新的浮点CPU——TMS320C6713(简称“C6713”)为例,详细分析其EMIF加载的软硬件实现 硬件方面,其与16位宽度的Flash器件的接口如图1所示
对于不同的DSP器件,加载方式的配置引脚稍有不同
应用程序的大小决定了片上的Bootloadet工具是否足够把所有的代码都搬移到内部RAM里 图2所示为使用二级Bootloader时的CPU运行流程
使用二级Bootloader需要考虑以下几个事项: ·需要烧写的COFF(公共目标文件格式)段的选择; ·编写二级Bootloader; ·将选择的COFF段烧入Flash 一个COFF段就是占据一段连续存储空间的程序或数据块 对于EMIF加载方式,需要加载的镜像由代码段(如.vectors和.text等)和初始化数据段(如.cinit,.const,.switch,.data等)构成 所有未初始化的数据段(如.bss等)都不需要烧入到Flash中 2 二级Bootloader的编写 ·由于执行二级Bootloader时C的运行环境还未建立起来,所以必须用汇编语言编写 ·CCS中用户工程编译链接后产生的.map文件包含了存储器的详细分配信息 ·与cmd文件不同,map文件不仅包含了各段存储在哪一段内存空间的信息,从map文件中还可以具体知道每个内存区间中有多少被实际使用(烧写Flash时会用到这个参数) 3 Flash的烧写 把代码等写入Flash的办法大体上可分为以下几种: ① 使用通用烧写器写入 ② 使用CCS中自带的FlashBurn工具 ③ 用户自己编写烧写Flash的程序,由DSP将内存映像写入Flash 其中,使用通用烧写器烧写需要将内存映像转换为二进制或十六进制格式的文件,而且要求Flash器件是可插拔封装的 使用TI公司提供的FlashBurn工具的好处在于使用较为直观 虽然TI公司提供了FBTC的源代码供有需要的用户修改,但这样用户需要去了解FBTC的运行机制及其与上位机的通信协议,并对Flash烧写函数进行修改
其次,FlashBurn工具不能识别.out文件,只接受..ex的十六进制文件,因此,需要将.out文件转换为.hex文件
使用用户自己编写的烧写Flash的程序较为灵活,避免了文件格式转换的繁琐 通常采用的Flash烧写程序是单独建立一个工程的办法:先把用户应用程序(包含二级Bootloader)编译生成的.out文件装载到目标DSP系统的RAM中,再把烧写Flash的工程编译生成的.out文件装载到目标DSP系统RAM的另一地址范围,执行Flash烧写程序,完成对Flash的烧写 实际上,可以将Flash烧写程序嵌入到用户主程序代码中去,比单独建立一个烧写Flash的工程更为方便
ChipErase函数和ProgramFlashArray函数的编写可参照用户使用的Flash芯片的Datasheet以及参考文献[1] ProgramFlashArray函数的第1个参数是源地址指针(指向内部Ram),第2个参数是目标地址指针(指向外部Flash),第3个参数是要写入的数据长度(单位为字) 编写Flash烧写函数时有3点需要注意: ① 指向Flash地址的指针 对8位存储器而言,应该左移2位;对16位存储器而言,应该左移1位;对于32位存储器,则不需要移位 ② map文件中各内存区间被实际占用的尺寸大小是以字节为单位的,而ProgramFlashArray函数写入Flash的数据单位为字,所以需要将map文件中得到的尺寸大小的一半作为ProgramFlashArray函数的参数 ③ 烧写函数中使用了flash_burned常量作为判断是否需要对Flash操作的依据,且将其初始化为1 在仿真加载方式下,可以在CCS里的watchwindow窗口手动修改flash_burned常量为0,强迫CPU进入对Flash编程的程序段 4 结 论 本Flash加载方案以C6713为例,稍加修改即可适用于TMS320C6000系列的其他DSP器件 |