关于DSP28335Flash烧录问题记录

本文介绍了TI DSP TMS320F28335在烧录和运行时的配置细节,包括模式选择脚的设置、CMD文件的作用以及如何根据需求分配代码和数据段。CMD文件用于指定程序代码和数据在RAM或FLASH中的位置,通过#pragma DATA_SECTION和#pragma CODE_SECTION进行段定义。同时,文章提供了针对不同运行场景的CMD文件修改建议,并给出了参考链接。
摘要由CSDN通过智能技术生成

         笔者最近调试实验室的平台遇到了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

  • 8
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值