黄潇剑
重庆迈科唯医疗科技有限公司 重庆 400714
当设备需要维护时,传统的方法是通过实地,打开设备盖子,然后连接仿真器来更新程序,但是这样会给维护人员或者客户带来很多的不方便。此时通过把待升级的程序放入放在U盘,然后通过USB接口插到设备上,等待几分钟就完成设备的更新,这样对产品的维护就带来了极大便利。
本文是通过U盘来实现在线编程的,基本思路如下:
1、将主程序文件里的CMD文件中的BEGIN_FLASH的地址改为FLASH A区以外的地址;
2、把CCS生成的.out格式的主程序文件先转换成.bin格式的主程序文件;
3、把需要更新的.bin格式的主程序文件放入U盘;
4、升级程序的编写:①调用TI公司提供的库函数(Flash2812_API_V210.lib)对内部FLASH除A区以外的其他区进行擦除,擦除完毕后,调用烧写函数将接收到的数据一段一段地烧写进FLASH除A区以外的其他区段里,最后调用校验函数对每一段的数据进行校验;②需要在升级程序的末尾添加一个汇编语句指向主程序文件里的CMD文件中的BEGIN_FLASH的地址;
5、通过仿真器把升级程序下载到T MS320F2812的FLASH A区;
6、将U盘插到设备USB口,通过SCIA串口通讯方式将.bin格式的主程序文件一段一段地传输到TMS320F2812的接收全局变量数组里;
为了实现程序升级,应合理规划编译所用的CMD文件。在本系统中,将程序划分为2个模块,一个是主程序,另一个是升级程序,用于接收U盘的更新程序数据流及FLASH烧写等;
1、更改主程序文件里的CMD文件中的BEGIN_FLASH的地址
为了方便记忆,我将0x3F5FFE定义为主程序的起始地址
2、.bin文件的生成
1)利用hex2000.exe将∗.out和∗.map(定位文件)转换成ASCII格式文件,并将flash的空白区域填充成0x FFFF。也就是说.out文件中的程序只是占据了flash的几个部分区域,那么利用.map文件将.out的程序分配到整个flash文件的指定区域,那么其他没有程序的地方就是0x FFFF。
2)利用FileIOShell.exe将HEX2000产出的ASCII格式转换为二进制格式,这个文件的大小刚好是256 K字节,对应dsp2812的整个flash(128K16位)。正如前面所述,只有几个区段有数据,其他都是0x FFFF。这里要注意的是,我用UltraEdit查看二进制文件,比如文件开头的4个字节是这样的12 34 56 78,那么对应的是flash的首个地址0x3D8000的内容是0x1234(不是0x3412),第2地址0x3D8001的内容是0x5678(不是0x7856)。
3、拷贝进U盘
4、升级程序的编写
1)在程序中包含FLASH_API库和相应的头文件;
2)修改头文件,选择适合的目标芯片,如CPU时钟频率等;
3)初始化Flash_CPUScaleFactor;
4)初始化PLL控制寄存器PLLCR(由于我选用的架构是:升级程序,用汇编语言进行地址跳转->主程序,故不需要,这里写下只是为以后查看时有更多的注意点);
应用函数必须使用软件延时或其他延时来保证PLL有足够的时间来锁定新的频率;
5)初始化CALLBACK函数指针(我没有用到,因为架构决定不需要);
当用户在API函数执行期间必须要完成一些其他的功能,例如系统有外部看门狗必须要定期清除或者必须发送信息给通信端口,此时用户可以在CALLBACK函数中插入相应的代码完成。
6)代码拷贝;
①在CMD文件中添加Flash_API的库的代码,将Load放在Flash区间里,将Run放在RA M里;
②memcpy()函数放在系统初始化函数后;7)芯片解锁;
需要在运行API函数前解锁CSM单元;
8)配置CMD文件;
①初始化的数据、代码必须要存放到非易失性存储器
②未初始化的数据、代码可以放在RAM里;
③将升级程序只能放入FLASH A扇区,因为芯片启动默认地址是0x3F7FF6,这个地址在FLASHA扇区;
9)在升级程序的末尾添加一句汇编语言指向主程序的起始地址,即:asm("LB 0x3F5FFE");
5、将升级程序下载到TMS320F2812的FLASH A区
6、将U盘插到主机的USB接口,即可自动完成升级
本文提供的方案在第一次使用时,需通过仿真器烧入更新所需的升级程序,以后对程序的改动均可通过U盘更新来完成。方案的主程序大小均为256KB,需要6分钟即可完毕。
该种方案可以满足所有基于TI公司的TMS320F2812的嵌入式系统的升级开发需要,并且十分简单,易操作。