DSP

Flash的烧写

2019-07-13 19:42发布

http://www.hellodsp.com/bbs/viewthread.php?tid=30249&highlight=%C9%D5%D0%B4 [原创] F2812烧写个人总结

这几天一直在弄F2812烧写,在此论坛看前人的帖子,也得到很多帮助,今天烧写成功。我的很多DSP知识来自hellodsp,所以今天自己也总结一下,给需要的朋友一点帮助,算是回馈论坛。

在仿真器中将程序调试好,将程序烧入flash之前,需要做以下工作:
一、硬件上确保DSP的XMP/MC管教接地,且SCIATXDA脚接高电平;
二、向工程中添加F2812_EzDSP_FLASH_lnk.cmd文件,它是用于flash烧写的CMD文件,用于替换原有的用于RAM中调试的F2812_EzDSP_RAM_lnk.cmd文件。
三、添加DSP281x_Headers_nonBIOS.cmd文件,用于将DSP28头文件中的外设结构与存储器地址对应起来;
四、添加DSP281x_CodeStartBranch.asm文件,此文件负责上电后程序执行顺序跳转的;
(以上这些文件最好从TI官方的经典例程里面直接拿来用,用别的地方的文件可能有修改,会出错,直接用TI的肯定没错)

五、在main函数中,最好先添加一段延时语句,因为程序从_c_int00处跳到main处需要一段时间来完成各种配置;
六、编写定义Initflash()函数,并且添加语句#pragma CODE_SECTION(InitFlash, "ramfuncs"),改语句功能是将InitFlash函数写入RAM中,因为InitFlash经常被调用,这样省得每次都从flash中写入RAM。如果还有经常反复调用的函数,也可自行添加类似语句,需注意#pragma CODE_SECTION (InitFlash, "ramfuncs") 应该写在函数Initflash()所在的C文件中,并且在函数之前声明;
七、在main函数中写以下语句,功能是从flash中将程序复制到RAM中, 
memcpy(&ramfuncs_runstart,
&ramfuncs_loadstart,
&ramfuncs_loadend - &ramfuncs_loadstart);
注意ramfuncs_runstart、ramfuncs_loadstart、ramfuncs_loadend三个变量一定要和F2812_EzDSP_RAM_lnk.cmd文件中ramfuncs处的三个变量完全一致,并且这三个变量要在main中申明为全局变量; 
八、main函数中,在memcpy之后,执行Initflash(),接着再写别的功能函数。

这些工作都做好了的话,至于在CCS中具体的烧写操作,就很简单了,有很多资料可以参考,注意别误操作把flash锁死就行。呵呵,说完了,希望能对别人有用。 http://www.hellodsp.com/bbs/viewthread.php?tid=20392&highlight=%C9%D5%D0%B4 DSP2812_FLASH烧写成功经验总结
初次接触DSP2812的FLASH烧写,在“成功”锁死2块DSP2812和处理了一堆报错后,终于烧写成功。在此过程中在HELLODSP论坛中看到很多朋友也遇到过与我类似的问题,为了让更多的新手朋友少走弯路,将我4天折磨的烧写过程经验与大家分享,本人菜鸟初学,有错误之处,敬请指教。
其中CMDLIBASM文件,我都是在一个同事给北京瑞泰开发板给的例程中找到,大家可以参照。
1. 一定要下载最新的FLASH烧写插件,可以避免很多奇怪的错误出现,这一点非常重要,本人就是在此问题困扰了一整天。
名称是:
C2000-2[1][1].00-SA-to-UA-TI-FLASH2X.EXE
我使用的产品版本号为2.02.001

2. 下载烧写FLASH配套CMD文件、LIB文件以及起始代码asm文件。
CMD文件名称:DSP281x_Headers_nonBIOS.cmd
CMD文件名称:F2812.cmd
LIB文件名称:rts2800_ml.lib
ASM文件名称:DSP281x_CodeStartBranch.asm
另外在RAM调试时用以下两个文件:
F2812_EzDSP_RAM_lnk.cmd
DSP281x_Headers_nonBIOS.cmd
附件给出了2个CMD文件、ASM文件、LIB文件以及C文件。
其中C文件仅仅作为大家参考。



3. 配置C文件
配置好主程序的C文件,才能将FLASH成功烧录,并且将FLASH中的文件拷贝到RAM中运行。
关于C文件的配置。
首先在F2812.CMD文件中,我们可以看到有关于加载FLASH到RAM的内容:

ramfuncs : LOAD = FLASHD, 
RUN = RAML0, 
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0
以及在C文件中调用FLASH 到RAM的函数memcpy,将它放在系统初始化(InitSystem();)之后即可:
InitSystem();

memcpy(&RamfuncsRunStart,
&RamfuncsLoadStart,
&RamfuncsLoadEnd - &RamfuncsLoadStart);

Initflash();
所以,我们需要定义所用变量:

extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;

我的这些定义都是:DSP281x_GlobalPrototypes.h 当中,当然,也可以放在其他系统初始化的地方。

Memcpy这个函数应该是rts2800_ml.lib库文件中自带的,不需要我们定义。

关于FLASH的初始化配置Initflash();

我把它放置在Memcpy函数之后。

关于ramfuncs,则在系统初始化中定义即可。如:sysctrl.c中

#pragma CODE_SECTION(InitFlash, "ramfuncs");

另外,许多朋友没有注意需要定义自己其他子程序,导致最终运行的主程序还是在FLASH中,比如你需要运行的子程序ABC,则需要定义#pragma CODE_SECTION(ABC, "ramfuncs")


烧写成功后的注意事项:
1. 一定要拔除仿真器(JTAG端),给电路板重新上电,方能实现FLASH启动。
2. 注意MP/MC引脚的电压。0为方式MC来作为计算机模式启动,3.3V为方式MP作为微处理器模式启动。
3. 由于GPIO引脚的F4F12F3F2决定了DSP2812的启动顺序,而从FLASH必须要在F4(SCITXDA)为1,而F12F3F2随意的状态下启动。请大家启动前确认F4引脚电压。

另外:对于在汇编程序的FLASH烧写,我有同事正在做,到时候整明白了,一起放上来给大家。
错误之处,各位GGMM请多指教。