当前位置:首页 期刊杂志

一种基于串口通信的DSP程序更新方法

时间:2024-05-19

曹丙虎 张建新

【摘 要】嵌入式设备装入整机或系统后,拆卸进行软件升级非常困难。本文以TMS320F2812为例,提出一种通过串口进行软件更新的方法。借鉴sci-A更新方式,不需要更改相关硬件端口,通过默认内部flash启动,借助F2812内部存储及API函数完成更新操作。实验证明,该方法烧写效率高,准确稳定,操作简单,能够应用于嵌入式软件的在线升级。

【关键字】串口通信;flash;API;在线更新

中图分类号: TP332文献标识码: A 文章编号: 2095-2457(2019)34-0111-002

DOI:10.19694/j.cnki.issn2095-2457.2019.34.049

0 引言

TMS320F2812是美国德州仪器公司推出的一款高性能定点DSP,主频150MHz,集成了128k的FLASH、18k的SARAM,以及丰富的外部接口,广泛应用于工业控制等领域。软件经常随用户需求更改进行更新,传统更新方式需要拆除外壳连接JTAG仿真器进行,这种方法烧写稳定,但是操作繁杂。因此迫切需要一种简单高效的程序更新方法,设备一般都会预留外部通信接口,因此我们选用常用的串口通过数据线对程序进行更新。

1 基本原理及操作流程

一般情况下DSP程序的烧写是在CCS环境下通过JTAG仿真器连接设备和计算机实现的,这种方法虽然操作简单稳定,但是受限于现场条件以及距离。假如DSP被装入复杂的整机结构内,现场拆解困难,此时就无法通过传统JTAG方式进行程序更新。DSP本身也提供了一种通过串口进行更新程序的方法,该方法需要配置相关管脚电平,选择Boot Mode为SCI模式,然后配合相应软件工具进行操作,这种方式对于硬件上事先未对端口做处理,无法配置电平信号的设备无法使用。

通过分析DSP的上电启动过程发现可以在程序的启动位置加入一段更新程序,用于实现FLSAH存储内容的烧写,来达到程序升级的目的。该方法不需要改变DSP的启动方式,省去了管脚配置的麻烦,也不受复杂系统及环境的限制,可以简单高效地完成程序的升级工作。更新程序通过传统JTAG方式烧写在指定FLASH空间,其他方式无法对其进行修改擦除,主要来时间与PC机辅助程序的串口通信握手,更新文件接收保存,调用Flash2812_API_V210函数对FLASH进行擦写操作。

DSP上电启动时,首先运行更新程序,程序启动后稍加延时,等待与PC机通信握手,如果握手失败程序跳转至应用程序执行,握手成功则开始执行更新操作,接收PC机传输的更新文件后处理保存,完成接收后将完整文件写入指定FLASH空间,烧写操作完成程序跳转至应用程序启动位置。该方法完整流程图如图1所示。

2 方法具体实现过程

该更新方法的实现需要完成应用程序文件准备,上位机辅助软件设计,DSP更新程序设计,DSP应用程序针对性修改,接下来会针对每一部分的实现进行详细的说明。

2.1 应用程序文件的准备

应用程序通过CCS编译生成的目标文件(.out)不能直接用于烧写FLASH,使用CCS自带的工具hex2000.exe将.out文件转换为.hex文件,hex文件为bin文件对应的字符文件,直接将hex文件发送给DSP,由DSP程序进行处理转换成对应bin文件并保存到RAM空间。为了提高工作效率,本文将hex2000.exe和out文件放在同一目录c:\hex下,并编写批处理文件保存在该目录,运行批处理文件生成hex文件。批处理文件内容如下:

2.2 PC辅助软件设计

PC辅助软件主要是为了保障更新文件的高效准确传输,主要功能为连接设备、加载文件、文件传输以及过程监控。连接设备实现与DSP设备的通信握手,使更新程序停留在更新功能。加載文件功能读入hex文件内容,字符串形式按行保存在发送文件缓冲区。文件传输通过串口通信,将缓冲区内容逐行发送给DSP更新程序。过程监控实时接收DSP设备反馈内容,实时显示当前文件传输、烧写进程。

