在TMS320F2812上实现从flash拷贝整个程序到RAM上运行的方法探讨
2008-04-10 15:35 htc开发 阅读(813) 评论(0) 编辑 收藏 举报在TMS320F 2812上实现从flash拷贝整个程序到RAM上运行的方法探讨
1. 前言
TMS
2. TMS320F 2812 启动过程
TMS
图1 2812内部BootRom地址图
CPU向量表位于北部ROM的底端(0x3FFFC0 ---- 0x3FFFF)。当VMAP=1,ENPIE=0 ,MPNMC=0时,该向量表被激活。复位向量出厂时被编程指向函数InitBoot。这个函数开始启动过程。当然,启动过程完成之后,我们需要初始化PIE中断向量表,同时使能PIE block。初始化PIE中断向量表之后,除了复位,所有中断向量均从PIE获得。
TMS
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(0x400 - 0x
在完成选择启动模式过程之后,根据选择的启动模式,dsp会跳到相应的启动入口。也可以自己选择启动入口。这些入口地址都在这之前已经被dsp定义好的。
如果从flash启动,那么我们的管脚状态应该是
GPIOF4 |
GPIOF12 |
GPIOF3 |
GPIOF2 |
|
(SCITXDA) |
(MDXA) |
(SPISTEA) |
(SPICLK) |
|
内部上拉 |
无内部上拉 |
无内部上拉 |
无内部上拉 |
Mode Selected |
1 |
x |
x |
x |
Jump to Flash address 0x |
下图为BootROM 函数的流程图
图2 BootROM 函数的流程图
对于内部flash启动,如图
图3跳转到Flash启动的流程图
在0x
3. 搬移思路
根据上节2的启动过程,flash启动过后,跳到0x
将“搬移程序”烧在flash上,从flash启动之后,“搬移程序”会被执行。“搬移程序”做的工作就是将“应用主程序”代码拷贝到内部RAM,然后经过初始化环境(InitBoot,ExitBoot),将PC指针指向RAM里代码首地址。这样,你的程序就在RAM中运行起来了。也就是说,我们需要一个“搬移程序”,启动时运行,用来拷贝flash上的代码到RAM中;当然,还需要一个你的“应用主程序”,该主程序被“搬移程序”从flash里“挪”到RAM后在RAM中运行。我们还要做的工作就是,把“应用主程序”烧写到flash里的某一块,这个块又不会影响flash启动时运行“搬移程序”。完成这个烧写过程的程序,我们称之为flash烧写程序。
总结一下,完成整个搬移过程,一共需要三个程序。“搬移程序”和“应用主程序”被固化到flash里“烧写flash程序”将“应用主程序”烧入flash中指定的块中。TI的烧写flash插件用来烧写“搬移程序”。
4. 搬移方法
1)首先你要用的主程序必须编译通过,并且通过仿真器在RAM里运行无问题。将主程序的CMD文件进行改写,保证程序段(.text段)分配在连续的存储空间。程序从flash启动,所有初始化段链接在非易失存储器里,而非初始化段必须链接在易失存储器。我们可以把初始化段都放在一个连续的内部RAM空间,而非初始化段放在另一个内部RAM空间。如果你的代码不是很大,也可以都放在连续的RAM空间。但在实际项目中,通常你会遇到存储空间不够的问题。这时就要考虑将无关紧要的段放在另外的非程序空间了。
.cinit |
Flash |
.cio |
RAM |
.const |
Flash |
.econst |
Flash |
.pinit |
Flash |
.switch |
Flash |
.text |
Flash |
.bss |
RAM |
.ebss |
RAM |
.stack |
Lower 64Kw RAM |
.sysmem |
RAM |
.esysmem |
RAM |
.reset |
RAM1 |
例如:
从上面的CMD可知,主程序代码均放在RAMH0中,长度为0x2000。
2)其次,将该工程编译成功后,加载到内部ram,仿真器自动完成必要的初始化环境之后,pc指针应该指向_c_init00,记下现在PC指针的位置,在Boot.asm中会用到。
3)自制一个flash烧写程序,或者从网上下载其他网友的flash烧写程序,将目标地址放在除flashJ块以外的块中。烧写的长度不能小于被烧写的主程序长度。该烧写程序在RAM中运行。,其代码段不能和被烧写的主程序用的代码段存储区域相同,否则会破坏主程序在ram中的代码。
烧写之后,可以用CCS的Save data功能,来查看flash中的数值是否和ram里主程序空间数值一致。
4) 用TI的烧写插件烧写“搬移程序”。注意,该“搬移程序”要能在dsp启动后执行。并且,烧写的时候,不能将上一步烧到flash上的主程序代码擦除。“搬移程序”具体见下节。
5. “搬移程序”具体实现方法
Boot.asm文件内容:
“搬移程序”部分代码: