张剑平 黄荣 高伟松
摘要 本文介绍在TMS320F28335DSP处理器平台下,通过串口实现在线升级应用软件的一种方法。串口通讯遵循Ymodem通訊协议,借助微软Window操作系统自带的超级终端,即可实现应用升级。避开了TMS320F28335自带BootLoader升级软件需占用GPIO口的弊端;本文论述的方法可避免编写上位机软件,是一种便宜的方法。
【关键词】TMS320F28335 串口升级 串口 Ymodem协议
TI公司的TMS320F28335 DSP具有32位TMS320C28XCPU和FPU处理器,片上FLASH、SARAM以及外设相比TMS320F2812有了进一步的扩展和增强,它是目前控制领域中的先进处理器,在电机控制、变频器、不间断电源以及电力线通信等系统中应用越来越广泛。一般而言,DSP系统设计完成后,程序需要固化在片上FLASH。应用升级固化可通过JTGA接口、或利用其量产固化的内置BootLoader程序来实现。但这两种方式都存在限制:利用前者需要打开产品,这对于产品的量产来说,无论从效率上还是产品的完整性上来说,都不是好的途径;利用后者,需要配置额外的GPIO口作为启动选项。然而在系统设计过程中,这些特定的启动管脚往往有系统设计的需求,被占用后可能无法满足系统的功能设计。针对上述的问题,本文提出了一种新的应用升级方式:定制启动程序(IAP),IAP在系统上电之后运行,设置超时后跳转到应用程序,在超时时间范围内利用串口Ymodem协议,实现应用程序的升级。本文从系统运行流程开始分析,论述整个原理和实现步骤。
1 系统运行流程分析
1.1 FLASH引导过程分析
在进行IAP设计之前,首先了解TMS320F28335 DSP运行过程。当系统上电复位后,程序到复位向量0x3FFFC0位置开始程序执行,在复位向量处根据向量内容跳转到片上ROM里面的BootROM位置执行初始化引导函数InitBoot,InitBoot完成对芯片的初始化,并调用模式选择函数SelectBootMode来确定引导模式,选择JumptoFLASH模式,程序退出BOOT转向FLASH中0x33FFF6处执行程序,用户需要在0x33FFF6开始程序的设计,系统从复位开始到转向FLASH过程如图1所示。
1.2 IAP设计思路
TMS320F28335从FLASH引导后,直接跳转到0x33FFF6这个地址,执行应用程序。为了达到我们的设计目的,在0x33FFF6这个地址插入一个IAP程序。这个程序也是本文所论述的实现串口在线升级程序的产品端固件。插入这个固件之后,TMS320F28335从FLASH引导后不会直接跳转到应用程序,而是先引导到IAP固件程序。这个固件固化在FLASH中,被执行之后,等待用户的确认。设计一个3s的超时等待,如果用户未确认,则超时后跳转到应用程序。否则执行应用软件
2 IAP固件原理和实现
2.1 运行过程分析
如图3所示,IAP固件固化在FLASH中,入口地址为0x33FFF6。TMS320F28335从FLASH引导后,跳转到UnsecuredFLASH中执行IAP程序。IAP程序必须包含以下几个功能:
(1)串口通讯功能。接收用户下发的应用程序;下文论述实现符合YMODEL协议的串口通讯功能。
(2)FLASH读写功能;该功能用于将下载的应用程序烧录到FLASH中。但是TMS320F28335不支持代码在FLASH中运行的同时操作FLASH,因此需要将FLASH操作的代码拷贝到RAM中执行。
(3)自我复制功能;该功能即是(2)要求的功能。该功能通过copy_sections例程来实现。如图2所示。
(4)跳转到应用程序的功能。
综合上述,IAP程序在FLASH中开始执行,code_start,wd_disable,Copy_sections例程。Copy_sections例程之后,完成将本身拷贝到UnsecuredRAM中执行。然后跳转到Unsecured RAM继续执行IAP程序,完成上述(1)、(2)、(4)功能。
因此,code_start,wd_disable,Copy_sections段例程是加载和运行都在FLASH中的。而c_init00开始的流程,是加载在FLASH中,但是运行在RAM中的。这个功能的实现是通过IAP程序生成时,CMD链接文件配置来实现的。下节将对此说明。
2.2 加载和运行配置
IAP程序固化在FLASHA扇区中,拷贝到RAM中执行。
(1)更改DSP2833x_SysCtrl.c文件。#pragmaCODE_SECTION(InitFlash,"ramfuncs");语句。使InitFlash编译到.text段。
(2)更改DSP2833x_usDelay.asm文件。将函数DSP28x_usDelay的段描述符由.sect"ramfuncs"更改为.text。0
(3)更改DSP2833x_CodeStartBranch.asm文件。code_start函数中,跳转到LB_c_int00;更改为LBcopy_sections;
(4)更改DSP2833x_CodeStartBranch.asm文件。wd_disable函数中,跳转到LB_c_int00;更改为LBcopy_sections;
(5)Flash28335_API_V210加入到工程;
(6)将4532.DSP28xxx_SectionCopy_nonBIOS.asm加入到工程;
(7)修改.cmd文件。SECTIONS中加入:wddisable:>FLASHA,PAGE=0wddisable段原来描述在.text段中。
因为.text段被拷贝到RAM中执行。而wddisable需要在FLASH中执行。因此区别.text段单独描述。
(8)修改.cmd文件。SECTIONS中加入:copysections:>FLASHA,PAGE=0
(9)修改.cmd文件。SECTIONS中加入:Flash28_API:
{
-lFlash28335_API_V210.lib(.econst)-lFlash28335_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(10)8修改.cmd文件。.text段连接描
述更改为:
.text:LOAD=FLASHB,
RUN=RAML0,PAGE=0LOAD_START(_text_loadstart),RUN_START(_text_runstart),SIZE(_text_size)修改之后,4532.DSP28xxx_SectionCopy_
nonBIOS.asm会将.text的段拷贝到_text_runstart初执行。该部操作在LBcopy_sections中完成。
(11)在main函数中,完成Flash28_API段的拷贝。_Flash28_API_LoadStart拷贝到_Flash28_API_RunStart。单独拷贝Flash28_API段,是因为Flash28_API段没有描述成.text段,因此不会在LBcopy_sections中完成拷贝。
2.3 程序的烧录和跳转
应用程序固化在FLASHC扇区中。为了实现跳转。我们需要将应用程序的code_start代码固化在FLASHC地址0x13E000处。因为需要更改应用程序的cmd文件。
MEMORY
{
...CINT00:origin=0x13E000,length=
0x000050
...
}
SECTION
{
...boot:>CINT00PAGE=0
{-lrts2800_fpu32lib
}
...
}
跳转程序的实现:
typedefvoid(*pFunction)(void);
pFunctionJump_To_Application=(pFunction)0x13E000;
Jump_To_Application();
3 升級操作
通过JTAG接口将IAP程序固化到TMS28335芯片中。打开超级终端,配置IAP程序中对应的串口波特率,这里为38400bps,无校验。系统上电,3s之内,输入IAP程序中约定的升级密码,这里为(“stop”),选择传送,发送文件,将目标代码bin发送升级。如图4所示。
4 总结
本文首先论述了TMS320F28335通过串口在线加载程序必要性和优越性。接着从TMS320F28335启动流程开始分析,讨论了固件和应用程序的连接位置。然后讨论了固件的实现。通过本文的论述,实现了TMS320F28335固件设计的一种新思路。
参考文献
[1]TI. TMS320x2833x, 2823x BOOT ROM Reference Guide(Literature Number: SPRU963A), 2007-Revised 2008.
[2]TI. Copying Compiler Sections From Flash to RAM on the TMS320F28xxx DSCs(Literature Number: SPRAAU8), 2008
[3]TI.TMS320F28335,28334,28332 Flash APIs For creating custom programming solutions for the TMS32F28335, 28334,28332 DSPs, Release version,2008.08.