2.3 更新程序设计

更新程序可以实现程序文件的接收、处理及暂存,程序写入对应FLASH,跳转执行应用程序。更新程序经过初始化写入后不可修改和擦除,因此需要分配独立的存储空间,我们选取了FLASHA用于程序文件及变量的存储,FLASHB用于上电复位加载程序。这两个区域在用于程序的空间分配中被排除,具体的CMD文件相关内容如下:

SECTIONS

{

Flash28_API:

{

-lFlash2812_API_V210.lib(.econst)

-lFlash2812_API_V210.lib(.text)

}                   LOAD = FLASHB,

RUN = RAML0,

LOAD_START(_Flash28_API_LoadStart),

LOAD_END(_Flash28_API_LoadEnd),

RUN_START(_Flash28_API_RunStart),

PAGE = 0

.text               : > FLASHA      PAGE = 0

ramfuncs            : LOAD = FLASHB,

RUN = RAML0,

LOAD_START(_RamfuncsLoadStart),

LOAD_END(_RamfuncsLoadEnd),

RUN_START(_RamfuncsRunStart),

PAGE = 0

}

為了简化开发过程,我们以Flash2812_API_V210的DEMO程序为基础,进行功能完善,主要完成以下工作:

(1)SCI端口配置为串口,串口参数初始化配置,串口采用接收中断接收PC发送的指令数据,对接收的数据进行校验处理后暂存到RAM空间备用。

(2)程序上电启动首先判断PC机是否发送了更新指令,根据指令选择等待接收文件或者跳转执行应用程序,采用汇编语言asm("LB 0x3DC000")跳转到指定地址,该地址为应用程序存放地址。

(3)文件接收完毕后调用Example_CallFlashAPI()函数将文件写入对应FLASH空间,该空间不能与更新程序定义的两个扇区重叠,防止对更新程序造成修改。

(4)操作过程通过串口指令发送给PC程序,PC程序根据指令显示当前状态及进度。

2.4 应用程序修改

应用程序本身不需要进行修改,只对CMD文件配置进行修改,定义FLASH空间如下:

Flash_CTOH:origin=0x3DC000,length=0x018000

该段FLASH覆盖C至H共6个扇区,可以满足程序的存储及加载需求,同时与更新程序使用的扇区不重合,操作不会影响更新程序,具体涉及的使用分配如下:

SECTIONS

{

.text            : > Flash_CTOH,      PAGE = 0

ramfuncs         : LOAD = Flash_CTOH, PAGE = 0

RUN = Z2SARAM1,   PAGE = 0

LOAD_START(_RamfuncsLoadStart),

LOAD_END(_RamfuncsLoadEnd),

RUN_START(_RamfuncsRunStart)

}

代码启动位置存储在BEGIN_Flash内,该值为.text分配存储FLASH区域的起始地址,BEGIN_Flash内容连接JTAG仿真器烧写程序时被写入,本方法中写入更新程序的代码启动地址。应用程序通过更新程序写入对应区域,不包括BEGIN_Flash的写入操作,本方法中可以忽略应用程序中相关内容,定义与更新程序相同即可。应用程序的启动运行通过更新程序尾部的地址跳转完成,不使用CMD文件中定义的代码启动。

3 结论

本文介绍的这种基于串口通信的DSP程序更新方法,可以在不拆解设备的情况下实现软件的更新升级。经过实验发现,由于程序文件需要事先通过串口通信发送至DSP,更新升级的时间要比JTAG口烧写程序耗时略长。虽然耗时增加,但是相对于设备的拆解时间几乎可以忽略不计,因此该方法可以克服困难环境,应用于嵌入式设备的软件程序更新升级中。

【参考文献】

[1]苏奎峰,吕强,耿庆锋,等.TMS320F2812原理与开发[M].北京,电子工业出版社,2005.

[2]李声飞,代华山.基于串口通信的DSP程序动态加载技术[J].电讯技术,2011,5l(6):121-124.

[3]汪晶晶,苏建徽,孙佩石.基于串口通信的DSP应用程序在线升级方法[J].微型机与应用,2013,32(14):15-17.

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!