DSP程序在线升级报告(本人觉得最给力的资料)_第1页
DSP程序在线升级报告(本人觉得最给力的资料)_第2页
DSP程序在线升级报告(本人觉得最给力的资料)_第3页
DSP程序在线升级报告(本人觉得最给力的资料)_第4页
DSP程序在线升级报告(本人觉得最给力的资料)_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、DSP程序在线升级唐俊松tangjunson .c n2015/12/041. 引言一般而言,DSP程序更新是在 CCS环境下通过JTAG接口来实现的。但 JTAG烧写程 序只能实现一对一烧写(即电脑到DSP),且不能远距离烧写程序。而当产品发布后或需要同时升级多个DSP程序时,通过JTAG烧写程序则很难实现。在线程序升级的主要思想是通过串口通信更新程序,通过串口通信可实现程序远程升级JTAG烧写程序所存在的弊端。2.通过串口( RS232)更新DSPS序且可同时实现对多个 DSP的程序更新,这有效地解决了1.通过JTAG更新DSF程序图1.1通过不同方式实现 DSP程序更新2

2、. 程序在线升级的基本思想基于串口通信的程序在线升级功能框图如图2.1所示,底层程序(Prog Local)和应用程序(ProgApp)分别由两个独立的 CCS Project产生。底层程序(Prog Local)是产品发布前通过 JTAG烧写固化在 DSP指定Flash空间中的 程序,不允许用户修改和擦除,主要用于实现与上位机的通信,同时在需要升级程序时将上位机发送过来的程序代码烧写到FLASH中。应用程序(ProgApp)是可以更新的程序。通过CCS编译产生程序代码文件(hex),然后通过RS232通信将程序代码发送到DSP,继而由底层程序(Prog Local)将应用程序代码烧写到应用程

3、序所对应FLSH空间(Prog App)中。DSP图2.1DSP程序在线升级功能框图在线升级程序流程图如图 22所示。DSP上电复位后先运行底层程序,在底层程序中 判断是否需要升级,如不需要升级,则跳转到应用程序执行。如需要升级,则擦除应用程序 对应FLASH区,并将升级代码写入到应用程序FLASH区中。Begi n是否升级?2否应用程序跳转底层程序与上位机通信接收升级程序代码将升级程序代码烧写到FlashEnd图2.2DSP程序更新流程图3. 在线程序升级的具体实现3.1 FLASH 分配要实现程序在线升级,必须使底层程序和应用程序相互独立。如图2.1所示,本项目将底层程序(LocalPro

4、gram )配置在 FLASH A 中,应用程序(Application Program )配置在 FLASHE中,从而实现底层程序与应用程序的独立。实现程序相互独立需通过配置cmd文件完成,具体配置方法见附录1。图3.1 DSP FLASH分区示意图3. 2应用程序更新代码产生需要更新的应用程序代码是通过CCS Project A编译产生的,但CCS编译生成的是具有模块化格式的目标文件(.out文件),该文件中的代码和数据分别存放在不同的段中,因而不 能直接用来烧写 Flash,需将其转换为能识别的数据格式( hex文件)(hex数据文件格式详 见附录4)。生成hex文件后,通过上位机读取h

5、ex文件数据,并将数据通过RS232通信发送至DSP。CCS自带工具hex2000. exe可实现.out文件到.hex文件的转换。(转换方法见附录6)CCS编译-JA.outHex2000>A.hexRS232-*DSPProject A图3.2应用程序代码产生方法DS吐电复位Jump to Flash'3.3 底层程序(Local Prog )底层程序主要实现两个功能:(1)与上位机通信;(2)升级时,将串口接收到的数据烧写至Flash的指定区域。底层程序主要实现以下功能,其流程图如右图所示:(1) 与上位机通信,判断是否升级DSP上电复位后与上位机通信, 判断是 否需要升级

6、。若上位机发送的是升级命 令,则跳转到底层程序中升级部分执行;否则,跳转到原有的应用程序处执行。(2) 从上位机接受程序代码并校验接收上位机发送的应用程序代码并保存到DSP指定内存中(RAM 区),(如 何将数据保存至9指定内存,详见附录2)。 与此同时,需校验接收数据是否准确。(3) 烧写程序的搬移由于DSP不支持对FLASH烧写的同时 在FLASH中运行程序,因此负责烧写 Flash的这部分程序应搬移至片内RAM执行。(如何实现程序搬移,详见附录3)(4) 烧写程序代码搬移结束后,将之前 RAM中接受到的程序代码烧写至指定 Flash扇区,该步骤通过调用 Flash28335_API库函数

