




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、摘要:为解决特殊场合DSP程序升级困难的问题,以TMS320F28035为例,介绍了一种基于串口通信的适合于TMS320C2000系列DSP实现程序更新的在线升级方法。描述了该在线升级方法的基本思想和实现步骤,给出了关键部分的程序代码。实验证明,该方法简单可靠,可用于嵌入式设备软件程序的升级更新中。关键词:在线升级;DSP;串口通信;FlashTMS320C2000系歹UDSP是美国德州仪器公司(简称TI)推出的集微控制器和高性能DSP特点于一身的DSP系歹U。该系列的DSP具有强大的控制信号处理能力1,能够实现复杂的控制算法。随着电子技术的不断发展以及用户需求的不断提升,可能需要经常对已经投
2、入使用的嵌入式设备程序进行更新,而目前一般的程序升级方法是实地取下设备,露出JTAG端口后通过仿真器来更新程序2-4。这种方法虽然简单有效,但对于某些特殊场合,会给程序升级带来了极大的不便2。本文以TMS320F28035为例,描述了一种可以脱离JTAG仿真器,不改变DSP上电启动方式,实现TMS320C2000K列DSP应用程序在线更新的方法。1在线升级的基本思想一般的基于DSP的软件程序更新是在CC/境下通过JTAG接口操作来实现的。基于JTAG接口的方法虽然易于操作,而且调试方便,但经常受空间以及传输距离的限制。例如一台DSP系统安装在复杂、封闭的环境下,当程序需要更新或升级时,利用JT
3、AG接口难以实现程序的在线升级3。而基于串口通信的在线升级技术是通过用底层程序烧写应用程序的方法来达到程序升级的目的,该方法则不受复杂系统和复杂环境的限制。另外,在线升级方法不需要改变DSP的启动方式,直接采用DSP默认的内部Flash方式启动5,从而省去了要对DSP的一些引脚进行硬件设置的麻烦。底层程序指已经固化在DSP旨定Flash空间中的程序,不允许用户修改和擦除,主要用于实现在线升级的时机判断、数据接收及代码烧写等功能,该程序中使用了Flash2803x_API库存函数(详见2.2节);应用程序即为用户的升级程序3。F28035DS如次上电复位,先运彳T底层程序,与PC机建立联系,然后
4、根据PC机的指令来判断是否需要升级应用程序。若需要,则将通过串口发送来的应用程序代码烧写至F28035片内Flash指定扇区;否则将继续执行原有的应用程序。当应用程序很大或DSP的RAM空间比较小时,可采用将应用程序代码分批发给DSPDSP接收并烧写完一批代码后,再进行下一批代码的接收和烧写工作,直到所有的应用程序代码都烧写完毕。2在线升级的具体实现2.1应用程序用户的应用程序经过CC制译连接生成具有模块化格式的目标文件(.out),该文件中的代码和数据分别存放在不同的段中,因而不能直接用来烧写Flash,需将其转换为Flash能识别的数据格式二进制文件(.bin)。本文采用hex2000.e
5、xe和FileOshell.exe工具来实现文件转换。首先,应用程序经过编译连接生成.out文件,然后通过hex2000.exe把.out文件转换成.hex文件,再通过FileOshell.exe将文件转换成.bin文件。先做一个批处理文件,内容如下:Example_2803xAdcSoc.out-mapExample_2803xAdcSoc.map-oExample_2803xAdcSoc.hex-m-memwidth16-imageROMSFlash28035:origin=0x3e8000,len=0x1000,romwidth=16,fill=0xFFFF其中,Example_2803
6、xAdcSoc.out是应用程序经过CCS成的文件;-map是生成map文件;-o是生成hex文件;-m是Motorola-S格式;-memwidth16指存储器位数为16bit;-image指选择映像文件;ROMS所需要转换的起始地址、长度、位数及填充。本文选择从0x3e8000开始,长度是4KB,即FlashH,FlashH中未用的部分用0xFFFF填充,本文把这个批处理文件命名为:Example_2803xAdcSoc.cmdo接下来要生成.bin文件,先做一个MS-DOS批处理文件,其内容如下:IFileIOShell.exe-iExample_2803xAdcSoc.hex-oExa
7、mple_2803xAdcSoc.bin注意要把Example_2803xAdcSoc.out、hex2000.exe、FileIOShell.exe、Example_2803xAdcSoc.cmd和MS-DOS批处理文件放在同一目录下,然后双击MS-DO瞟批处理文件,即生成所需要的Example_2803xAdcSoc.bin文件。2.2 底层程序底层程序用于实现将串口发送的数据烧写至Flash的指定部分,涉及到应用程序的正确定位和复位后的启动过程,是实现整个在线升级的重点。底层程序流程图如图1所示。底层程序主要实现以下功能3:DSP上电复位;1uiurtoFLii.M扃动畸从IT;机寿口发
8、送来咕代碍球同叶正皿;Zjft给弟堂写.竽特系统更新更位完T?代码布物烧与ECTftQlCPECHhlQUEET.com禺HJFUh2a炸11ffMijh程汴烧bBlI度层理序跳程图(1)上电复位查询功能。上电复位后通过接收上位机发送的命令判断是否升级。若上位机发送的是升级命令,则跳转到底层程序中升级部分执行;否则,跳转到原有的应用程序处执行。(2)搬移烧写程序的功能。由于F28035片上Flash不支持在其中一个扇区运行程序去擦除或烧写其他扇区,故完成接收数据和烧写Flash工作的这部分程序(即底层程序中的升级部分程序)需搬移至片内RA般片外RAMk运行。实现程序搬移的函数为:voidMem
9、Copy(Uint16*SourceAddr,Uint16*SourceEndAddr,Uint16*DestAddr)while(SourceAddr<SourceEndAddr)*DestAddr+=*SourceAddr+return其中,SourceAddr为Flash中升级程序的起始地址,SourceEndAddr为Flash中升级程序的结束地址;DestAddr为搬移至内存的首地址。(3)接收上位机发送的应用程序代码并保存到DSP指定的内存中(一般为RAM区)。这是通过串口RS232来实现的。并确定用于数据保存的这部分内存未被占用。例如,若需要将应用程序代码暂存到F28035
10、的L0SARAM区域(地址空间0x3F8000-0x3F8800)。定义数组Uint16BlockBuffer2048用于存储应用程序代码,在底层程序中采用存储器定位语句,将上面的缓冲数组定位到相应的存储空间:#pragmaDATA_SECTION(BlockBuffer,“BlockTransferbuffer");在底层程序CM位件中,采用定位语句,将BlockTransferbuffer定位到DSP的L0SRA值间:BlockTransferBuffer:>L0SARAMPAGE=2/地址空间:0x3F80000x3F8800通过以上底层程序的设置,可将应用程序缓存到指定
11、的RAMK域中。(4)代码接收结束后,将内存中的代码烧写至指定Flash扇区,该步骤通过调用Flash2803x_API库函数完成。底层程序中所用到的Flash2803x_API库函数如下6:擦除扇区的函数为Uint16Flash28035_Erase(Uint16SectorMask,&Fstatus),其中,SectorMask为即将被擦除的扇区;&Fstatus为执行擦除操作后返回的状态值,用来判断擦除操作是否成功。将程序烧写到Flash扇区的函数为Uintl6Flash28035_Program(&FlashAddr,&BuffAddr,Length,&
12、amp;Fstatus),其中,&FlashAddr为即将被烧写的Flash扇区的起始地址;&BuffAddr为即将准备烧写的程序当前存放在内存空间的首地址;Length为程序长度;&Fstatus为执行烧写操作后返回的状态值,用来判断烧写操作是否成功。校验烧写到Flash中的程序为Uint16Flash28035_Verify(&FlashAddr,&BuffAddr,Length,&Fstatus),其中,&FlashAddr指定从Flash内开始比较的首地址;&BuffAddr为被比较文件的存储首地址;Length是需要比较
13、的16bit字的个数,程序长度;&Fstatus是执行校验操作后返回的状态值,用来判断校验操作是否成功。2.3 底层程序和应用程序的定位DSPF28035上电复位后,CPUW从内部BootRom<得复位向量。复位向量指向BootRom并执行其内部的Bootloader程序,执行完毕后确定从内部Flash启动。程序指针跳转到Flash的0x3F7FF6处。由于这个地址是固定的,因此底层程序必须烧写在以这个地址为起始地址的空间内。DSPS入底层软件程序中运行,首先通过接收上位机的命令来判断是否进行在线升级,如果进行在线升级,则跳转到相应升级程序中执行;否则,跳转到原有的应用程序处执行
14、。由底层程序跳转到原有的应用程序处执行时,采用绝对地址跳转。部分程序如下所示:#defineJumpgxcx(void(*)(void)0x3E8FFE/定义应用程序的跳转地址SCI_SendStatus("upgradeprogram?(y/n):")/向上位机询问是否升temp=SCIA_GetByteData_app();/接收上位机发送来的是否升级命令if(temp=,y,)(main2();/如果升级,则跳转到升级程序中执行)Else(*Jumpgxcx)();/如果不升级,则采用绝对地址跳转到应用程序中执行)底层程序的cmd配置与应用程序的cmd配置要保持一致,
15、不能产生地址冲突。同时,要注意底层程序和应用程序的跳转地址配置。底层程序cmd文件的部分配置如下:BEGIN:origin=0x3F7FF6,length=0x000002RESET:origin=0x3FFFC0,length=0x000002/*codestart:>BEGINPAGE=0应用程序cmd文件的部分配置如下:BEGIN:origin=0x3E8FFE,length=0x000002codestart:>BEGINPAGE=03烧写步骤首先把底层程序通过JTAG接口烧写到F28035中,然后再进行应用程序的烧写。应用程序的烧写步骤为:先把串口调试工具的参数配置为波特
16、率9600bit/s、8bit数据位、1bit停止位、没有奇偶校验位;选择发送文本文件方式,发送应用程序的.bin文件到DSP由于F28035的RAMK比较小,可以采取把应用程序代码分为多次发送的方式。烧写过程如图2所示。Fltl_K.il£tEMr»3'4tlAtfeitauffr纣*Liu*irn,pmi«a»im»i3SF*2板写过程本文介绍了一种基于串口通信的DSP应用程序在线升级技术,可以在不打开机箱的条件下实现模块软件的更新升级。经过实验发现,采用在线升级技术来更新程序所耗费的时间比采用JTAG口烧写程序所耗费的时间要长一些
17、,但解决了复杂情况下程序升级困难的问题。总之,该方法简单可靠,可应用于嵌入式设备的软件程序更新升级中。目标板:C2000的28335/28069一、主要思路:1、准备升级程序(相当于一个bootloader),作为上电首先运行的程序。进入升级程序,首先判断需不需要升级,需要升级,进入升级状态,通信完成新的主程序的接收,存入,升级成功后,进入主程序运行。2、在主程序运行时,收到升级指令,标记升级标志,重启进入升级程序进去升级。3、板子上电后,会调到flash启动的起始地址0x33FFF6(DSP28335),这个地址存放着程序的codestart的其实地址。所以,修改了0x33FFF6的存放的值
18、,那么就能决定执行那一段程序。还可以通过汇编跳转指令直接跳转到程序codestart执行。二、升级程序1、具备能力:具备通信能力和Flash读写能力2、准备:FlashAPI移植、上位机的升级配套程序;存储升级标志位的空间(外部EEPROM,不会随便擦除的内部Flash)3、流程:接收->校验->烧写->跳转三、升级步骤1、数据接收:通过CAN/串口等方式接收数据。由于28335内存较小,不适合缓存大量的数据,这里是接收一部分数据,校验完成后烧写进Flash,再去接收一部分数据2、数据解析:接收到的数据是hex格式的数据,所以需要解析才能放入对应的flash地址。但由于283
19、35能力限制,这里采用先在上位机解析完成,采用先告知地址,然后发送数据的方式完成数据通信和传输。3、校验:这里采用crc校验。/*Name:crc16"Function:crc校验16位*Params:data(UInt8*):待操作的数组len:数据长度"Return:UInt16:返回CRC值CRC校验码为2个字节高位在前*/UInt16crc16(Uint8*data,UInt16len)(UInt16CRC=OxFFFF;UInt8j,TMP=0;UInt8i;for(i=0;i<len;i+)CRCA=datai;for(j=0;j<8;j+)(TMP
20、=CRC&0x0001;CRC=CRC>>1;if(TMP)CRC=CRCA0xA001;)returnCRC;)4、数据烧写flash:运用flashAPI提供的接收完成数据的烧写。这里要注意flashAPI必须运行在RAM中。5、完成数据烧写后,需要跳转到主程序。一般采用汇编指令。汇编指令asm("LB0xXXXXXX")或者汇编函数。这里采用asm的方式,跳转地址为新应用程序的起始地址,这里必须规定每次跟新的新应用程序的起始地址必须固定。asm("LB0x3xxxxx");如果是使用变动的起始地址,则必须采用汇编函数,把地址作为
21、参数传进函数。四、主程序1、接收升级指令后,能够标志升级状态。重启进入升级程序,进行判断,进而升级程序。2、主程序运行后,升级状态标记为不用升级状态。五、注意点1、升级程序与主程序要严格分开,合理分配flash空间,附升级程序和主程序cmd大致分配空间。主程序cmd文件/*File:f28335nonBIOSflash.cmd-Linkercommandfilefornon-DSP/BIOS*codewithDSPinBoottoFlashbootmode.*History:09/18/07-original(D.Alter)*/MEMORYPAGE0:/*ProgramMemory*/BEG
22、IN_M0:origin=0x000000,length=0x000002/*PartofM0SARAM.Usedfor"BoottoM0"bootloadermode.*/FLASH_PROGRAMS:origin=0x310000,length=0x000010/*On-chipFLASH*/FLASH_PROGRAM:origin=0x310010,length=0X01FFF0/*On-chipFLASH*/ZONE7A:origin=0x200000,length=0x010000CSM_RSVD:origin=0x33FF80,length=0x000076/*
23、PartofFLASHSectorA.ReservedwhenCSMisinuse.*/BEGIN_FLASH:origin=0x33FFF6,length=0x000002/*PartofFLASHSectorA.Usedfor"Jumptoflash"bootloadermode.*/PASSWORDS:origin=0x33FFF8,length=0x000008/*PartofFLASHSectorA.CSMpasswordlocations.*/ADC_CAL:origin=0x380080,length=0x000009/*ADC_calfunctioninRe
24、servedmemory*/OTP:origin=0x380400,length=0x000400/*1KwOTP*/IQTABLES:origin=0x3FE000,length=0x000B50/*PartofBootROM*/IQTABLES2:origin=0x3FEB50,length=0x00008C/*PartofBootROM*/FPUTABLES:origin=0x3FEBDC,length=0x0006A0/*PartofBootROM*/BOOTROM:origin=0x3FF27C,length=0x000D44/*8KwBootROM*/RESET:origin=0x
25、3FFFC0,length=0x000002/*partofBootROM*/FLASH_CONST:origin=0x300000,length=0x010000PAGE1:/*DataMemory*/M0SARAM:origin=0x000002,length=0X0003FE/*1KwM0SARAM*/M1SARAM:origin=0x000400,length=0x000400/*1KwM1SARAM*/DRAM:origin=0x008000,length=0x008000PIEVECT:origin=0x000D00,length=0x000100ZONE7B:origin=0x2
26、10000,length=0x010000/FLASH_DATA:origin=0x330000,length=0x008000/*On-chipFLASH*/SECTIONS/*CompilerRequiredSections*/*Programmemory(PAGE0)sections*/.text1:DSP2833x_CodeStartBranch.obj(.text)>FLASH_PROGRAMS,PAGE=0.text2:*(.text)>FLASH_PROGRAM,PAGE=0.cinit:>FLASH_PROGRAM,PAGE=0.const:>FLASH
27、_PROGRAM,PAGE=0.econst:>FLASH_CONST,PAGE=0.pinit:>FLASH_PROGRAM,PAGE=0.reset:>RESET,PAGE=0,TYPE=DSECT/*Wearenotusingthe.resetsection*/.switch:>FLASH_PROGRAM,PAGE=0.cio:>FLASH_PROGRAM,PAGE=0/*DataMemory(PAGE1)sections*/.bss:>DRAM,PAGE=1.ebss:>DRAM,PAGE=1.stack:>DRAM,PAGE=1.sys
28、mem:>ZONE7B,PAGE=1.esysmem:>ZONE7B,PAGE=1/*UserDefinedSections*/codestart:>BEGIN_FLASH,PAGE=0/*UsedbyfileCodeStartBranch.asm*/csm_rsvd:>CSM_RSVD,PAGE=0/*Usedbyfilepasswords.asm*/internalMemFuncs:>FLASH_PROGRAM,PAGE=0/*UsedbyfileXintf.c.Linktointernalmemory*/passwords:>PASSWORDS,PAG
29、E=0/*Usedbyfilepasswords.asm*/*SectionsecureRamFuncsusedbyfileSysCtrl.c.*/ramfuncs:LOAD=FLASH_PROGRAM,PAGE=0/*ShouldbeFlash*/RUN=ZONE7A,PAGE=0/*MustbeCSMsecuredRAM*/LOAD_START(_RamfuncsLoadStart),LOAD_END(_RamfuncsLoadEnd),RUN_START(_RamfuncsRunStart)/*AllocateADC_calfunction(pre-programmedbyfactory
30、intoTIreservedmemory)*/.adc_cal:load=ADC_CAL,PAGE=0,TYPE=NOLOAD/*endoffile*/升级程序cmd文件/*File:f28335nonBIOSflash.cmd-Linkercommandfilefornon-DSP/BIOS*codewithDSPinBoottoFlashbootmode.*History:09/18/07-original(D.Alter)*/MEMORYPAGE0:/*ProgramMemory*/BEGIN_M0:origin=0x000000,length=0x000002/*PartofM0SAR
31、AM.Usedfor"BoottoM0"bootloadermode.*/FLASH_PROGRAM:origin=0x330000,length=0x005000/*On-chipFLASHG*/FLASH_PROGRAM1:origin=0x335000,length=0x001000/*On-chipFLASHG*/FLASH_CONST:origin=0x336000,length=0x001000/*On-chipFLASHG*/ZONE7A:origin=0x200000,length=0x010000CSM_RSVD:origin=0x33FF80,lengt
32、h=0x000076/*PartofFLASHSectorA.ReservedwhenCSMisinuse.*/BEGIN_FLASH:origin=0x33FFF6,length=0x000002/*PartofFLASHSectorA.Usedfor"Jumptoflash"bootloadermode.*/PASSWORDS:origin=0x33FFF8,length=0x000008/*PartofFLASHSectorA.CSMpasswordlocations.*/ADC_CAL:origin=0x380080,length=0x000009/*ADC_cal
33、functioninReservedmemory*/OTP:origin=0x380400,length=0x000400/*1KwOTP*/IQTABLES:origin=0x3FE000,length=0x000B50/*PartofBootROM*/IQTABLES2:origin=0x3FEB50,length=0x00008C/*PartofBootROM*/FPUTABLES:origin=0x3FEBDC,length=0x0006A0/*PartofBootROM*/BOOTROM:origin=0x3FF27C,length=0x000D44/*8KwBootROM*/RES
34、ET:origin=0x3FFFC0,length=0x000002/*partofBootROM*/PAGE1:/*DataMemory*/M0SARAM:origin=0x000002,length=0x0003FE/*1KwM0SARAM*/M1SARAM:origin=0x000400,length=0x000400/*1KwM1SARAM*/DRAM:origin=0x008000,length=0x008000PIEVECT:origin=0x000D00,length=0x000100ZONE7B:origin=0x210000,length=0x010000/FLASH_DAT
35、A:origin=0x330000,length=0x008000/*On-chipFLASHB*/)SECTIONSFlash28_API:(-lFlash28335_API_V210.lib(.econst)-lFlash28335_API_V210.lib(.text)LOAD=FLASH_PROGRAM1,RUN=ZONE7A,LOAD_START(_Flash28_API_LoadStart),LOAD_END(_Flash28_API_LoadEnd),RUN_START(_Flash28_API_RunStart),PAGE=0/*CompilerRequiredSections*/*Programmemory(PAGE0)sections*/.text:>FLASH_PROGRAM,PAGE=:0.cinit:>FLASH_PROGRAM,PAGE=:0.const:>FLASH_PROGRAM,PAGE=(.econst:>FLASH_CONST,PAGE=0.pinit:>FLASH_PROGRAM,PAGE=:0.reset:>RESET,PAGE=0,TYPE=D
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届广东湛江市大成中学化学高三第一学期期末监测试题含解析
- 安徽省马鞍山含山2026届化学高一第一学期期末监测模拟试题含解析
- 2026届福建省永春三中高三化学第一学期期中达标检测试题含解析
- 2026届广东省深圳四校发展联盟体化学高一上期中质量跟踪监视模拟试题含解析
- 2026届浙江省温州市“十五校联合体”化学高三上期末质量检测试题含解析
- 教育大数据在学生心理健康发展中的应用研究
- 教育技术助力洛阳教育事业发展
- 虚假信息与新闻信任
- 2025年传染病防控应急处置能力提升培训试题
- 新解读《GB-T 39186 - 2020钢铁行业项目节水量计算方法》
- 雇佣保姆合同电子版(2025年版)
- 防暑降温安全常识培训
- 预防压疮敷料的裁剪
- 体育场看台座椅施工方案
- 老年人消毒护理与急救技术
- 数据中心列头柜基础知识
- 热力管网安全事故应急预案
- 清理水草芦苇水面施工方案
- 铁路技术规章:018铁路军事运输管理办法
- 办公室装修装饰报价单
- 超声科健康护理宣教
评论
0/150
提交评论