学习记录:
在将程序下载到DSP的FLASH中时,遇到了一点小问题,查了一些资料,记录一下。
小白,欢迎交流指导。
首先说一下如何将程序下载到FLASH中,我看的是普中的视频资料,必备的两个文件:1.DSP2833x_MemCopy.c 2.F28335.cmd
然后在主函数的时钟初始化后加入两行代码,如果有中断初始化,放在中断初始化之后。
MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);
InitFlash();
还要删除28335_RAM_lnk.cmd,这个是把程序下载到RAM里的配置文件。
至此就可以了,一步多余的操都不要有。 其实CMD文件里面的内容还要改一下,不过直接用普中的这个就可以,链接我放在下面了:
链接:https://pan.baidu.com/s/1_YZ2NoIjU-UheIfn2uw1xA?pwd=ov49
提取码:ov49
接下来,记录下我自己的理解,
首先这两行代码,第一行的意思是把FLASH中的程序复制到RAM中执行,为什么这么做,就不得不说一下InitFlash(); 这个函数了,在DSP2833x_SysCtrl.c 中可以看到此函数初始化FLASH控制寄存器,此函数必须在RAM中运行,如果在OTP/FLASH中运行的话讲产生不可预料的后果,所以必须要进行这一步。
其次说明一下,这两行代码是怎么运作的,MemCopy执行的地址是在CMD中分好的段,这就是之前说的CMD文件需要改一下,我的理解哈,不一定对。
ramfuncs : LOAD = FLASHD,
RUN = RAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0
这个就是将ramfuncs段的FLASHD中的程序放在RAM中执行, InitFlash();又是如何放在ramfuncs段中的呢,
//将InitFlash函数映射到CMD文件中的ramfuncs段,在CMD文件中ramfuncs段被分配到RAM里面
#pragma CODE_SECTION(InitFlash, "ramfuncs");
至此,这两行代码的意思也大致明了了,就是先把需要在RAM中执行的函数放在ramfuncs段,这个段是可以自己定义的,也就说其它函数,程序,也可以通过类似的方式,放在RAM中执行。然后通过MemCopy,就可以实现将ramfuncs段中程序放在RAM中执行了。