7、完成(Flash28335_API的使用请看附件中FLASH_AP文档)。4总结实现程序在线升级的主要难点是如何实现底层程序和应用程序相互独立,以及如何通过CCS产生需要更新的应用代码。本报告首先介绍了DSP程序在线升级的主要思想,然后对程序在线升级的实现方法作了简单介绍,并在附录中给出了具体实现过程中可能会遇到的问题及解决办法。附录1底层程序和应用程序cmd配置要实现如图4.1所示的FLASH分配,须通过配置底层程序和应用程序cmd文件完成。其中底层程序对应 CCS Project L,配置其cmd文件使其程序分配在 FLASH A区;应用程序 对应CCS Project A,配置其cmd文

8、件使其程序分配在 FLASH E区。图4.1 DSP FLASH分区示意图1.1底层程序cmd配置DSP F28335上电复位后,当硬件配置为FLASH启动时,程序指针将跳转到Flash的0X33FFF6处(F28335启动过程,详见附录5)。由于这个地址是固定的,因此底层程序必须 烧写在以这个地址为起始地址的空间内,即底层程序cmd配置应为:MEMORYPAGE 0:BEGIN: origin = 0x33FFF6, le ngth = 0x000002/* Boot to FLASH will go here */SECTIONS .:> BEGIN PAGE = 0codestar

9、t与此同时,底层程序所有程序代码段应全部烧写到FLASH A中:MEMORYPAGE 0:FLASHA : origin = 0x338000, le ngth = 0x007F80/* on-chip FLASH */ SECTIONS.ci nit:> FLASHAPAGE =:0.pi nit:> FLASHA,PAGE =:0.text:> FLASHAPAGE :=0.1.2应用程序cmd配置采用绝对地址跳转实现由底层程序到应用程序的跳转,为保证程序正常执行,其跳转地址必须固定,且该地址在应用程序中的位置必须固定。将应用程序的首地址作为跳转地址,即跳转地址固定为 F

