内部FLASH刷新的TMS32F2812离线升级方法

2018-03-01 00:36,,
单片机与嵌入式系统应用 2018年2期
关键词:主程序离线代码

,,

(1.解放军96610部队,北京 100010;2.陆军装甲兵学院)

引 言

图1 TMS320F2812内存映射图

TMS320F2812作为TI公司推出的C2000系列DSP中性能最高的一款,工作时钟频率最高可达150 MHz,具有强大的数字信号处理和事件管理能力,其内部存储包括SRAM和自带的128 KB的FLASH,可以直接将程序写入其中运行,因此开发和使用非常方便[1]。

芯片在使用时,经常会遇到程序升级的情况,TMS320F2812通常需要专用的烧写器和软件才能写入,在程序调试过程可以使用该方法,但是当产品投入使用后,或者不具备使用烧写器的条件,就需要一种离线的方法进行程序升级。

本文就TMS320F2812离线升级技术进行了探讨,并提出了一种完备的设计方案,可作为该类型芯片的参考设计方案。

1 TMS320F2812存储划分及启动过程

1.1 内部存储单元划分

TMS320F2812的内存映射如图1所示,由26 KB的片上SRAM、256 KB的片上FLASH、片上OTP和片上BootRom组成。程序的代码和数据可以在片上SRAM和片上FLASH中运行。

1.2 启动模式简介

TMS320F2812支持多种启动模式,如FLASH引导装载、SCI引导装载、并行GPIO引导装载、SPI引导装载等,本文介绍的方法是在FLASH引导装载下进行的,其启动过程如下:

① 当XMP/MC为低电平时,TMS320F2812处于微计算机模式,此时向量表指向BootRoom;

② 到BootRoom的0x3F FC00处取出复位向量,跳转到Boot函数,执行完后跳转至0x3F 7FF6处,这个时候指令占据两个字节,刚好在代码模块之前;

③ 取出跳转指令,跳转到自己的指定地址或者C初始化的入口_C_INT00(0x3F 6000)处;

④ 在C初始化的入口_C_INT00对一些变量、堆栈和寄存器进行必要的设置,该函数在C的库函数内(RTS Library);

⑤ 进入main函数。

从其启动过程来看,要能顺利进入主程序,必须要保证第③步的正确跳转,由于InitBoot函数执行完后跳转到0x3F 7FF6处(codestart处),此位置刚好在128位(CSM)密码位置之前两个字节,因此必须在此处放置跳转指令,TI给出的参考代码“DSP281x_CodeStartBranch.asm”用于放置跳转指令,该文件可在TI官网上下载。

1.3 TMS320F2812的内存及数据段的划分

与其他DSP一样,TMS320F2812也是依靠Memory和Section两个伪指令来进行内存的划分和段分配。MEMORY伪指令用来表示实际存在目标系统中的可以使用的存储器范围,在这里每个存储器都有自己的名字、起始地址和长度。

SECTIONS伪指令是用来描述输入端是如何组合到输出端内的。这两个伪指令都在每个工程的.cmd文件中应用,其中,.cmd文件一般包括两个基本的段,初始化段和非初始化段。初始化段包括代码和常数等必须在DSP上电之后有效的数。故初始化段必须保存在如片内FLASH等非遗失性存储器中,非初始化段在程序运行过程中才向变量内写数据,可以映射到易失性存储器如RAM中。其中,与离线升级关系密切的是初始化段的数据,它包括的类型如表1所列。

表1 .cmd文件中主要的初始化段

续表1

实现DSP的离线升级,本质上可以通过更新FLASH中的初始化段数据进行。

2 TMS320F2812基于FLASH刷新进行离线升级的基本原理

2.1 TMS320F2812的FLASH操作

TMS320F2812的FLASH操作是通过调用其提供的库文件实现的,当前最新的库文件版本是Flash281x_API_V210.lib,其中定义了对FLASH进行擦除、写入和验证的函数:Flash_Erase、Flash_Program和Flash_Verify等函数,这些函数在应用时必须要将代码搬移至SRAM中运行,具体方法可见官网的使用手册,需要注意的是在应用时,该库文件要和一些其他涉及到内存操作的函数(例如memcpy等)隔离在不同的RAM段中运行,否则容易出现操作错误。

2.2 目标文件转换

DSP通过编译器CCS编译出后缀名为.out的文件,成为公共对象文件,包含了FLASH各段存放的数据。要实现TMS320F2812的更新,必须要将这些数据提取出来,这要借助TI公司提供的Hex2000.cmd工具,通过命令行调用或者批处理的方法来实现,下面介绍批处理方法。

① 编写一个命令脚本文件,此处命名为Convert.cmd,在其中写入如下命令:

-memwidth 16 %表示数据宽度为16,与TMS320F2812内部Flash的数据宽带一致%

