加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

dsp2812的flash在线升级一

发布时间:2020-12-15 18:44:03 所属栏目:百科 来源:网络整理
导读:当我们把工业控制电路板发出去给客户使用后,紧接着面临的问题是如何对板级芯片升级。我们不可能要求客户会使用仿真器,让售后服务人员去每一个厂家升级也不切实际,况且客户分布在全国各地,甚至世界的各个角落。那我们就必须要做到像升级应用程序一样,插

当我们把工业控制电路板发出去给客户使用后,紧接着面临的问题是如何对板级芯片升级。我们不可能要求客户会使用仿真器,让售后服务人员去每一个厂家升级也不切实际,况且客户分布在全国各地,甚至世界的各个角落。那我们就必须要做到像升级应用程序一样,插上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.3specdigsdflashmydriversDSP281x_v3_3Flash281x_APIFlash2812_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位),这意味着什么,难道还不应该感到高兴嘛?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读