10、LASHE的起始地址:0x318000,如图4.2所示。Code StartApplicati on Program(FLASH E图4.2应用程序FLASH示意图采用绝对地址跳转实现从底层程序跳转到应用程序。跳转指令为:#define Jump_App_Program (void (*)( void )0x318000 /*use the Flash E sector to save the applicati on program */(*Jump_App_Program)(); /*Jump to the applicati on program */同时应配置 Prog App的程序起

11、始地址为从(FLASH日起始地址0x318000开始,对应 CMD配置为:MEMORYPAGE 0:BEGIN : origin = 0x318000, length = 0x000002 /*0x318000 is the start address of FLASH E */SECTIONS.codestart: > BEGINPAGE = 0/*codestart is the start address of the program*/. 与此同时,底层程序所有程序代码段应全部烧写到FLASH E 中:MEMORYPAGE 0 :FLASHE: origin = 0x318002

12、, length = 0x007F80/* on-chip FLASH */SECTIONS.cinit: > FLASHEPAGE = 0.pinit: > FLASHE,PAGE = 0.text.: > FLASHEPAGE = 0附录 2: 如何将程序和变量放到指定位置在CCS编程中,如果我们不指定变量的存放位置,编译器会自动的给变量分配一个位置,但是如果有时候需要把变量放在一个特定的空间内,我们应该如何操作呢,CCS提供了如下的两个指令:#pragma CODE_SECTION#pragma DATA_SECTION其中DATA_SECTION是针对数据空间的,CO

13、DE_SECTION是针对程序空间的,具体的使用办法是:#pragma DATA_SECTION(buffe,r D”ATA_sect ”)char buffer512;/buffer 为一数组#pragma CODE_SECTION(fu,n C”ODE_sect ”)Int fun(); /fun为任意函数与此同时,在CMD文件中为DATA_sect CODE_sect开辟空间:DATA_sect : > RAML2PAGE= 1CODE_sec: > FLASHEPAGE= 0附录3:如何将FALSH中程序搬移到RAM中运行CCS中经常会遇到如下语句:MemCopy(&

14、;RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart) 它的作用是将ramfuncs段复制到内存中然后运行。CMD文件中ramfuncs的定义如下;ramfu ncs : LOAD = FLASHD,RUN = RAML0,LOAD_START(_Ramfu ncsLoadStart), LOAD_END(_Ramfu ncsLoadE nd), RUN_START(_Ramfu ncsRu nStart), PAGE = 0第1行表示该段的装载在 PAGA0的FLASHD中第2行表示该段的运行地址在PAGE0的RAML

15、0中LOAD_ START(_Ramfu ncsLoadStar令编译器创建了一个变量Ramfu ncsLoadStart,该变量指向段ramfuncs的装载地址的首地址(LOAD_ STAR为编译伪指令,请见 CCS的帮助文档);LOAD_ START(_RamfuncsLoadEn令编译器创建了一个变量RamfuncsLoadEnd,该变量指向段ramfuncs的装载地址的末地址(LOAD_ END为编译伪指令,请见 CCS的帮助文档);LOAD_ START(_RamfuncsRunStar令编译器创建了一个变量RamfuncsRunStart,该变量指向段ramfuncs的运行地址的首

16、地址(LOAD_ STAR为编译伪指令,请见 CCS的帮助文档); 从第1和2行可以看出,段ramfuncs中的函数DSP28x_usDelay(的装载地址和运行地址是不 同的,本程序中装载在 Flash的块FLASHD中,而在SARAM L0中运行,这只是目标,实际 运行时DSP并不会自动将Flash中的代码拷贝到 SARAM中,因此需要手动添加代码来完成。在 C 函数中,为了使用变量 RamfuncsLoadStart、RamfuncsLoadEnd 和 RamfuncsRunStart,必 须先声明,本工程在文件DSP2833x_GlobalPrototypes.h中做了如下声明:ext

17、ern Ui nt16 Ramfu ncsLoadStart;extern Uin t16 Ramfu ncsLoadE nd;extern Ui nt16 Ramfu ncsRu nStart;然后就可以使用了。在 Ma in .c中,使用 MemCopy()函数将段ramfu ncs中的函数 DSP28x_usDelay()的 代码从装载地址 RamfuncsLoadStart RamfuncsLoadEnd 拷贝至U RamfuncsRunStart开始的SARAM空间中。之后在程序运行时,只要调用DSP28x_usDelay()函数,都会自动地指向 SARAM中相应的函数入口地址,这一

18、点是自动完成的。MemCopy()函数原型在 MemCopy.c 中,DSP2833x_GlobalPrototypes.h 声明。附录4:十六进制数据流文件(Hex文件)十六进制数据流(Hex )是规律性极强的一种文件格式,该类文件是由行'组成的,一行即是一个单元。Hex文件的 行'单元由以下6部分组成::LLAAAARRDD- DDCC 行的开端:标志一个新的 行'的开端; 数据长度:LL'表示后面DDDD的长度(单位Byte); 存储地址: AAAA'表十六位地址,当记录类型是 04时表高十六位地址,记录类型是 00寸表低十六位地址; 记录类型:

19、RR共有 00'和)0£种记录类型; 00:'表该行携带数据信息 01:'表 Hex 文件结束 04:'表高十六位地址有变化 数据内容: DDD'D 是数据内容; 校验内容:CC是该行除去 :和CC之外的数据的校验值。 校验规律是:所有值 加和后取反。附录 5: TMS320F28335启动过程1. DSP reset后运行的起始地址是多少?0x3FFFC02. 仿真器烧写程序的步骤是?根据 cmd 文件把程序烧到指定位置,然后执行。3. DSP的 Flash启动过程是什么?首先假设硬件配置 GPIO8487上拉为1,即处于Flash启动过程。

20、当DSP复位后,会从复位 向量0x3FFFC0处取得复位向量,并跳转到InitBoot处开始执行,InitBoot会读GPIO8487的值,当值全为1后,判断为Flash启动方式。然后会跳到0X33FFF6处执行。在 CCS5.2工程的 cmd 文件中有如下代码:MEMORY1PAGE 0 :BEGINhere: origin = 0x33FFF6, length*/= 0x000002/* Boot to M0 will goSECTIONS.codestart: > BEGIN PAGE = 0.即表示把 codestart 段放到 0x33FFF6 位置处,文件“DSP2833x_CodeStartBranch.asm中有codestart 段的定义,实际上 codestart 段只是包含了一个跳转指令,是程序跳转到 _c_int00 处,一c_i nt00在boot.asm in RTS library中有定义,_c_in t00的代码最终会调用 c的ma in函数, 之后就是 main 函数的执行。附录6: Hex2000使用:CCS软件默认生成的是.out格式的文件,而很多应用场合往往需要的是纯二进制代码,TI提供了一个小工具 HEX2000 能帮助实现格式的转化,具体的说明还是请参看 TMS320C28x Assembly Lan guage Tools手册

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论