APP下载

基于串口通信的DSP程序动态加载技术

2011-03-05李声飞代华山

电讯技术 2011年6期
关键词:串口应用程序编程

李声飞,代华山

(中国西南电子技术研究所,成都 610036)

1 引 言

TMS320F2812是TI公司推出的一款高性能的定点DSP[1],具有32位内核处理器,主频可达150MHz,片内集成 128 kbyte的 FLASH、16 kbyte的SARAM,以及丰富多样的外部接口,广泛应用于工业控制、移动通信、军事安全等领域。随着电子技术的发展和用户需求的提升,对已投入使用嵌入式设备程序的升级也越来越频繁,而目前传统的程序升级方法是实地取下设备,通过JTAG仿真器来烧写程序[2]。这种方法简单有效,但对于某些特殊场合,如设备在密闭的箱体内以及其它不便触及的地方,这种方式给升级带来了极大的不便,因此开发高效、便捷的升级技术成为一种迫切的需求。笔者考虑到多数设备都有远程通信端口,如串口、SPI等,因此可采用在线升级方式,在不打开设备箱体的情况下,实现软件更新。

2 系统结构介绍

如图1所示,系统硬件结构采用DSP+FPGA架构。DSP(TMS320F2812)作为处理中心,通过数据总线和地址总线完成与FPGA的数据交换,实现复杂数据处理算法和外部控制。FPGA利用其大规模硬件资源,实现接口扩展。上电时,FPGA对DSP的模式选择端进行控制,使DSP选择从片内FLASH启动或SCI启动,并且通过FPGA,将PC机的串口与DSP的串口相连,实现PC机和DSP的数据透明交换。

图1 嵌入式设备系统框图Fig.1 Block diagram of embedded equipment system

传统的编程方式采用JTAG口加载程序,利用TI公司编译软件CCS中的On-chip Flash Programmer插件,将编译生成的.out文件直接烧写到片内FLASH区[3]。该方法简单高效,能够实现对模块软件的升级。但对于特殊场合,如模块在密闭箱体内,该升级方式无法快速有效的实现软件升级,所以本文采用基于串口的动态加载的方式,实现设备软件更新。

3 动态加载的工作机理

TMS320F2812的启动方式可以分为内部Flash引导启动、SPI引导启动、SCI-A引导启动、H0-SARAM引导启动、OTP引导启动、GPIO端口B引导启动等几种模式,由其模式选择端实现不同的启动方式。其中,TMS320F2812脱机运行默认为内部Flash启动,本文通过串口实现软件升级,将模式选择端置为SCI启动模式。

本文描述的程序加载采用两级引导方式[4],分为引导程序加载和应用程序FLASH编程。程序动态加载原理如下:首先DSP上电并扫描模式选择口,选择SCI-A启动模式,然后等待接收来自SCI口数据;PC机通过串口将引导程序发送给DSP的SCI通信口,将引导程序缓存至RAM区;然后再发送应用程序的烧写文件,DSP在引导程序的控制下,将应用程序烧写到DSP的FLASH区。由于TMS320F2812有128 kbyte的FLASH空间,能够满足一般的应用需求。

3.1 引导程序加载

DSP的RAM空间分为安全区和非安全区,为了代码的安全性,一般将代码放在安全区域内运行。所以要把加载引导程序加载至RAM的安全区内。

如图2所示,DSP在SCI_BOOT模式下,接收来自串口的数据,先将引导程序存储到非安全RAM区(安全RAM处于锁定状态),该区域在DSP存储器的低地址位。然后加载引导程序接管DSP的控制权,对DSP进行解锁操作,并将自身拷贝到RAM的安全区。

图2 引导程序加载Fig.2 Download boot program

3.2 应用程序烧写

在引导程序的控制下,将应用程序烧写到DSP的FLASH区,如图3所示。

图3 应用程序烧写Fig.3 Programming APP code