-a %表示生成文本格式数据,生成其他格式请见参考文献[2]%

Test.out %此处写入要转换的对象%

-map Test.map %表示生成映射文件名称%

ROMS{

DSP_CON: org = 0x3D8000, len = 0x01FFF8, romwidth = 16, files = {DSP_CON.dat}

} %表示从.out的地址0x3D8000开始转换,长度为0x01FFF8,生成文件名为DSP_CON.txt %

② 编写一个批处理文件,命名为Build.bat,其中写入如下的命令:

(1)形态。36例周围型小肺癌患者,在经过螺旋CT扫描后,其肿块形态分为圆形(或类圆形)34例,其比例为94.44%,斑片形2例,其比例为5.56%。

[filepath]hex2000.exe Trans.cmd

其中,filepath为hex2000.exe存放的位置,建议该文件要与Convert.cmd、Build.bat,以及要转换的目标文件Test.out放置在同一个文件夹下。

③ 双击运行批处理文件Build.bat,可看到在该文件夹下会生成两个文件,一个为DSP_CON.dat,一个为Test.map,其中Test.map为映射文件,表明了每个存储区的使用及分布情况;DSP_CON.dat为生成的转换文件,表明了在每个地址处存储的内容、文本格式。其内容如下:

图2 转换文件示意图

其中,STX表示文件的起始,ETX表示文件的结束,$A3ec000及其后面的数据表示在地址0x3ec000之后要写入的数据。

由于TMS320F2812的数据宽度是16位的,因此在此地址之后的数据依次为:0x0200、0x0100…,直至数据段结束。因此TMS320F2812离线升级的基本原理就是将转换后的数据存放至指定地址的FLASH中去。

3 一种可靠的升级软件架构设计

图3 程序结构示意图

由于FLASH本身的性质,TMS320F2812实现升级后,如果发生错误,仍需要通过升级进行更正,这就为DSP的软件设计提出了一个要求,即升级后即使出错,也不能影响器件原有的离线升级功能。因此在软件设计时,升级功能和主功能要分开设置在不同的FLASH分区中,可采取如下的形式实现,如图3所示。

启动时首先进入升级程序,在升级程序中等待一段时间,如果在此时间内没有接收到升级命令,再引导主程序运行。为安全可靠地应用,此处给出启动流程图如图4所示。

图4 启动流程示意图

具体实现时,将升级程序和主程序分别编写,分别配置各自的.cmd文件,使两个程序的代码段和常数段分布在不同的存储段内。例如在升级程序的UPDAT.cmd和主程序的MAIN.cmd文件中这三部分的配置如下:

UPDAT.cmd….text:>FLASHEPAGE=0.const:>FLASHFPAGE=0.econst:>FLASHFPAGE=0…MAIN.cmd….text:>FLASHBPAGE=0.const:>FLASHCPAGE=0.econst:>FLASHCPAGE=0…

此时,主程序的代码段存放于FLASHB中,其地址为0x3F 4000,升级程序中要引导进入这个地址执行,可使用函数指针来实现,下面给出主要代码:

#define Main_Func_Addr 0x3F4000 %定义了代码起始地址为FLASHB

typedef void(*Pfunc)(void); %定义了指向函数的指针类型;

void main(){

Pfunc mainfunc; %定义了一个指向函数的指针

FA100_mainfunc = (void(*)(void))Main_Func_Addr;

%将指针指向该地址

mainfunc(); %引导启动主程序

}

为实现可靠的升级,数据传输过程中的每一帧要有编号和校验。将数据写入TMS320F2812的FLASH后,使用Flash_Verify对每一次写入的数据进行校验。还要有主程序功能正常标识,表示主程序可用,每次升级前擦除此标识,正常升级后再置位此标识。每次开机启动时引导主程序前,升级程序可判别此标识,确认是置位状态再引导主程序。

另外还需要注意的是,如果使用TMS320F2182的CSM_PWL功能,要确保升级升序和主程序的密码一致,否则会引起芯片FLASH闭锁。

结 语

[1] TI.TMS320C281X DSP Data Manual, 2011.

[2] Texas Instruments Incorporated.TMS320C281X系列DSP指令和编程指南[M].1版.刘和平,等译.北京:清华大学出版社,2005.

杨春晓(博士)、吴陟轩(硕士),主要研究方向为通信与信息系统;陈颂(硕士),主要研究方向为信息工程。

猜你喜欢
主程序离线代码
异步电机离线参数辨识方法
呼吸阀离线检验工艺与评定探讨
浅谈ATC离线基础数据的准备
浅谈数控铣削技术代码程序的嵌套方式研究
电控冰箱软件模块化设计
创世代码
创世代码
创世代码
创世代码
离线富集-HPLC法同时测定氨咖黄敏胶囊中5种合成色素