笔者最近调试实验室的平台遇到了28335烧录flash的一些问题,现总结如下,希望能给大家一些参考。
1.查到相关手册,28335的 XA15 XA14 XA13 XA12这四个脚为DSP的模式选择脚,当这四个脚分别等于1 1 1 1 时,Jump to Flash;很多资料中都是如此描述,经多方求证、实践得知:如烧录DSP的内部Flash中,无需配置这四个引脚的初始电平,如若将程序烧录进外部Flash中则需要配置。
2.在使用CCS+仿真器时,我们把程序烧进RAM中运行,这样运行速度快,此时使用的是28335_RAM_lnk.cmd文件,烧录之前需将28335_RAM_lnk.cmd替换为F28335.cmd文件。二者可以实现共存,在编译时只需右键选择Exclude from build选项。要根据自己的工程文件配置合适的F28335.cmd文件:
cmd文件的作用:
CMD文件的作用就像仓库的货物摆放记录一样,为程序代码和数据分配指定的空间。
C语言生成的段大致分为两大类:初始化和未初始化,已初始化的段含有真正的指令和数据,未初始化段只是保留变量的地址空间。已初始化段通常放在程序空间,未初始化段通常放在数据空间。
已
.text——C语言编译生成的汇编指令代码存放于此
.cinit——存放初始化的全局和静态变量
.const——字符串常量和const定义的全局和静态变量
.econst——字符串常量和far const定义的全局和静态变量
.print——全局构造器(C++)程序列表
.switch——存放switch语句产生的常数表格
未初始化段:
.bss——为全局变量和局部变量保留的空间,程序上电时,.cinit空间中的数据复制出来并存放在.bss空间中
.ebss——为使用大寄存器模式时预留的全局和局部变量空间,程序上电时,.cinit空间中的数据复制出来并存放在.bss空间中
.stack——堆栈空间,主要用于函数传递变量或为局部变量分配空间
.system——为动态存储分配保留的空间(malloc),如果有宏函数,此空间被占用
.esystem——为动态存储分配保留的空间(far malloc),如果有far函数,此空间会被占用
自定义分配:
(1)数据段在F28335.cmd文件中分配
section name : > RAML1 PAGE = 0
注意空间分配合理,如果变量超出给定空间CCS会报错,编译时可以调出CCS view菜单下的Memory Allocation 窗口观察
在main.c文件中
#pragma DATA_SECTION(name, "section name");
Uint32 name=0;
name——变量名
section name——自定义的段名
DATA_SECTION用来定义数据段
(2)代码段在CMD文件中的分配
section name : LOAD = FLASHE,
RUN = RAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0
LOAD_START(_RamfuncsLoadStart)为程序下载到FLSAH的首地址
LOAD_END(_RamfuncsLoadEnd)为程序下载到FLSAH的尾地址
RUN_START(_RamfuncsRunStart)为程序运行在RAM的首地址
在main.c文件中
#pragma CODE_SECTION(name, "section name");
CODE_SECTION用来定义代码段
注意:
不能再函数体内声明#pragma;必须在
符号被定义和使用之前声明#pragma
在主程序中添加
void main(void)
{
InitSysCtrl();
MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);
InitFlash();
。。。。。。。。。。。。
}
编写用于flash烧写的F28335.cmd文件时相对来说较复杂些,根据不同的情况需要做一些修改。
1 不需要把部分代码copy到RAM里,一般情况不需要外扩RAM等时直接用TI的F28335.cmd即可。
2 需要把部分代码从flash 复制到RAM里,如延时函数DSP2833x_usDelay.asm等,这时CMD文件需要做相应的修改,具体参考博文:http://blog.sina.com.cn/s/blog_762cf5f80101asmq.html
3 从时间开销方面考虑,需要把整个程序从flash复制到RAM里,这时程序及CMD文件都要做相应的修改,具体参考博文http://blog.sina.com.cn/s/blog_762cf5f80101apfx.html
个人觉得把主要的计算函数搬运到RAM中运行即可。
本文部分参考了:https://blog.csdn.net/scottly1/article/details/40380077