DSP28335—程序从flash复制到ram里的两种情况:部分复制和全部复制
dsp28335-的bootloder过程
一、28335的启动介绍TI支持很多种方式的boot,内部的ram(saram),flash,sci,但无论哪种启动都遵循下面的流程:而该流程中的reset,initboot,call selectbootmode, read i/o state, call boot loader这些步骤都是固化在芯片内的程序自己执行的,也就是说这些代码在出厂的时候已经在TI的芯片内。
(我们写的程序是从codestart出开始的,其代码在DSP2833x_CodeStartBranch.asm 内,其指定位置在CMD文件内定义。
下载到flash中时是在0x3f7ff6处,因为复位的时候指向的0x3fffc0,先执行固化的bootloader再跳转到0x3f7ff6。
下载到RAM中时是在0处。
因为不需执行bootloader。
)在28335中是一段的8k*16的read-only的memory,地址位于0x3fe000-0x3fffff,见下图:根据上面的流程图,详细的解释一下流程:1.在3fffc0到3fffff其实是放了中断向量表的地方:系统一开机当然是处于reset中断,因此直接跳至reset的地方执行(0x3fffc0)。
而这个地方的两个字节只是放了一条指令,就是跳至initboot函数,也就是3ff34c的地址执行bootloader。
.reset 与reset是不同的,一个在memory,一个在sections中。
.reset只包含一个32位的中断矢量,指向实时支持库rts2800_ml.lib 中的C编译器导引函数,即_c_int00子程序。
通常我们不用此块,而是另外创建分支指令指向开始代码。
如4中介绍。
2.在3ff34c的bootloader的程序,这里主要有initboot, 和SelectBootMode, 以及一些外设引导的函数。
SeleteBootMode根据芯片的硬件或软件设置来判断芯片该去哪里寻找程序入口,直接目的是如何找到main,然后执行应用程序。
DSP28335烧写方法
DSP28335—FLASH烧写的方法(2013-10-17 14:09:59)转载▼分类:学习交流标签:dsp文章来自:百度文库把烧写到RAM程序修改成烧写到FLASH的首先,希望大家明白一点,想把一个原来是烧写到DSP的片内RAM的程序修改成是烧写到DSP片内FLASH的程序,不仅仅是修改一个cmd文件就结束了,还需要做其他几个步骤,这里我重点强调一下。
第一步:把28335_RAM_lnk.cmd这个从project中移除,用右键选择28335_RAM_lnk.cmd 然后选delate。
第二步:右键选择project名称,然后选add file to project,然后出现浏览框,在\Code of TMS320F28335 CCS4\v120\DSP2833x_common\cmd这个子文件夹下,选择F28335.cmd,点OK,至此可以在project的文件列表内看到F28335.cmd被添加到project中。
第三步:在main()函数中添加如下语句MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart); InitFlash();上述两句话添加在InitPieVectTable();这句的下面的一行。
添加语句的时候,注意不要添加错了,每一个字母都要正确,括号也要用英文括号。
第四步:添加DSP2833x_MemCopy.c这个文件到project中,右键选择project名称,然后选add file to project,然后出现浏览框,找到\Code of TMS320F28335 CCS4\v120\DSP2833x_common\source文件夹中的DSP2833x_MemCopy.c这个文件,然后点OK。
第五步:编译,点rebuild,编译至少要保证没有ERROR,否则请检查一下在第三步操作的地方是不是有错误。
把DSP TMS320F28XXX的程序段从flash复制到ram中运行
一旦编译器生成的这些段,连接器会从各个源文件中取出这些段,并结合它们来创立一个输出文件。
连接器命令文件〔 d〕就是用来告诉连接器去哪里找这些段的。
初始化段必须分配到非易失性存储器,如flash/ ROM,当电源被撤除时,程序不会消失。
未初始化的段可以被分配到RAM中,因为它们是在代码执行期间被初始化的。
关于更多编译段和连接的信息,请参见:"TMS320C28* Assembly LanguageTools User’s Guide "(SPRU513) 和" the TMS320C28* Optimizing C/C++ piler User’s Guide"(SPRU514)。
仪器〔TI〕提供了多个例子显示如何使用器命令文件分配编译段。
其中一个就是"Running an Application from Internal Flash Memory on the TMS320F28** DSP "(SPRA958)。
此应用文档提供的例子,演示了使用基于RAM和Flash的工程的器命令文件。
3.软件:本应用文档相关的代码文件,包括修改后的版本的CodeStartBranch.asm文件和非DSP/BIOS™工程用的文件DSP28***_SectionCopy_nonBIOS.asm,由the C/C++ Header Files and Peripheral E*amples提供。
每个TMS320F28***处理器都提供了现成的连接器命令文件。
提供的例如工程演示了如何使用这些文件。
本应用文档以TMS320F2808为例。
该软件独立存放于F28***_Flash_to_Ram文件夹中。
代码使用的来自the C/C++ Header Files and Peripheral E*amples的几个文件,经过了Code poser Studio™ 3.3和F28***代码生成工具B3版本的测试。
F28335Flash烧写后程序不能正常运行的解决
F28335Flash烧写后程序不能正常运行的解决将F28335的程序烧写至flash运行,发现当程序简单时烧写至flash可以正常运行,后来不知道代码加了什么东西,固化代码运行时程序莫名地跑飞。
经过不断跟踪,发现是因为执行了DSP28x_usDelay()函数使程序跑飞。
仔细研究后,发现程序跑飞的原因是程序没有将定义在RAM中执行的代码从flash拷贝至RAM中。
搞清楚一下几点就可以解决问题:1) DSP28x_usDelay()在DSP2833x_usDelay.asm文件中定义,并且使用.sect "ramfuncs"命令分配到ramfuncs段;2) F28335.cmd中ramfuncs : LOAD = FLASHD,RUN = RAML0,LOAD_START(_RamfuncsLoadStart), /*定义ramfuncs sectiond 的起始加载地址*/LOAD_END(_RamfuncsLoadEnd), /*定义ramfuncs sectiond的终止加载地址*/RUN_START(_RamfuncsRunStart), /*定义ramfuncs sectiond 的起始执行地址*/PAGE = 0ramfuncs定义为从FLASHD中load,并在RAML0执行。
3)在DSP2833x_GlobalPrototypes.h中,声明了上述三个地址:extern Uint16 RamfuncsLoadStart;extern Uint16 RamfuncsLoadEnd;extern Uint16 RamfuncsRunStart;4)若只有以上三段定义,并未将flash中的ramfuncs段拷贝值RAM中执行,程序固化后依然不能正常运行。
需要在芯片初始化后,且在执行ramfuncs段函数之前将flash中的代码拷贝至RAM中执行。
即执行:MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);添加代码拷贝函数后,固化程序,重新上电,发现程序固化成功且执行正常!参考:dsp-将flash中的函数拷贝到ram中运行, /zoyaforever/blog/item/2591e5667123f 521ab184ccc.htmlC2000系列DSP Flash烧写解决方案总集, /code/viewthread.php?tid=68079。
基于TMS320F28335的程序从FLASH到RAM的移植与运行
法程序的运行是 需要 DS P在 上 电时将这部分代码搬移到 片上 R M 内并在 R M 内运行.本文分析 了 T 3 0 2 3 5DS A A MS 2 F 8 3 P
a o i m r ga whc e n sra— mers o s s e d d t o y tec d M rm L H a d r ni M. hs l r h p o rm ih d ma d e l i ep n ei n e e c p h o e t R g t t o oA f o F AS n R u nA Ti
第 2 卷 第 4期 4
2 1年 1 月 01 2
湖南理工学院学报( 然科学版) 自
Jun l f u a stt o Sine n eh ooy( trl cecs orao H nnI tue f c c dTcn lg Na aSine) ni e a u
V0 .4NO 4 I . 2 De . 0 1 c 2 1
,
Hale Waihona Puke ( . l g fn oma o n C mmu i t nE gn e ig H n nI s tt o S i c n e h oo y Y e a g 4 4 0 , hn ; 1 Co e e Ifr t na d o l o i nc i n ie r , u a n t ue f c n e dT c n lg , u y n , 1 0 6 C ia ao n i e a 2 C ar nE e t nc o L do Y e a g Y e a g 4 4 0 ) . hi ma l r is . t f u y n , u y n , 1 0 0 co C
基于TMS320F28335的DSPBIOS系统从FLASH到RAM运行
基于TMS320F28335的DSP/BIOS系统从FLASH到RAM运行作者:陈惠纲黎驱来源:《现代电子技术》2015年第02期摘 ;要: DSP/BIOS是TMS320F28xxx系列DSP上的一个实时操作系统内核。
由于TMS320F28335内部FLASH性能的限制,当DSP/BIOS系统直接在芯片内FLASH上运行时,程序运行的速度往往比在RAM上运行时慢得多,严重影响了DSP/BIOS的实时性。
为了解决这个问题,通过分析TMS320F28335的启动过程和程序从FLASH搬移到RAM上运行的一般流程,以及DSP/BIOS与非DSP/BIOS工程的Memory Sections特点,提出一种通过在c_int00之前增加Copy_Sections等一系列操作对DSP/BIOS系统及用户程序进行搬移的方法。
由此实现在芯片启动后自动把DSP/BIOS系统从片内FLASH搬移到RAM上运行的功能,从而提高DSP/BIOS系统的运行效率和实时性。
该方法已经通过实验验证并在实际的工程项目中应用,获得良好的效果,因此值得推广。
关键词:TMS320F28335; DSP/BIOS; FLASH; RAM; 程序搬移中图分类号: TN919⁃34; TP311.1 ; ; ; ; ; ; ; ; 文献标识码: A ; ; ; ; ; ; ; ; ; ;文章编号:1004⁃373X(2015)02⁃0065⁃04TMS320F28335⁃based DSP/BIOS system running from FLASH to RAMCHEN Hui⁃gang, LI Qu(Guangdong Co., Ltd., HM Power, Foshan 528300, China)Abstract: DSP/BIOS is a Real⁃time operating system kernel on DSP of TMS320F28xxx series. When DSP/BIOS system runs directly in the on⁃chip FLASH, the DSP/BIOS system would be much slower than it runs in RAM because of the performance limitation of FLASH inTMS320F28335,which affects the DSP/BIOS’s real⁃time performance seriously. To solve the problem, By analyzing the start⁃up procedure of TMS320F28335 and the procedure of moving a program from FLASH to RAM, and the Memory Sections features of DSP/BIOS and noneDSP/BIOS, a method to add a function named Copy_Sections before c_int00 to copy DSP/BIOS system and user program from FLASH to RAM is proposed in this paper. By doing this, the Function that DSP/BIOS system is automatically copied from on⁃chip FLASH to RAM after reset or power on the DSP is realized, which improves the efficiency of DSP/BIOS system and its real⁃time performance. This method was validated by experiment and used in practical project.Keywords: TMS320F28335; DSP/BIOS; FLASH; RAM; program copy0 ;引 ;言TMS320F28335基于C28x+FPU 的控制器和 TI 现有的 C28xDSC具有相同的 32 位定点架构,还包括一个单精度(32 位)的 IEEE 754 浮点单元(FPU)[1]。
基于TMS320F28335的程序从FLASH到RAM的移植与运行
基于TMS320F28335的程序从FLASH到RAM的移植与运行杨宣兵;陈明;彭义【摘要】The user's code runs in TMS320F28335 DSP much slower in the on-chip FLASH than does in RAM. Some algorithm program which demands real-time response is needed to copy the code to RAM from FLASH and run in RAM. This paper analyzes the application program process running in TMS320F28335 DSP arid the process which copy code from FLASH to RAM. We implemented the application program run automatically on power based on TMS320F28335 DSP on power.%在TMS320F28335DSP里,代码在片上FLASH内运行比在RAM内运行慢得多,因此对于实时性要求高的算法程序的运行是需要DSP在上电时将这部分代码搬移到片上RAM内并在RAM内运行.本文分析了TMS320F28335DSP应用程序运行流程以及代码从FLASH到RAM的搬移过程,并实现了基于TMS320F28335DSP 的2DPSK调制与解调的上电自动运行.【期刊名称】《湖南理工学院学报(自然科学版)》【年(卷),期】2011(024)004【总页数】3页(P33-35)【关键词】TMS320F28335;FLASH;DSP程序移植【作者】杨宣兵;陈明;彭义【作者单位】湖南理工学院信息与通信工程学院,湖南岳阳414006;岳阳千盟电子公司,湖南岳阳414000;岳阳千盟电子公司,湖南岳阳414000【正文语种】中文【中图分类】TP911.72引言TI 公司的TMS320F28335 DSP具有32位TMS320C28X CPU和FPU处理器, 片上FLASH、SARAM以及外设相比 TMS320F2812有了进一步的扩展和增强, 它是目前控制领域中的先进处理器, 在电机控制、变频器、不间断电源以及电力线通信等系统中应用越来越广泛. 一般而言, DSP系统工作过程为: 通过AD采样外部信号, DSP对AD采样数据完成实时信号处理, 一般包括数字滤波、FFT运算等, 同时根据运算的结果产生控制信号. 在系统设计完成后, 程序需要固化在片上 FLASH, 一般而言, CPU对FLASH的访问至少需要5个以上的等待周期, 这在实际的实时处理系统中是绝对不允许的, 因此需要系统在上电时通过TI 的Bootloader将固化在片上FLASH上的程序加载到RAM中并在RAM中运行, 实现零等待, 使代码运行最有效率. 本文分析代码运行过程, 实现将片上FLASH中应用程序加载到片上RAM中运行方法.1 系统运行流程分析在进行软件设计之前, 首先要了解TMS320F28335 DSP运行过程. 当系统上电复位后, 程序到复位向量0x3FFFC0位置开始程序执行, 在复位向量处根据向量内容跳转到片上ROM里面的Boot ROM位置执行初始化引导函数InitBoot, InitBoot 完成对芯片的初始化, 并调用模式选择函数SelectBootMode来确定引导模式, 选择Jump to FLASH模式. 程序退出BOOT转向FLASH中0x33FFF6处执行程序,用户需要在0x33FFF6开始程序的设计. 系统从复位开始到转向FLASH过程如图1所示.图1 系统从上电到FLASH入口流程在开发基于TMS320F28335 DSP应用系统时, 在开发调试阶段用户程序加载和执行都在RAM中, 用户代码执行流程如图2所示.图2 程序调试阶段运行流程在应用程序调试成功后, 将程序固化在FLASH, 在上电时将FLASH中程序加载RAM, 并在RAM中运行. 用户代码执行流程如图3所示.图3 程序加载运行流程2 代码搬移实现方法2.1 代码搬移分析在DSP2833x_CodeStartBranch.asm模块中包含了code_start和wd_disable 流程. 上电后code_start流程应加载到存储空间的0x33FFF6 FLASH处, 在此处安排跳转指令到wd_disable流程, 完成watchdog的禁止, 然后调用copy_sections 函数完成用户应用程序代码从FLASH到RAM的移植过程. 因此code_start,wd_disable和copy_sections要求在加载和运行于FLASH中. 需要将DSP2833x_CodeStartBranch.asm模板代码作相应调整, 主要表现为以下几点:① 将code_start流程中LB _c_int00修改为LB copy_sections;② 将wd_disable流程中 .text 修改为.sect “wddisable”, 主要原因是.text段会移植到RAM中运行, 而wd_disable流程必须代码搬移之前执行, 因此必须在FLASH中执行, 将自定义已初始化段wddisable加载和运行定位于FLASH中;③ 将wd_disable流程中LB _c_int00修改为LB copy_sections;④ 需要将sectionCopy.asm模块添加到工程中来, 至此完成代码搬移代码的准备工作;⑤ 因为系统调试完毕, 所以可执行代码都应该加载在 FLASH, 此时需要将DSP2833x_usDelay.asm模块中_DSP28x_usDelay子程序加载和运行在“ramfuncs”段修改为加载在FLASH中, 而运行在RAM中,即将 .sect “ramfuncs” 修改为 .text 就行;⑥ 因为FLASH的配置函数InitFlash( )必须加载和固化在FLASH, 而运行必须在RAM中, 因此可以将模块DSP2833x_SysCtrl.c的pragmaCODE_SECTION(InitFlash, “ramfuncs”)去掉, 即直接把此函数定位在.text段, 而在系统上电时把.text段搬移到片内RAM中执行.2.2 CMD文件修改CMD文件完成存储空间的配置并告诉链接器将输出段链接到物理存储器的位置, 指定各输出段的加载和运行地址. 下面是 MEMORY部分几个重要的区域, 主要完成程序的固化, 加载和运行. 下面给出链接器命令文件(.cmd文件)的存储器配置命令MEMORY和输出段加载和运行定位命令SECTIONS的部分内容如下:因为在用户代码从 FLASH搬移到片内 RAM 之前, 程序的运行必须在非易失性存储器(即TMS320F28335 DSP的FLASH ), 因此codestart、wddisable以及copysections必须加载和运行于FLASH中, 其他的已初始化段加载在FLASH中而运行在片上RAM中, 因此对这些段的加载和运行必须指定不同的存储空间, 如上面给出的F28335_nonBIOS_flash.cmd文件中.text段所示.2.3 软件测试我们在开发基于DSP的无线感应通信器项目中, 首先完成软件在RAM中仿真调试, 然后将2DPSK调制的DSP应用程序烧写到FLASH, 断开仿真器与DSP硬件系统的连接, 将DSP系统上电, 系统自动完成应用程序上电启动和向RAM的搬移并在片内RAM中运行, 通过示波器观察调制信号输出与调试阶段一致, 达到相应要求.3 结束语本文给出了TMS320F28335 DSP应用程序在片内RAM高速运行的移植方法, 并在项目开发中验证了方法的可行性, 在实际项目开发的后期阶段具有重要的实际意义. 另外, 也要注意, 如果应用程序较大,片内RAM空间除去作为数据存储空间外, 不足以把所有的应用程序从FLASH移植到片内的RAM, 就可以考虑将适时性要求较高的代码进行移植运行, 或者外部扩展高速的片外RAM.参考文献[1]宁改娣. DSP控制器原理及应用[M]. 第2版. 北京: 科学出版社, 2009[2]TI. TMS320x2833x, 2823x BOOT ROM Reference Guide(Literature Number: SPRU963A),2007-Revised 2008[3]TI. Copying Compiler Sections From Flash to RAM on the TMS320F28xxx DSCs(Literature Number: SPRAAU8), 2008[4]孙中禹. 数字信号处理器TMS320F2812的片内FLASH应用程序设计[J]. 电子元器件应用, 2009(12): 28~30。
DSPTMS320FF28335程序从FLASH中拷贝到RAM中的两种方法及FLASH烧写方法
DSPTMS320FF28335程序从FLASH中拷贝到RAM中的两种方法及FLASH烧写方法程序从FLASH中拷贝到RAM中执行的方法DSP的程序下载执行方式有两种:一种是下载到RAM中在线执行,一种是下载到FLASH中执行。
在RAM中执行时,具有执行速度快,可以无限次下载的特点,但是RAM的特点是掉电丢失数据。
FLASH具有掉电不丢失数据的特点,但是同时存在执行速度慢和擦写次数有限的缺点。
因此综合两者的特点,在DSP的开发过程中一般会结合使用两者。
在前期程序调试过程,由于需要频繁的擦写,所以一般选择在RAM中进行。
而程序调试完成后,由于需要脱离下载器而独立执行,因此需要烧写到掉电不丢失数据的FLASH中。
下面将以利用CCS5.2对TMS320F28335进行程序在FLASH中的烧写为例,介绍一下将程序烧写到FLASH中的操作过程。
程序从在RAM中执行改为下载到FLASH中需要对工程文件做一些修改。
而程序烧写到FLASH中后,又根据程序执行时的存储区间的不同,分为程序部分拷贝到RAM中执行和程序整体拷贝到RAM中执行两种,两种执行需要对工程作不同的修改和设置。
一、程序部分拷贝到RAM中执行一般当程序过大,大于DSP的RAM空间或者对程序执行的速率要求不高时,一般将程序下载到FLASH中执行,并且上电后程序在FLASH中执行,仅仅将个别对时间要求比较高的程序拷贝到RAM中去执行。
此时需要作如下修改:1、首先删除掉工程文件中的28335_RAM_link.cmd文件,改为F28335.cmd文件。
如果在自己原来的工程中有对28335_RAM_link.cmd的存储区有特殊修改,可以在F28335.cmd中作同样的修改(仅限于不包括FLASH存储区的部分)。
2、在工程文件中加入文件DSP2833x_MemCopy.c,该文件提供代码赋值的函数。
3、在SECTION中定义ramfuncs段如下所示。
段中定义程序下载的区间LOAD(自己指定)、执行的区间RUN(自己指定)、下载开始地址、下载结束地址、执行开始地址(不用改)。
TMS320F28XXX_DSP上实现从flash拷贝到ram运行的方法
在TMS320F28XXX DSP上实现从flash拷贝整个程序到ram运行的方法1. 前言TMS320F28XXX DSP 里,代码从内部flash里运行,比从内部RAM里运行要慢30%左右,所以对运行时间苛刻的程序直接在flash里运行,往往不能满足要求。
故而,需要将代码拷贝到RAM以提高运行速度。
TI文档只提供了部分代码从flash拷贝到RAM中的方法。
然而,在一些应用中,需要将整个代码段都拷贝到RAM中执行,以提高整体运行速度。
本文通过对TMS320F28XXX 的启动代码研究,来探讨如何在从FLASH启动后将整个代码段拷贝到RAM 中,然后在RAM中运行的方法。
2. F28XXX 启动过程F28XXX启动代码固化在内部ROM中。
当F28XXX上电或者热复位后,首先由芯片本身将一些寄存器初始化:PIE disabled(ENPIE=0,VMAP=1,OBJMDE=0,AMODE=0,MOM1MAP=1),然后dsp会对XMPNMC管脚采样,根据采样值的高低,来决定启动模式是“微处理器模式”还是“微计算机模式”。
当XMPNMC=0时,为“微计算机模式”,此时,启动ROM存储器被使能而XINTF Zone 7被禁止。
复位向量从内部启动ROM获取,启动ROM在复位期间一直被使能。
启动ROM里的复位向量(位于0x3FFFC0)指向InitBoot函数(位于0x3FFC00)。
在完成器件初始化(InitBoot)之后,Boot loader将检查GPIO管脚的状态,然后再决定选用的启动模式。
启动模式有4种:跳转到flash,跳转到H0 SARAM,跳转到OTP或者调用片上启动程序。
InitBoot Function 所做工作有:1.初始化状态寄存器;2.将堆栈指针设为0x400;3.读CSM密码保护部分;4.调用SelectBootMode;5.调用ExitBoot在完成选择启动模式过程之后,根据选择的启动模式,dsp会跳到相应的启动入口。
TMS320F28335 程序无法从Flash加载—常见问题解决方法
Flash无法加载程序—常见问题解决方法开发记录人:ah_thunder Email:feilenker@ 最近几天突然发现TMS320F28335遇到了一个问题,即在仿真状态下(仿真器XDS510-USB2.0)程序能在RAM中正常运行,但写入到FLASH中后程序运行不正常。
出现上述象现,我们要分析:是程序没有烧写到Flash里面,还是程序从Flash加载时失败。
花了点时间看了以前做的TMS320F2812的开发记录,发现应该是后一个问题:即程序从Flash 加载时不成功。
1、D SP程序写入到FLASH中,当上电复位后程序从Flash加载不成功,主要有如下几个方面的原因:l CMD文件配置错误l编译选项不正确l FLASH寄存器配置不正确l定义了在RAM中运行的函数,但在调用函数之前没有将其复制到RAM中,使程序跑飞。
2、解决办法:2.1 CMD文件配置错误:首先我这个程序刚开始时在Flash里面运行正常,经过一段时间开发后,代码增长了,但是配置文件没有修改,所以应该不是这个问题。
并且我们一般会采用TI官方使用CMD文件(经过自己的局部修改不会有错)。
2.2编译选项不正确:这也是从网络上得到,我自己没有遇到过。
且放在这里,作以后查询。
在编译选项中有一个优化等级的配置选项(上图的红色圈内的),如果你的程序不能运行你可以将他设置为None,即为不优化,设置好后保存,再重新编译你的工程,再将程序写入到FLASH 中看看能不能运行。
2.3FLASH寄存器配置不正确这种可能性很少,我们一般使用TI公司的头文件(只要局部添加自己要定义的一些结构体、全局变量、函数)我相信就不会出现这问题,TI的默认配置就可以正常运行。
只是默认配置时,运行速度较慢,如果想提高运行速度应该自己在InitFlash()这个函数中自己重新配置。
2.4定义在RAM中的函数,在调用它之前,没有使用MemCopy把其从Flash里面复制到RAM里面,致使程序跑飞了。
DSP28335烧写方法剖析
DSP28335—FLASH烧写的方法(2013-10-17 14:09:59)转载▼分类:学习交流标签:dsp文章来自:百度文库把烧写到RAM程序修改成烧写到FLASH的首先,希望大家明白一点,想把一个原来是烧写到DSP的片内RAM的程序修改成是烧写到DSP片内FLASH的程序,不仅仅是修改一个cmd文件就结束了,还需要做其他几个步骤,这里我重点强调一下。
第一步:把28335_RAM_lnk.cmd这个从project中移除,用右键选择28335_RAM_lnk.cmd 然后选delate。
第二步:右键选择project名称,然后选add file to project,然后出现浏览框,在\Code of TMS320F28335 CCS4\v120\DSP2833x_common\cmd这个子文件夹下,选择F28335.cmd,点OK,至此可以在project的文件列表内看到F28335.cmd被添加到project中。
第三步:在main()函数中添加如下语句MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart); InitFlash();上述两句话添加在InitPieVectTable();这句的下面的一行。
添加语句的时候,注意不要添加错了,每一个字母都要正确,括号也要用英文括号。
第四步:添加DSP2833x_MemCopy.c这个文件到project中,右键选择project名称,然后选add file to project,然后出现浏览框,找到\Code of TMS320F28335 CCS4\v120\DSP2833x_common\source文件夹中的DSP2833x_MemCopy.c这个文件,然后点OK。
第五步:编译,点rebuild,编译至少要保证没有ERROR,否则请检查一下在第三步操作的地方是不是有错误。
我的首个DSP (TMS320F28335) LED灯闪烁 项目实验 总结
买视频资料、买书、买开发板(F28335)、各种版本开发环境安装,导入工程、创建工程、了解controlSUITE,终于创建了一个工程,且是按照自己的意愿将代码在开发板上跑起来,现总结如下:实验目的:将开发板上可控的两个LED灯LD3、LD4实现交替闪烁,并在RAM中仿真实验;实验步骤:1、创建工程、且包含main.c文件按照上面的五步操作,然后点击【finish】。
遇到的问题:在第四步如果设置新的工作空间文件夹,在点击【finish】后,应实际的去工作空间文件夹下去看一下,是否确实创建好了。
建议:在点击完【finish】后,项目框架基本创建完成,然后关闭CCS,再次进去看看是否直接进入刚刚创建好的工程。
如果不能最好分析一下原因,重建一次。
我在这里反复了3次,也就是重建3次才成功。
如果可以进入,进入后面的步骤。
2、复制controlSUITE下C:\ti\controlSUITE\device_support\f2833x下面的DSP2833x_common和DSP2833x_headers两个文件夹到所创建的工程目录;复制完成后最好仔细浏览一下每个目录下都有哪些文件。
3、在项目的属性设置对话框中设置include路径如下:4、在main.c添加如下头文件:#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_Examples.h" // DSP2833x Examples Include File5、这是可以编译一下,肯定会出错,需要删除一些文件。
如下以上红圈内的文件全部删除6、然后再编译一下,看看有什么问题就自己处理吧,呵呵。
7、现在已经有了基本的函数库、头文件,剩下就是实现LED灯的控制了。
代码如下:#include"DSP2833x_Device.h"// DSP2833x Headerfile Include File#include"DSP2833x_Examples.h"// DSP2833x Examples Include File#define LD3_ON() GpioDataRegs.GPACLEAR.bit.GPIO0 = 1#define LD3_OFF() GpioDataRegs.GPASET.bit.GPIO0 = 1#define LD4_ON() GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1#define LD4_OFF() GpioDataRegs.GPBSET.bit.GPIO34 = 1/** main.c*/int main(void) {InitSysCtrl();DINT;IER = 0x0000;IFR = 0x0000;InitPieCtrl();InitPieVectTable();InitGpio();EALLOW; //这里是DSP对寄存器的安全访问控制成对出现//引脚工作在IO模式GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;// 0 gpio modeGpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;// 0 gpio mode//IO引脚方向设置GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;//1 output 0 inputGpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;//1 output 0 input//IO引脚上下拉设置GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;//1 enable pullup 0 disable pullupGpioCtrlRegs.GPBPUD.bit.GPIO34 = 0;//1 enable pullup 0 disable pullup EDIS; //这里是DSP对寄存器的安全访问控制while(1){EALLOW;LD3_ON();LD4_OFF();EDIS;//delay functionEALLOW;LD3_OFF();LD4_ON();EDIS;//delay function}}。
DSP28335—程序从flash复制到ram里的两种情况:部分复制和全部复制
1、参考博文:DSP28335—把TMS320F28XXX的程序段从flash复制到ram中运行/doc/8b15326153.html,/s/blog_762cf5f80101apfx.html
2、参考论文《基于DSP28335程序移植方法的研究与实现》有助于理解系统启动过程及FLASH引导模式
void InitFlash(void)
{
//函数内容省略,可参考TI提供的函数即可
}
4、在主函数中执行调用以下函数
MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd, &RamfuncsRunStart);的中断函数在flash上电初始化时自动搬运到RAM中运行。
DSP28335—程序从flash复制到ram里的两种情况:部分复制和全部复制
DSP28335—程序从flash复制到ram里的两种情况:部分复制和全部复制
众所周知,微处理器从内存RAM中取指令的速度要比从flash中取指令要快好多倍,但是RAM的缺陷限制了其不能存储用户程序代码,因为RAM掉电会丢失数据,但是其速度要快,而flash内信息掉电不丢失,因此可以保存用户编程的代码,但是其运算速度使得在一些实时性要求高或者对时间要求苛刻的场合不能满足要求。如果能够将两者有机的结合到一起,从而可以解决这两者之间的矛盾。
2、定义变量(装载或运行的起始地址)
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
3、把要拷贝到RAM里的函数(eva_timer1_isr,eva_timer2_isr...)定义到段ramfuncs
dspf28335启动过程
dspf28335启动过程1.DSP reset后运行的起始地址是多少?0x3FFFC02.仿真器烧写程序的步骤是?根据cmd文件把程序烧到指定位置,然后执行。
3.DSP的Flash启动过程是什么?首先硬件配置GPIO84~87上拉为1,即处于Flash启动过程。
当DSP复位后,会从复位向量0x3FFFC0处取得复位向量,并跳转到InitBoot处开始执行,InitBoot会读GPIO84~87的值发现全为1判断为Flash启动方式。
然后会跳到0x33FFF6处执行。
在CCS5.2工程的cmd文件中有如下代码:MEMORY{PAGE 0 :BEGIN : origin = 0x33FFF6, length = 0x000002 /* Boot to M0 will go here */...}SECTIONS{...codestart : > BEGIN PAGE = 0...}即表示把codestart段放到0x33FFF6位置处,文件“DSP2833x_CodeStartBranch.asm”中有codestart段的定义,实际上codestart段只是包含了一个跳转指令,是程序跳转到_c_int00处,_c_int00在boot.asm in RTS library中有定义,_c_int00的代码最终会调用c的main 函数,之后就是main函数的执行。
总的就是:Reset(0x3fffc0)—>initBoot()—>判断启动方式—>codestart(0x33fff6)—>_c_int00—>main函数4.F28335如何烧写代码到flash中并运行?首先使用添加C:\ti\controlSUITE\device_support\f2833x\v133\DSP2833x_com mon\cmd\F28335.cmd。
此文件即为配置代码到flash中的TI官方配置文件。
DSP28335—CMD文件解读(映射关系)
DSP28335—CMD⽂件解读(映射关系)DSP28335—CMD解读(1)在DSP28335⼯程⽂件⾥(不⽤BIOS产⽣CMD⽂件),⼿写CMD⽂件⼀般有两个,在RAM⾥调试时⽤的两个CMD⽂件分别为DSP2833x_Headers_nonBIOS.cmd和28335_RAM_lnk.cmd,烧写到flash⾥时⽤的两个CMD⽂件分别为DSP2833x_Headers_nonBIOS.cmd和F28335.cmd,其中DSP2833x_Headers_nonBIOS.cmd⽂件可以在所有⼯程⽂件中通⽤,主要作⽤是把外设寄存器产⽣的数据段映射到对应的存储空间,可以跟DSP2833x_GlobalVariableDefs.c⽂件对照⼀下看看。
下⾯通过⼀个简单例⼦,⽐如向CpuTimer0Regs. TIM.all写数据,来解读⼀下CMD⽂件是如何把寄存器⾥的值准确映射到所在存储器的位置的。
先在DSP2833x_GlobalVariableDefs.c⽂件⾥找到以下⼏⾏代码:#ifdef __cplusplus#pragma DATA_SECTION("CpuTimer0RegsFile")#else#pragma DATA_SECTION(CpuTimer0Regs,"CpuTimer0RegsFile");#endifvolatile struct CPUTIMER_REGS CpuTimer0Regs;由上可知CpuTimer0Regs是⼀个结构体变量名(其定义在DSP2833x_CpuTimers.c⽂件⾥),通过预处理命令#pragma 为这个结构体定义了⼀个名称为CpuTimer0RegsFile的数据段。
接着在DSP2833x_Headers_nonBIOS.cmd⽂件⾥找到如下代码:SECTIONS{PieVectTableFile : > PIE_VECT, PAGE = 1DevEmuRegsFile : > DEV_EMU, PAGE = 1FlashRegsFile : > FLASH_REGS, PAGE = 1CsmRegsFile : > CSM, PAGE = 1AdcMirrorFile : > ADC_MIRROR, PAGE = 1XintfRegsFile : > XINTF, PAGE = 1CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1......}红字体代码的作⽤就是,通过SECTIONS伪指令把CpuTimer0RegsFile数据段装载到名称为CPU_TIMER0的存储空间。
DSP28335烧写FLASH程序可以在线仿真无法离线运行
DSP28335烧写FLASH程序可以在线仿真⽆法离线运⾏⼀般来说,把⼀个在RAM⾥正常运⾏的程序移植到FLASH⾥(运⾏时将FLASH中的程序拷贝到RAM中运⾏)的步骤如下:1.需要将适合RAM运⾏环境的CMD⽂件移出⼯程,替换成FLASH专⽤的的F28335.cmd2.将另⼀个⽂件DSP2833x_CodeStartBranch.asm添加到⼯程中,如果⼯程内本来就有这个⽂件,就不⽤再添加了3.在DSP28_SysCtrl.c⽂件中添加如下代码,如果⼯程⾥已有InitFlash函数,则不⽤再添加,检查下函数内容即可1#pragma CODE_SECTION(InitFlash, "RamFuncs");23void InitFlash(void)45 {67 EALLOW;89//Enable Flash Pipeline mode to improve performance1011//of code executed from Flash.1213 FlashRegs.FOPT.bit.ENPIPE = 1;1415// CAUTION1617//Minimum waitstates required for the flash operating1819//at a given CPU rate must be characterized by TI.2021//Refer to the datasheet for the latest information.22232425//Set the Paged Waitstate for the Flash2627 FlashRegs.FBANKWAIT.bit.PAGEWAIT = 5;28293031//Set the Random Waitstate for the Flash3233 FlashRegs.FBANKWAIT.bit.RANDWAIT = 5;34353637//Set the Waitstate for the OTP3839 FlashRegs.FOTPWAIT.bit.OTPWAIT = 8;40414243// CAUTION4445//ONLY THE DEFAULT VALUE FOR THESE 2 REGISTERS SHOULD BE USED4647 FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF;4849 FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF;5051 EDIS;52535455//Force a pipeline flush to ensure that the write to5657//the last register configured occurs before returning.58596061 asm(" RPT #7 || NOP");6263 }4.在main函数所在的源⽂件中,添加下⾯所⽰的代码,位置可以放在main函数之前1extern Uint16 RamFuncs_loadstart;23extern Uint16 RamFuncs_loadend;45extern Uint16 RamFuncs_runstart;5.在main函数中添加如下以红⾊字体显⽰的代码1/*初始化系统*/23 InitSysCtrl();45 memcpy(&RamFuncs_runstart,&RamFuncs_loadstart,&RamFuncs_loadend - &RamFuncs_loadstart);67 asm(" RPT #8 || NOP");891011 /*FLASH 初始化 */1213 InitFlash();14151617/*关中断*/1819 DINT;2021 IER = 0x0000;2223 IFR = 0x0000;6.在头⽂件DSP2833x_GlobalPrototypes.h中添加FLASH初始化函数的声明,如果已经声明,就不⽤再添加1extern void InitFlash(void);//7.验证Boot mode //通常已经正确选择//DSP开发板上的拨码开关都拨到ON,本质含义是:将F28335的GPIO84、GPIO85、GPIO86、GPIO87这四个引脚⽤1k到10k之间电阻上拉到3.3V,这样就把Boot mode选为从DSP内部FLASH处boot程序的模式;通常,上述步骤完成之后,在编译没有报错的情况下直接Debug即可将程序烧写进FLASH,之后断电,拔掉仿真器,再重新上电,程序即可⾃动运⾏。
我的首个DSP (TMS320F28335) LED灯闪烁 项目实验 总结知识讲解
买视频资料、买书、买开发板(F28335)、各种版本开发环境安装,导入工程、创建工程、了解controlSUITE,终于创建了一个工程,且是按照自己的意愿将代码在开发板上跑起来,现总结如下:实验目的:将开发板上可控的两个LED灯LD3、LD4实现交替闪烁,并在RAM中仿真实验;实验步骤:1、创建工程、且包含main.c文件按照上面的五步操作,然后点击【finish】。
word可编辑遇到的问题:在第四步如果设置新的工作空间文件夹,在点击【finish】后,应实际的去工作空间文件夹下去看一下,是否确实创建好了。
建议:在点击完【finish】后,项目框架基本创建完成,然后关闭CCS,再次进去看看是否直接进入刚刚创建好的工程。
如果不能最好分析一下原因,重建一次。
我在这里反复了3次,也就是重建3次才成功。
如果可以进入,进入后面的步骤。
2、复制controlSUITE下C:\ti\controlSUITE\device_support\f2833x下面的DSP2833x_common和DSP2833x_headers两个文件夹到所创建的工程目录;复制完成后最好仔细浏览一下每个目录下都有哪些文件。
3、在项目的属性设置对话框中设置include路径如下:word可编辑4、在main.c添加如下头文件:#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File#include "DSP2833x_Examples.h" // DSP2833x Examples Include File word可编辑5、这是可以编译一下,肯定会出错,需要删除一些文件。
如下以上红圈内的文件全部删除6、然后再编译一下,看看有什么问题就自己处理吧,呵呵。
7、现在已经有了基本的函数库、头文件,剩下就是实现LED灯的控制了。
代码如下:word可编辑word可编辑#include"DSP2833x_Device.h"// DSP2833x Headerfile Include File#include"DSP2833x_Examples.h"// DSP2833x Examples Include File#define LD3_ON() GpioDataRegs.GPACLEAR.bit.GPIO0 = 1#define LD3_OFF() GpioDataRegs.GPASET.bit.GPIO0 = 1#define LD4_ON() GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1#define LD4_OFF() GpioDataRegs.GPBSET.bit.GPIO34 = 1/** main.c*/int main(void) {InitSysCtrl();DINT;IER = 0x0000;IFR = 0x0000;InitPieCtrl();InitPieVectTable();InitGpio();EALLOW; //这里是DSP对寄存器的安全访问控制成对出现//引脚工作在IO模式GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;// 0 gpio modeGpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;// 0 gpio mode//IO引脚方向设置word可编辑GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;//1 output 0 inputGpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;//1 output 0 input//IO引脚上下拉设置GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;//1 enable pullup 0 disable pullup GpioCtrlRegs.GPBPUD.bit.GPIO34 = 0;//1 enable pullup 0 disable pullup EDIS; //这里是DSP对寄存器的安全访问控制while(1){EALLOW;LD3_ON();LD4_OFF();EDIS;//delay functionEALLOW;LD3_OFF();word可编辑LD4_ON();EDIS;//delay function }}word可编辑。
DSP 学习系列三_F2812 flash搬移到RAM里运行
基于TMS320F2812 flash搬移到RAM里运行实现去年在论坛上了“28335 学习系列__FLASH 搬移到RAM 运行实现方法”之后,很多网友提问有没有F2812 FLASH 搬移到RAM 运行实现方法。
其实,TI 28系列DSP目前用的很广泛的,关于FLASH搬移到RAM里运行文章也很多,但还有很多人不清楚如何实现,说明这些资料当中很多讲解的不够透彻,或者讲了很多,但没有告诉大家如何去做,如何去实现搬移。
很多附件里面的程序,大部分是没法运行的程序。
另外,对于初学DSP的人来说,搬移也是很令人费神的,往往调试半天一天的,程序就是不搬,然后就灰心丧气,然后就觉得DSP让人头疼。
其实,DSP作为一个工具,它不像我们学的很多专业理论知识。
有时候我们不能正常使用DSP,问题往往在于一些很细节的地方,或者是操作失误等等。
在写了一个“F28335 学习系列__FLASH 搬移到RAM 运行实现方法”,之后网友也收到了很多网友的回复。
回复中网友提出了很多问题,我将其归为3大类:第一:关于FLASH搬移到RAM运行的方法比较问题;第二:如何判断程序已经从FLASH搬移到RAM中;第三:如何实现F2812 FLASH搬移到RAM里运行;对于第一问题,实现FLASH搬移到RAM主要有两种方法,一种是部分搬移,另一种是全部搬移。
部分搬移即将程序代码中部分函数放到RAM中运行,使用这种搬移方法,主要是考虑到程序代码比较多,而DSP RAM空间有限,当全部搬移运行时,可能会产生数据空间调用冲突问题,反而降低了程序执行效率。
全部搬移即将程序中代码段,初始化段,常量段,变量定义段等等全部搬移到RAM中运行。
二者主要区别在于,前者在mian函数里面操作,通过MEMRYCOPY函数,在CMD中增加“ramfuncs”段,只要程序中放在“ramfuncs”里面便可实现搬移。
后者在CMD里实现搬移配臵,将“.cinit ,.const,.econst,.pinit ,.switch,.text”全部配臵成搬移。
TMS320F28335谈程序在RAM FLASH 和外部RAM中运行的速度
以TMS320F28335芯片为例在内部RAM中程序能够,达到150MHZ,也即150MIPS.用下面这段程序测试:for(;;) |{ |GpioDataRegs.GPACLEAR.bit.GPIO0=1; |DSP28x_usDelay(29992);//29992*5+9个时钟周期 |总共300001个时钟周期GpioDataRegs.GPASET.bit.GPIO0=1; |DSP28x_usDelay(30000);//30000*5+9个时钟周期 |}在RAM中运行上面的程序能够正常,GPIO 的周期为500HZ在外部RAM中运行在外部RAM中最大能达到多少的速度呢?试一下,在28335中,XCLK=SYSCLK的时候。
设置XintfRegs.XTIMING7.bit.XRDLEAD = 1;XintfRegs.XTIMING7.bit.XRDACTIVE =2;XintfRegs.XTIMING7.bit.XRDTRAIL = 1;也就是说XINTF读取一个外部RAM中的数据要1+3+1个时钟周期,为5跑上面谈到的程序,GPIO的周期为100HZ,比在RAM中慢了5倍,因为RAM中读取一个数据只要1个时钟周期,外部RAM中读取要5个改变一下:XintfRegs.XTIMING7.bit.XRDLEAD = 1;XintfRegs.XTIMING7.bit.XRDACTIVE = 1;XintfRegs.XTIMING7.bit.XRDTRAIL = 0;也就是说XINTF读取一个外部RAM中的数据要1+2+0个时钟周期,为3跑上面谈到的程序,GPIO的周期为166.7HZ,899984时钟周期,因为RAM中读取一个数据只要1个时钟周期,外部RAM中读取要3个理论上在外部RAM中运行最快可以为75MHZ,但一般我们只能达到50MHZ,因为一般我们不能设置.XRDACTIVE 为0在FLASH中运行在FLASH中运行上面的程序,打开flash pipeline。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DSP28335—程序从flash复制到ram里的两种情况:部分复制和全部复制
众所周知,微处理器从内存RAM中取指令的速度要比从flash中取指令要快好多倍,但是RAM的缺陷限制了其不能存储用户程序代码,因为RAM掉电会丢失数据,但是其速度要快,而flash内信息掉电不丢失,因此可以保存用户编程的代码,但是其运算速度使得在一些实时性要求高或者对时间要求苛刻的场合不能满足要求。
如果能够将两者有机的结合到一起,从而可以解决这两者之间的矛盾。
从片内flash搬运到RAM中的方法有两种不同的选择,一种是将flash中部分代码搬运到RAM中运行;另一种便是将flash的所有程序代码都搬运到RAM中运行。
前者利用#pragma CODE_SECTION(cpu_timer0_isr, "ramfuncs");来声明将所要搬运的函数在flash上电初始化时自动将声明的函数搬运到RAM的ramfuncs段中,此方法也可以将所有的函数代码都搬运到RAM中,但是,这无疑有点麻烦,有多少个函数就需要写多少条这样的语句,而且也只是搬运了函数代码,其他的初始化数据段没有搬运,但是这种方法可以在用户程序太大以至于RAM中无法将所有代码都容纳下的情况下,将部分主要的要求时间苛刻的函数搬运到RAM 中运行以提高系统性能,例如一些中断函数。
第二种方法可以在用户编写代码都能被RAM所容纳下的情况下提高系统整体的性能,将flash代码全部搬运到RAM 中。
但是当代码不能被RAM所容纳时此方法编不在可行,只有硬件外扩RAM才行。
下面就介绍一下这两种方法的具体实现方法:
方法一:
1、cmd定义:
ramfuncs : LOAD = FLASHJ, PAGE = 0
RUN = RAMH0, PAGE = 0
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart)
2、定义变量(装载或运行的起始地址)
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
3、把要拷贝到RAM里的函数(eva_timer1_isr,eva_timer2_isr...)定义到段ramfuncs
#pragma CODE_SECTION(eva_timer1_isr, "ramfuncs");
#pragma CODE_SECTION(eva_timer2_isr, "ramfuncs");
#pragma CODE_SECTION(evb_timer3_isr, "ramfuncs");
// 声明中断函数
interrupt void eva_timer1_isr(void);
interrupt void eva_timer2_isr(void);
interrupt void evb_timer3_isr(void);
interrupt void evb_timer4_isr(void);
//初始化flash 控制寄存器函数为
void InitFlash(void)
{
//函数内容省略,可参考TI提供的函数即可
}
4、在主函数中执行调用以下函数
MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
至此便将声明的中断函数在flash上电初始化时自动搬运到RAM中运行。
方法二:
1、参考博文:DSP28335—把TMS320F28XXX的程序段从flash复制到ram中运行/s/blog_762cf5f80101apfx.html
2、参考论文《基于DSP28335程序移植方法的研究与实现》有助于理解系统启动过程及FLASH引导模式。