编写Flash烧写函数时有3点需要注意:
① 指向Flash地址的指针。由于C6713的低两位地址用于译码作字节选择,地址总线的最低位是EA2,所以,逻辑地址需要适当的移位才能正确地指向日标。
对8位存储器而言,应该左移2位;对16位存储器而言,应该左移1位;对于32位存储器,则不需要移位。例如要从(往)Flash的0x00000003地址读(写)一个字,其逻辑地址应该是0x90000000+(0x0003<<1),而非0x90000003。
② map文件中各内存区间被实际占用的尺寸大小是以字节为单位的,而ProgramFlashArray函数写入Flash的数据单位为字,所以需要将map文件中得到的尺寸大小的一半作为ProgramFlashArray函数的参数。
③ 烧写函数中使用了flash_burned常量作为判断是否需要对Flash操作的依据,且将其初始化为1。这是为了避免Flash加载之后会执行对Flash的操作。此变量应在烧写Flash时手动修改为0。
在仿真加载方式下,可以在CCS里的watchwindow窗口手动修改flash_burned常量为0,强迫CPU进入对Flash编程的程序段。实验证明,在仿真加载方式下手动修改flash_burned并不影响写入到Flash中的flash_burn-ed的值(仍为1),所以,写入Flash的flash_burned的值仍然是1。在系统Flash加载之后,CPU就会跳过此段代码,实现正确运行。
4 结 论
本Flash加载方案以C6713为例,稍加修改即可适用于TMS320C6000系列的其他DSP器件。经过在研制的伺服测试平台中的应用,证明本方法切实可行且易于实现,避免了目标文件格式的转换,比通常采用的FlashBurn工具使用起来更灵活方便,用户可以通过简单修改Flash烧写函数使之适应自己的硬件情况。对于Flash器件接口与TI的DSP不一致的情况,本方案是一个很好的选择。