当我们把工业控制电路板发出去给客户使用后,紧接着面临的问题是如何对板级芯片升级。我们不可能要求客户会使用仿真器,让售后服务人员去每一个厂家升级也不切实际,况且客户分布在全国各地,甚至世界的各个角落。那我们就必须要做到像升级应用程序一样,插上U盘或者联网后点下按钮就能完事。目前公司的新系统正面临着如此的问题。一向使用仿真器的我开始了新的挑战。这方面资料网上比较少,即使找到成功的案例他们也只说成功了,却没有提及到如何成功。我们唯一能确定的是这是可以的,但得自己去摸索,去实践。
我正在做的是dsp2812的flash在线升级。也就是说在不用仿真器的情况下把程序烧写到片上flash中。TI官方公布了一些资料,其中包括
1.通过windows的程序sdflash利用串口烧写flash,需要几个先决条件(网上可以下载到)
1)安装sdf28xx_v3_3_serial.exe和setupCCSPlatinum_v30329.exe
2)根据《2812串口烧写Flash步骤及设置.pdf》操作
此方法我没有成功,但是有几点我可以肯定,首先没有从flash启动,应该是从SCI_A启动的,串口可以通讯(不过当做发送文件试验时只能发送10个字节就不行了)。没有找到问题所在,希望以后有机会能够搞懂。
2.片上flash不能从一个扇区操作另一个扇区。也就是说flash的程序复制升级数据到flash上是不行的。这里采取3个步骤
1)升级前把程序(升级部分)拷到内存中运行(后面会讨论)
2)内存中的程序擦除flash(本文需要叙述的)
3)内存中的程序把升级的数据(我们通过双口ram从ARM传过来)烧写进flash,并验证。(本文需要叙述的)
3.TI已经公布了操作flash的API库,头文件,需要注意的事项和例子,装好sdflash软件,在该目录下可以找到这些东西(C:\CCStudio_v3.3\specdig\sdflash\mydrivers\DSP281x_v3_3\Flash281x_API\Flash2812_API_V210)。
1)在我的工程文件中包含Flash2812_API_V210.lib
2)在我的工程文件中包含头文件Flash281x_API_Config.h和Flash281x_API_Library.h
3)在Flash281x_API_Config.h修改CPU_RATE,我的晶振是24M,所以24*10/2=120MHZ
#define CPU_RATE 8.333L // for a 120MHz CPU clock speed (SYSCLKOUT)
3)在我的工程中调用API擦除flash,烧写flash,验证。这里需要注意的是烧写的时候只要烧到3F7FF6,3F7FF7,这是flash倒数第10和第9个字节,一般这两个字节就是程序的开始,同时都会是跳转指令,跳到程序真正开始的地方,我需要烧写的程序这两个字节的内容是0x007E,0x4336,意思是跳转到3E4336执行。最后8个字节是密码,都已经被擦除为0xFFFF,千万不要写这块区域,不然密码锁住,flash就等于报废了。
4)我的这个工程是烧写flash的工程,而被烧进flash的程序又从何而来呢?我事先写了一个定时器点亮8个LED的程序,平时我都是用仿真器烧进flash,这次我的试验就是利用我的flashAPI工程把这个定时器程序烧进去。那么这里并不是简单烧写.out文件。首先.out文件只是flash的部分内容,而且没有定位信息,根本不知道每部分程序应该烧写在flash的哪个位置,这就是下面讨论的另一个话题了。
转换.out文件
1)利用hex2000.exe将*.out和*.map(定位文件)转换成ASCII格式文件,并将flash的空白区域填充成0xFFFF。也就是说.out文件中的程序只是占据了flash的几个部分区域,那么利用.map文件将.out的程序分配到整个flash文件的指定区域,那么其他没有程序的地方就是0xFFFF。比如我的定时器程序分配以后只有开头50字节,0x4000的地方有544字节,0xC000的地方有2240字节,1个跳转指令暂居最后16字节密码前面的4个字节。这些需要执行完下面一步才能看出来。
2)利用FileIOShell.exe将HEX2000产出的ASCII格式转换为二进制格式,这个文件的大小刚好是256K字节,对应dsp2812的整个flash(128K16位)。正如前面所述,只有几个区段有数据,其他都是0xFFFF。这里要注意的是,我用vc查看二进制文件,比如文件开头的4个字节是这样的FF FE 80 1A,那么对应的是flash的首个地址0x3D8000的内容是0xFFFE(不是0xFEFF),第2地址0x3D8001的内容是0x801A(不是0x1A80).
具体步骤如下(我的程序名是CpuTime0)
1.编写CpuTime0.cmd文件,内容如下:
CpuTime0.out
-map CpuTime0.map
-o CpuTime0.hex
-i
-memwidth 16
-image
ROMS
{
FLASH2812: origin=0x3d8000, len=0x20000, romwidth=16, fill=0xffff
}
2.将CpuTime0.out,CpuTime0.map, CpuTime0.cmd, hex2000.exe, FileIOShell.exe放在同一个目录(我就放在CpuTime0的debug目录里)
3.运行windows的cmd命令,进入命令行
4.一直打开到所在目录,即前面提到的debug目录
5.运行命令“hex2000.exe CpuTime0.cmd”,这是目录里生成了ASCII格式的文件CpuTime0.hex。
6,继续运行命令“FileIOShell.exe -i CpuTime0.hex -o CpuTime0.bin”,这时目录了出现了二进制文件CpuTime0.bin。
7,看看它的大小256K字节(128K16位),这意味着什么,难道还不应该感到高兴嘛?