当前位置:首页 期刊杂志

DSP28335嵌入式系统的SCI在线编程方法实现

时间:2024-08-31

罗秋凤,叶 慧,李 勇,高 源

(1.南京航空航天大学无人机研究院,江苏南京 210016;2.南京航空航天大学自动化学院,江苏南京 210016)

DSP28335嵌入式系统的SCI在线编程方法实现

罗秋凤1,叶 慧2,李 勇2,高 源2

(1.南京航空航天大学无人机研究院,江苏南京 210016;2.南京航空航天大学自动化学院,江苏南京 210016)

为了解决嵌入式系统主流控制器DSP28335程序升级维护不便、成本高的问题,提出了一种通过异步串行通信接口SCI向片内FLASH在线编程的方法。将特定的GPIO引脚状态配置为SCI引导模式,DSP芯片上电自检后调用BootLoader中的SCI_Boot函数,将烧写控制程序通过SCI口下载到片上SARAM,然后调用API功能函数将用户程序固化到FLASH。实验结果表明,该方法有效可行,简单方便,可脱离JTAG仿真器进行操作,提高了传输距离,降低了成本。

DSP28335;SCI引导;API函数;在线编程

DSP28335是TI公司新推出的一款具有强大的控制和信号处理能力的32位浮点型数字信号处理器[1],主频高达150 MHz,片上集成了256 KWord的FLASH存储器、34 KWord的SARAM,8 KWord的Boot ROM以及多种先进的外设,可广泛应用于工业控制、移动通信、军事安全等领域[2]。

随着电子技术的发展和用户需求的提升,对已投入使用的DSP嵌入式设备软件的维护和更新也越来越频繁,当进行程序升级时,要擦除芯片内容并重新烧写新的程序代码和数据[3],通常使用TI公司的CCS烧写插件并通过仿真器JTAG口对片上FLASH进行编程的方法[4-6]。虽然该方法简单易用,但一般只是在程序的开发和调试阶段使用,在复杂的工作环境中,直接取下设备、连接仿真器存在较大困难,或现场还存在不能拆开设备情况。因多数嵌入式设备都有通信端口如USB,CAN,SCI,SPI或无线通信口等,因此可通过通信端口对FLASH进行烧写可以有效解决这个问题[7-10]。

本文在详细介绍了DSP28335 SCI引导模式的上电加载思想和串口在线编程的原理后,研究了一种通过异步串行通信SCI口对片上FLASH进行烧写的方法。

1 API功能函数的选择与介绍

图1 通过FLASH API烧写DSP示意图Fig.1 Diagram of DSP by FLASH API programmer

DSP片上FLASH存储器中放置的是用户/应用程序和初始化代码,要实现嵌入式终端的在应用编程(IAP)功能,需要采用专门的定制方案,即利用TI公司提供的应用程序接口库(API)[11]文件,其中包含用于对FLASH及一次性编程单元OTP进行操作的各种函数,利用API函数进行擦除、编程和校验FLASH的方法如图1所示。

1.1擦除函数Erase( )

擦除FLASH时每次最小只能擦除一个扇区,不能对其中的某一位进行擦除,剩余没有指定的扇区内容保持不变。

函数原型(Defined inFlash2833x_API_Library.h)

extern Uintl6 Flash2833x _Erase

