烧录到RAM还是烧录FALSH,我们先来说说这两都的区别。

烧录到RAM,一般是在调试的过程中使用,这样执行速度会比较快,但是断电后,程序并没有保存在DSP里面。而烧录到flash,一般是应用在调试完成后,烧录到flash里的程序,断电后,程序不会丢失。

烧写到RAM和烧写到FLASH 的配置有些许不同。主要区别在于.cmd文件。

  • F28034.cmd : 烧录到flash
  • 28034_RAM_Lnk.cmd : 烧录到RAM

 1. 烧写至RAM 

屏蔽掉 F28034.cmd , 右击该文件,在下拉菜单中选择Exclude from Build

 或者在工程属性中选择

 2. 烧写到FLASH 

2.1 同理先要屏蔽28034_RAM_Lnk.cmd,方法同上。

2.2 还需要在main.c中添加相关函数

声明变量:

extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadSize;
extern Uint16 RamfuncsRunStart;

同时,在同时,在main主函数的InitPieVectTable();之后添加以下代码。

memcpy((Uint16 *)&RamfuncsRunStart,(Uint16 *)&RamfuncsLoadStart,(unsigned long)&RamfuncsLoadSize);
    
InitFlash();

这几句是将FLASH中的程序COPY到RAM中运行,通常的目的是加快程序的运行速度,通常有两种情况需要这样去操作:

  • 程序中对于要求比较高的函数,如中断;
  • 程序需要对FLASH进行操作,这时就要把程序先复制到RAM中运行然后才能对FLASH操作。

RamfuncsLoadStart、RamfuncsLoadEnd、RamfuncsRunStart这三个变量是在CMD文件中创建的,创建方式如下:

LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
RUN_START(_RamfuncsRunStart),

分别表示了装载函数的首地址,装载函数的结束地址和装载函数的运行地址;
执行完 memcpy((Uint16 *)&RamfuncsRunStart,(Uint16 *)&RamfuncsLoadStart,(unsigned long)&RamfuncsLoadSize); 后,便将FLASH中相关的程序COPY到了RAM中,之后的程序运行时,只要调用FLASH中RamfuncsLoadStart地址开始的相关函数,系统都会自动地指向RAM中相应的函数入口地址运行。

注意:

1)、在官方手册《TMS320x2803x  Piccolo Technical Reference Manual》中,提到FLASH模式的硬件引脚配置,建议GPIO37和GPIO34上拉10k电阻到3.3V,TRST引脚下拉10k电阻到GND,当然,你也可以选择用拨码开关进行切换。 

2)、对于老版本的CCS,有些教程会使用MemCopy,而不是用的memcpy。其实,在新的CCS中,都是使用memcpy。

“Do note that we don't recommend that use of MemCopy. memcpy is now recommended. “,说明了不再推荐使用MemCopy,而推荐使用memcpy。

     3) InitFlash()在DSP2803x_SysCtrl.c中,所以要确保你的工程文件夹中存在该文件。

3. 常见问题:

3.1 关于RAM和FLASH运行速度的差别 

首先,ramfuncs段中的内容我们都是要让它在RAM中跑的,里面包含一些flash的初始化设置函数,这些函数必须只能在RAM中运行,还有一些对时间比较敏感的函数,也是需要复制在RAM中运行的,因为RAM的速度远快于flash,我们通常讲的60MHz的执行速度,指的是去RAM的运行速度,flash一般只能跑到1/3的速度。

       DELAY_US是1us的延时,它是基于RAM的速度来实现的精确的1us延时,如果把这段代码放在flash,由于flash的初始化等待状态不同,会导致flash执行速度不同,不能精确的得到1us的延时,只能是大于1us。

3.2  如何分配在RAM中运行

TI C2000 , .cmd文件,.TI.ramfunc,将程序分配为在RAM中运行/Flash运行的配置方法和原理讲解,(如28375S ,280049,28335等等芯片) 

对于你想要在RAM中运行的函数,你可以在main.c之前添加以下代码

#pragma CODE_SECTION(XXX, "ramfuncs");

其中,xxx就是你想要运行的代码函数名,它可以是中断服务函数等。

3.3 tms320f28034 程序运行问题 

跑不起了,copy在ram里程序 执行时间不对,  不是代码逻辑的问题,

搞定了,主要是 注意 copy到ram的函数 相应调用的子函数 要靠考虑效率, 小的函数用 static lnline 声明, 大的函数 也同样 段声明 CODE_SECTION(cpu_timer0_isr, "ramfuncs"); 

然后运行时间就对了。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