2024年5月3日发(作者:)

交流和分享让思想变得丰富和活跃

基于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”全部配臵成搬移。相比之下,我更偏向于后者,因为

我们现写的程序不可能大到连DSP RAM 空间都放不下,另外部分搬移,RAM

和FLASH必须分别建立工程文件,因为main函数不一样。当然也可以使用同

一个工程文件,但更改烧写方式时,必须将更改CMD和mian函数,可能变程

序的人比较清楚,但换一个人来调试这个程序中,可能我往往会犯一些低级错误。

我们实验就有个,将烧写FLASH文件改成烧写SRAM方式时,将MAIN函数

中调用“MEMRYCOP”函数,给屏蔽掉。但悲剧发生了,他在屏蔽“MEMRYCOP”

函数时,不小心把程序中“GPIO_init()”函数也屏蔽了,而该函数对EPWM口

进行初始化,导致DSP上电后,EPWM始终没有波形,当时就纳闷了,之前还

好好的怎么就不行了,于是就调啊调啊,怀疑这个怀疑那个,最后把驱动芯片卸

了都不行,等找到问题后,欲哭无泪啊!举这个例子主要是说明部分搬移给程序

调试带来了不便,而全搬移仅仅需要一个工程文件,只要通过更改CMD文件,

便可实现互换RAM和flash烧写。因为不需要修改源文件,所以程序出错可能

1

交流和分享让思想变得丰富和活跃

几乎为0,并且CMD更改不对的话,程序是不会烧写成功的,从而可以避免因

修改失误而带来的隐患问题。

对于第二个问题,判断程序是否搬移到RAM方法很简单,你用一个GPIO

口,在程序某处让该GPIO口清„0‟,在另一处将该GPIO口臵„1‟。这样可以GPIO

输出为方波信号,且低电平时间为之间代码运行时间。首先在RAM里面运行,

观察该方波周期以及低电平时间;然后再在搬移后程序中运行,仍然观察该方波

周期以及低电平时间。比较二者时间大小。若近似相等,则搬移成功;若后者比

前者大的多,说明程序还在FLASH里面运行。

对于第三个问题,也是我写这篇文章需要解决的,之前对于网友的提问我也

没有回复,一方面是因为这段时间很忙很少上论坛;另一方面是觉得对于这种搬

移类问题属于工程上的,如果一两句话能说清楚的话,就没必要写那么多代码了。

所以简单的回复可能也不能解决根本问题,所以想等有机会了,写一个像“F28335

学习系列__FLASH 搬移到RAM 运行实现方法”一样的文章,清楚的告诉大家

如何去实现在F2812上搬移FLASH,并且写上详细的步骤,这样可能更适合工

程上的做法。接下来我们进入文章的主题。

一、F2812内部资源图

表1 F2812 内部资源图

低地址空间

0x0000 0000

0x0000 0040

0x0000 0400

0x0000 0800

0x0000 0D00

0x0000 1000

0x0000 6000

0x0000 7000

0x0000 9000

0x0000 A000

高地址空间

0x003D 7800

0x003D 8000-0x003F 7FF7

0x003F 7FF8-0x003F 7FFF

0x003F 8000

0x003F A000

0x003F F000

0x003F FFC0

OTP(1K*16并保留1K)

FLASH(128K*16)

128位密钥

H0 SARAM(8K*16)

保留空间

Boot Rom(4K*16 MP/MC=0)

BROM向量(VMAP=1 MP/MC=0 ENPIE=0)

M0矢量RAM(VMAP=0)

M0 SARAM(1K*16)

M1 SARAM(1K*16)

外设帧Frame0 (2K*16)

PIE向量(256*16,VMAP=1)

保留空间

外设帧Frame2(4K*16)

外设帧Frame1(4K*16)

L1 SARAM(4K*16)

保留空间

表1给出了F2812内部资源图,其分配与CMD分配一致。CMD主要作用

就是对上述空间进行合理的配臵。所以根据上表可以查看CMD对程序各部分的

2