(Uintl6 SectorMask,//定义标示位来指示擦除的扇区;

FLASH_ST *FeraseStat,//定义FLASH结构的状态指针FeraseStat,执行擦除操作后状态返回值,判断操作是否成功;)。

1.2编程函数Program( )

该函数对用户指定的FLASH扇区或一次性编程单元OTP上进行编程,编程时将位由1变为0,一次编程一个字存储单元。

函数原型(Defined inFlash2833x_API_Library.h)

extern Uintl6 Flash2833x_Program

(Uintl6 *FlashAddr //定义指向需要烧写到FLASH或OTP区域的起始地址指针;

Uintl6 *BufAddr //定义程序当前存放在内存RAM空间的首地址指针;

Uint32 Length //定义编程到FLASH或OTP的16位数据的总长度;

FLASH_ST *FprogStatus //定义FLASH结构的状态指针,返回FLASH的烧写状态;)。

1.3校验函数Verify( )

因为编程函数在烧写时自身已经进行过状态反馈校验,因此该函数是在编程结束后进行的完整性校验。实际上就是将接收缓冲区(RAM空间)和FLASH或OTP中写入的数据进行比较,如果完全相同,就表明终端已将接收缓冲区中的数据全部正确地写入了FLASH中。

函数原型(Defined inFlash2833x_API_Library.h)

extern Uintl6 Flash2833x_Verify

Uintl6 *startAddr //定义指向已经烧写的FLASH或OTP区域的起始地址指针

Uintl6 *BufAddr //定义程序搬移到内存RAM空间的首地址指针

Uint32 Length //定义编程到FLASH或OTP的16位数据的总数长度

FLASH_ST *FVerifyStatus //定义FLASH结构的状态指针,返回FLASH的校验状态

2 串口在线编程方案

通常要实现IAP功能还需要一个独立的存储器,这是由FLASH的特性决定的。当对FLASH进行编程操作时,整个FLASH会被加上高于普通工作电压的编程电压,致使对FLASH读取不稳定,系统无法在该FLASH空间中运行。

考虑到API函数的调用需遵循严格的时序要求,否则不能实现功能[12]。DSP28335带有34 KWord×16位的片上RAM,在读写访问时可以全速运行,即等待周期为零,因此把FLASH API函数加载到片上RAM空间执行是切实可行的。同时,RAM中要留有足够空间,以便存放复制到RAM中的FLASH编程函数。且编程不是实时进行,从上位机接收到的待编程的用户代码必须先放入缓冲区,所以还需要在RAM中分配一个足够大的空间用于保存接收到的编程代码。以DSP28335为核心处理器的终端完全具备开发IAP系统的硬件条件。图2说明了3种装载FLASH API的方法。

图2 3种装载FLASH API的方法Fig.2 Three methods to load the FLASH API library

由于API算法嵌入在烧写控制程序(KPL)中,通过KPL调用API算法来进行对FLASH的操作。

方法A:通过JTAG口将KPL代码直接下载到片上RAM,这种方法主要是通过CCS/仿真器或SDFLASH软件实现。

方法B:通过SCI,SPI,Parallel,I2 C,eCAN中的任何一种BootLoader将KPL从片外空间直接下载到片上SARAM。

方法C:将KPL烧写固化到FLASH,OTP或XINTF中,编程前将需要执行FLASH编程任务的API函数复制到独立的存储器SARAM内,然后从其中运行,再烧写FLASH操作。

这3种方法中,方法B和方法C都能满足系统远程升级的要求。为了简单方便,本文讨论的是用方法B来烧写FLASH。

3 SCI BootLoader引导机理

引导加载程序BootLoader是位于片内Boot ROM中的一段用于引导的程序,在系统上电复位后才会执行,从而完成一系列的初始化和引导操作[13-14]。BootLoader包含了一系列的引导加载器函数,用来将预先存储到外部非易失的存储介质的代码拷贝到快速的存储介质片上RAM中,并自动执行。

为了满足不同系统的需求,BootLoader提供了16种可选择的引导模式,BootLoader通过查询GPIO12,GPIO13,GPIO14,GPIO15这4个通用I/O引脚的状态,判断选择相应的引导模式。本文通过串口实现软件编程和升级,将模式选择端口配置为SCI-A启动模式。

3.1SCI引导启动流程

系统上电复位完成后,首先调用BootLoader中的第1个初始化引导程序(InitBoot),该程序主要把器件初始化成C28X工作模式,然后读取安全代码模块的密码,如果CSM密码被擦除(全1)则自动解锁,否则CSM仍被锁定。对密码读取完成后,BootLoader将调用SelectBootMode(引导模式选择)函数,该函数将4个通用I/O引脚配置为输入,然后检测引脚的状态,依次进行选择判断,确定为SCI-A引导模式后,SCI_Boot(SCI-A引导加载器)函数将从外部设备复制数据到DSP的片上SARAM存储介质中,程序下载完成后返回输入数据流决定的入口地址,以便引导结束后执行应用程序,SCI引导启动流程如图3所示。

图3 SCI引导启动流程Fig.3 SCI boot procedure

3.2SCI引导加载过程

综上所述,BootLoader通过异步方式将代码数据从SCI-A传输到片内存储器是整个引导流程的关键和核心。

BootLoader选择SCI引导模式后,开始了引导加载流程:SCI_Boot函数将主机发送的第一个字和8位数据流的关键字0x08AA进行比较,匹配有效后开始按一定顺序重复读入传输的每个数据块内容,一旦检测到数据块大小等于0,就表示所有数据块下载完成,然后指向BootLoader的指针将跳转到由数据流中确定的程序入口地址处,接着开始执行应用程序,基本流程图如图4所示。

SCI下载模式是一种异步传输方式,只支持8位数据流格式,其通用结构如表1所示。

图4 SCI_Boot程序加载的执行流程Fig.4 Execution flow of SCI_Boot program loader

表1 8位数据结构

4 程序代码格式转换

为了能够使用DSP28335的BootLoader功能,首先必须制作包含BootLoader所需的完整数据流的引导表,建立引导表的总体步骤如下。

4.1COFF文件生成

TI公司提供的DSP集成开发环境CCS[15]对整个工程文件进行编译、链接后生成.out为后缀的二进制通用对象文件格式(COFF)文件。它有着复杂的结构,不仅包含了以段的形式组织的代码和数据,而且还包含了文件头、符号表、段地址、初始化段入口等信息,但是该文件格式的模块化结构与实际的内存存储区间不匹配,不能直接用来加载到RAM或写入FLASH,需要将其转换成内存能识别的数据格式(二进制文件.BIN)。

4.2HEX文件生成

HEX文件是指机器代码的十六进制文件,并且是用一定格式的ASCII码来表示。对于2000系列的DSP,TI公司提供了文件格式转换工具hex2000.exe,可将COFF格式转化成HEX格式。具体格式如下:ASCII HEX,Extened Tektronix,Intel MCS-86(tatel),Motorola-S,TI-Tagged。

进行十六进制转换可以通过单条命令再加各种选项的方法实现,也可以将命令和有关选项汇总到一个文件(称为命令文件)中,然后再利用该文件完成十六进制转换。

4.2.1 命令文件建立

以Intel MCS-86(tatel)为例给出烧写控制程序KPL的命令文件编写格式:

-KPL.out //被转换的输入文件,由CCS产生

-memwidth 16 //16位存储器系统

-datawidth 32 //DSP的字长32位

-boot //将程序中的各段都转换到引导表

-sci8 //8位数据宽度的SCI引导格式

-map KPL-hex.map //数据流对应的map地址文件

-o KPL.hex //生成的数据流文件名为KPL.hex

-i //输出文件为INTEL格式

保存到hex2000.exe所在的文件夹目录,并将文件命名。文件名: KPL-hex.cmd,然后从开始菜单—运行—cmd,输入命令文件hex2000.exe KPL-hex.cmd,运行即可生成KPL.hex文件。生成的HEX文件格式如图5所示。

图5 Intel HEX格式Fig.5 Intel HEX format

4.2.2 Intel HEX格式解析

Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量。

以第1行为例,来解析该文件,“:”号表示一行的开始,第1,2个字符表示本行包含数据的长度0x20即32个;第3~6个字符表示数据存储的起始地址,这里表示从0x0000地址开始存储32个字符数据;第7,8个字符0x00即为普通数据记录类型;之后的32个字符就是本行包含的数据,每两个字符表示一个字节数据,总共有16个字节。

4.3BIN文件生成

BIN文件是按照“顺序格式”表示的二进制机器代码,由于HEX文件中数据域ASCII码表示的十六进制与二进制是一一对应的,这些二进制数据应串行地保存在程序空间。

选用的平台是DSP28335,使用FLASH,RAM作为程序/数据存储器,因为DSP的存储字长是16 bit,所以4个十六进制ASCII码表示一条机器指令或者地址。根据HEX文件的协议格式,在VC6.0平台上开发了HEX文件到BIN文件转换程序,原理是从文件中依次读出字符,根据“:”判断每行的开始,然后每两位ASCII码字符转换成一个十六进制字节数,然后将该字节数重新以ASCII码形式保存。这时生成的代码数据是内存可以识别的可执行代码,可以通过FLASH读写函数写到用户指定的地址空间中,从而实现在线编程。

5 实验验证

图6 BIN格式Fig.6 BIN format

以嵌入式DSP28335最小系统核心板为测试平台,通过串口连接线将上位机和核心板对接,上电前设定I/O引脚GPIO15=1,GPIO14=1,GPIO13=1,GPIO12=0,配置为SCI-A引导模式。打开上位机在线编程调试软件,设置异步串口通信方式为波特率115 200 bps,8位数据位,无校验,1个停止位。

实验开始前,先运行上位机在线编程调试界面,点击打开文件按钮,选择保存的KPL.hex,对该文件进行格式转换,生成的KPL.bin文件格式(以十六进制显示)如图6所示。

该文件可存储为.txt文本格式,里面详述了关键字、保留位、入口地址、数据块存储地址、数据块长度、数据字等信息,即为符合数据流加载的标准和要求的引导表。

DSP上电后,调试界面打开KPL.bin文件,并选择发送到RAM空间,传输成功后KPL开始运行并接管CPU的控制权,等待PC机握手指令并反馈应答信号。握手成功后,接收PC机发送的用户程序的BIN文件,根据选择的FLASH扇区调用API擦写函数,对用户程序进行编程,若校验通过则FLASH烧写成功,如图7所示。

本实验中,烧写的程序为控制GPIO1口输出占空比为1/3的PWM脉冲波形。当程序烧写结束后,将GPIO15,GPIO14,GPIO13,GPIO12引脚配置为FLASH引导模式,重新上电后发现GPIO1有规律地输出预期的波形,通过观察示波器捕捉到的波形如图8所示。

图7 擦除、烧写及校验成功后状态Fig.7 Success staus of erasing, programming and verification

图8 GPIO1引脚波形Fig.8 GPIO1 pin waveform

6 结 语

系统介绍了通过串口实现DSP28335程序在线编程的原理、软硬件框图以及步骤流程,提出了一种可以脱离仿真器,只需要一根串口电缆便可以完成DSP程序固化的方法。在TMS320F28335最小系统的实验电路板上进行了测试验证,结果表明该方案正确可行、便于操作,在工程应用中具有重要的实际意义,并对TI公司其他系列DSP系统的FLASH编程具有很强的通用性和借鉴价值。如果应用程序代码较大,而片上RAM,FLASH空间有限,烧写过程用户代码无法缓存到片内RAM,而后再完全编程至片内FLASH中时,则须扩展外部RAM和FLASH等存储器,修改烧写引导程序中的CMD文件中的地址空间分配代码即可。

/

[1] Texas Instruments.TMS320F28335 Digital Signal Controllers Data Manual[M].[S.l.]:[s.n.],2007.

[2] 苏奎峰, 吕 强, 邓志东,等.TMS320X28XXX原理与开发[M].北京:电子工业出版社,2009.

SU Kuifeng, LYU Qiang, DENG Zhidong. Principles and Development of TMS320X28XXX[M]. Beijing: Publishing House of Electronics Industry, 2009.

[3] 黄正谨. 在线系统编程技术及其应用[M]. 南京:东南大学出版社,2007.

HUANG Zhengjin. Online System Programming Technology and Its Application[M].Nanjing: Southeast University Press, 2007.

[4] 孙 轶,许少尉.TMS320F2812芯片的FLASH烧写技术[J].航空计算技术, 2006, 36(5):46-49.

SUN Yi, XU Shaowei. TMS320F28l2 on-chip FLASH programming technique [J]. Aeronautical Computing Technique,2006, 36(5):46-49.

[5] 李 静,张树团. TMS320F2812片内FLASH在线烧写技术研究[J].国外电子元器件,2008,10(6):34-37.

LI Jing,ZHANG Shutuan. Research on on-line programming techniques for FLASH in TMS320F2812[J]. International Electronic Elements,2008, 10(6):34-37.

[6] 陈若珠, 胡金平, 李战明. TMS320VC5509在线烧写Flash并自举启动方法研究[J].微型机与应用, 2011, 30(2):9-11.

CHEN Ruozhu,HU Jinping,LI Zhanming.Research of on-line programming external Flash and bootloading based on TMS320VC5509 [J]. Microcomputer & Its Applications, 2011, 30(2):9-11.

[7] 张 禄,张兴敢,柏业超,等.便携式可在线编程雷达信号模拟器[J].南京大学学报(自然科学版), 2010,46(4): 359-365.

ZHANG Lu,ZHANG Xinggan,BAI Yechao,et al. A portable and online programmable radar signal simulator[J].Journal of Nanjing University (National Science), 2010,46(4):359-365.

[8] 张 艳, 鲍可进. 整车控制器BootLoader的设计与实现[J].计算机工程,2011,37(12): 233-235.

ZHANG Yan, BAO Kejin.Design and implementtion of BootLoader for vehicle control unit [J]. Computer Engineering, 2011,37(12): 233-235.

[9] 徐 佩,向静波.基于F2812的多处理器串行加载系统设计[J].航空计算技术,2011,41(4):98-101.

XU Pei,XIANG Jingbo.Design of serial loading system for multiprocessor based on F2812[J]. Aeronautical Computer Technique,2011,41(4):98-101.

[10] 马喜强,刘维亚,郑喜凤.基于多通信方式实现DSP程序在线编程[J].电子器件, 2013,36(1): 112-115.

MA Xiqiang, LIU Weiya,ZHENG Xifeng.On-line programming of DSP based on multiple communications [J]. Electron Devices,2013,36(1):112-115.

[11] Texas Instruments. TMX320F281x Flash API Rev[M].[S.l.]:[s.n.], 2007.

[12] 林志贵,钟晴晴.HCS08系列FLASH在线编程方法比较与分析[J].天津工业大学学报,2011,30(5): 71-75.

LIN Zhigui,ZHONG Qingqing.Analysis and comparison of in-circuit programming for FLASH in HCS08Mcu family [J]. Journal of Tianjin Polytechnic University ,2011,30(5): 71-75.

[13] Texas Instruments. TMS320F2833x Boot ROM Reference Guide[M].[S.l.]:[s.n.], 2008.

[14 ] 殷树明, 王宜怀. 嵌入式系统中多用户程序在线编程技术[J].计算机工程,2009,35(5):37-39.

YIN Shuming, WANG Yihuai. Technology of multi-program in-circuit programming in embedded system[J]. Computer Engineering, 2009, 35(5):37-39.

[15] Texas Instruments.TMS320C28x Optimizing C/C++Compiler User's Guide[M].[S.l.]:[s.n.],2009.

SCI online programming for DSP28335 embedded system

LUO Qiufeng1, YE Hui2, LI Yong2, GAO Yuan2

(1.Department of UAV, Nanjing University of Aeronautics & Astronautics, Nanjing Jiangsu 210016, China; 2.Department of Automation, Nanjing University of Aeronautics & Astronautics, Nanjing Jiangsu 210016, China)

In order to solve the problems of maintenance inconvenience and higher cost in the mainstream embedded DSP28335 system, this paper proposes an online on-chip FLASH programming method through asynchronous serial communication interface (SCI),. The particular state of the GPIO pins is configured as a SCI boot mode and the DSP chips calls SCI_Boot function of BootLoader after power-on self-test, Then, the burning control program is downloaded to the on-chip SARAM by the SCI_interface and calls the API functions to the user program to burned into the FLASH. The experiment shows that the method is effective and feasible, simple and convenient, can be broken away from the JTAG emulator for operation, which has improved the transmission distance and reduced the costs.

DSP28335; SCI_Boot; API function; online programming

1008-1542(2013)04-0318-07

10.7535/hbkd.2013yx04012

TP311

A

2013-04-11;

2013-05-27;责任编辑:李 穆

罗秋凤(1970-),女,江西吉安人,高级工程师,硕士,主要从事无人飞行器相关的自动检测与故障诊断方面的研究。

E-mail:YQWL2002@126.com

免责声明

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