首先PC机通过串口将编译好的应用程序发到DSP,DSP接收并缓存程序到RAM区。鉴于应用程序占用空间较大,一般将其存储在较大的RAM空间中。笔者根据需求,将其定位到L0L1区域(地址空间0x008000~0x00A000)。预定义两个数组Uint16BlockBuffer1[4096]、Uint16BlockBuffer2[4096]用于存储应用程序,在引导程序中采用存储器定位语句,将以上两个缓冲数组定位到相应存储空间:

在CMD文件中,采用定位语句,将Buffer1/2定位到DSP较大的RAM空间:

通过以上引导程序的设置,可将应用程序缓存至RAM区中。

当缓冲区Buffer1存满后,引导程序调用FLASH编程API函数,将Buffer1中应用程序烧写到FLASH中。在烧写前要对FLASH进行擦除,采用TI公司提供的API函数对FLASH区域擦除:

其中,第一个参数SECTOR-F2812表示要擦除的扇区,第二个参数返回状态值;通过Erase Status来判断擦写是否成功,若成功,则调用FLASH编程API函数如下:

其中,参数Flash-ptr表示编程首地址,BlockBuffer1为应用程序暂存RAM的首地址,Length为烧写字节数,ProgStatus表示返回状态。通过调用该API函数,将暂存在RAM区的应用程序烧写至指定的FLASH区域,并可以通过指定烧写首地址方式来自行分配FLASH空间。

在BlockBuffer1程序FLASH烧写同时,引导程序继续接收剩下的应用程序代码至BlockBuffer2空间,然后重复以上步骤,将BlockBuffer2中代码烧写至FLASH指定位置,如此反复,待FLASH全部烧写完毕,即完成了程序的升级。

4 动态加载的实现

4.1 硬件环境搭建

首先要搭建设备升级的硬件环境,将设备串口与PC机串口相连,保证数据传输的硬件通路正常;然后通过FPGA控制DSP的启动模式[5],配置DSP上电SCI-A启动。如表1所示,FPGA控制4条模式选择线GPIOF4、GPIOF12、GPIOF3、GPIOF2 输出为 0011。

表1 DSP启动模式控制Table 1 DSP boot mode control

4.2 DSP资源分配

TMS320F2812片内[6]有两块 1 k×16 bit的SARAM MO/M1,两块 4 k ×16 bit的 SARAM L0/L1,1块8 k×16 bit的 SARAM H0、128 k ×16 bit的FLASH 。由于SARAM具有读写速度快的优点,所以优先考虑程序在SARAM中运行,同时大容量的SARAM可以作为数据暂存。FLASH具有掉电数据不丢失的特性,用来保存代码和重要数据信息。基于以上考虑,引导程序代码量较小,笔者选择将其代码段存放到MO/M1空间中,运行程序放在较大的L0/L1段,CMD映射关系如下所示:

应用程序的CMD文件控制其取址和运行的空间,如下所示:

econst段为存放外部数据和常量的空间,分配一个较大的8 k FLASH的区域来保存外部数据;text段为代码段,将程序映射到 FLASHD(地址空间:0x3EC000~0x3F0000)中;cinit用于保存已初始化全局数据,存放到FLASHD区域。Ramfuncs控制程序的执行方式,上电后程序从FLASHD中拷贝代码到RAML0(地址空间:0x008000~0x009000)中运行,实现了程序从FLASH区到RAM区的映射。

4.3 转换待传输的文件

由于CCS编译生成的目标文件(.out)是模块化格式,即程序中代码和数据分别存放在不同段中,该文件不能直接用来烧写FLASH,需将其转换为FLASH能识别的数据格式——二进制文件(.bin)。笔者采用HEX2000和Fileoshell.exe工具来实现文件转换。编写AppCode-hex-2812.cmd文件,将CCS编译后生成文件AppCode.out转换成HEX文件App-Code.hex,并填充未用的FLASH区域为全1。

利用AppCode-COFF2BIN-2812.bat批处理文件,控制FillOShell工具生成bin文件,可以直接传输该文件来实现在线升级。

4.4 烧写步骤

首先配置串口调试工具,配置参数为:波特率9600bit/s,8 bit数据位,1 bit截止位。然后,选择发送文本文件方式,发送引导程序的bin文件到DSP,如图4所示。

图4 传输引导程序Fig.4 Transmission boot program

传完后再次锁定波特率,并选择擦除FLASH,将未编程的FLASH区域全部擦除,再传输应用程序的bin文件,如图5所示。FLASH烧写完成,并校验应用程序大小,若校验通过则FLASH烧写成功。

图5 烧写成功Fig.5 Programming success

5 结束语

本文提出了一种DSP软件动态加载方法,可以在不打开机箱条件下实现模块软件升级。通过实际测试,应用程序代码在10kbyte左右时,升级耗时2 min左右,与传统的JTAG升级方式相比,虽然时间有所增加,但解决了高空、密闭等特殊情况下程序升级的困难,可满足基于TMS320F2812 DSP开发的嵌入式系统升级要求。文中采用二级引导方式,通过串口传输数据并调用API编程函数实现程序动态加载。由于片内FLASH容量有限(128 kbyte),扩充片外FLASH资源以满足大型应用需求,将成为下一阶段工作的重点,若配合以太网络或总线技术,还可实现软件的远程升级。总之,该方法具有操作简单、烧写稳定等优点,可广泛应用于嵌入式设备软件的更新升级中,是智能化设备的必然要求和趋势。

[1]王虹,杨更生.基于 TMS320F2812的步进电机 SVPWM 细分驱动[J].电讯技术,2008,48(8):189-193.WANG Hong,YANG Su.Subdivision Driving with SVPWM of Stepping Motor Based onTMS320F2812[J].Telecommunication Engineering,2008,48(8):189-193.(in Chinese)

[2]李静,张树团.TMS320F2812片内Flash在线烧写技术研究[J].计算机应用,2008(10):37-40.LI Jing,ZHANG Shu-tuan.Research on on-line programming techniques for Flash in TMS320F2812[J].Journal of Computer Applications,2008(10):37-40.(in Chinese)

[3]陈代媛.C6000外部FLASH在线编程引导技术[J].电讯技术,2009,49(5):86-88.CHEN Dai-yuan.External FLASH Memory′s Bootloader System for C6000[J].Telecommunication Engineering,2009,49(5):86-88.(in Chinese)

[4]朱望纯,胡汉武,李智.DSP+FLASH的二次程序加载实现方法[J].理论与方法,2008,27(4):14-16.ZHU Wang-chun,HU Han-wu,LI Zhi.Secondary boot loader method for DSP and FLASH[J].Journal of Theory and Methods,2008,27(4):14-16.(in Chinese)

[5]黄玉梅.一种基于DSP+FPGA的控制系统方案设计[J].电讯技术,2004,44(3):136-138.HUANG Yu-mei.A DSP and FPGA Based Scheme for Control System[J].Telecommunication Engineering,2004,44(3):136-138.(in Chinese)

[6]李晶,钟瑜,郑百衡.基于DSP的FPGA动态配置技术[J].电讯技术,2005,45(1):156-159.LI Jing,ZHONG Yu,ZHENG Bai-heng.FPGA Dynamic Reconfiguration Based on DSP[J].Telecommunication Engineering,2005,45(1):156-159.(in Chinese)

猜你喜欢

串口应用程序编程
编程,是一种态度
元征X-431实测:奔驰发动机编程
浅谈AB PLC串口跟RFID传感器的通讯应用
编程小能手
纺织机上诞生的编程
删除Win10中自带的应用程序
谷歌禁止加密货币应用程序
数字电源内部数据传输的串口通信方法实现
USB接口的多串口数据并行接收方法探索
基于蓝牙串口适配器的GPS接收机与AutoCAD的实时无线通信