首页 > 其他 > 详细

将DSP23335中的FLASH代码拷贝到RAM中去运行

时间:2020-05-13 18:05:21      阅读:112      评论:0      收藏:0      [点我收藏+]

关键点:

代码段的含义是将FLASH中的段ramfuncs 必须调入到RAML0 中运行

其装载在Flash中的地址是 RamfuncsLoadStart RamfuncsLoadEnd

在RAML0中的运行地址是 RamfuncsRunStart

?

Memcopy函数的写法

?

Void Memcopy(Uint16 *SourceAddr , Uint16 *SourceEndAddr , Uint16 *DestAddr)

{

While(SourceAddr<SourceEndAddr)

{

*DestAddr ++ =*SourceAddr ++;

}

?

?

}

?

?

问题1 为什么需要将一些段从FLASH中复制到RAM中运行 ?

答:有两种情况必须从FALSH拷贝到RAM中去运行

情况1 FLASH控制器的初始化必须在RAM中执行

情况2 初始化中断向量

(1)FLASH的控制寄存器FOPT FPWR FSTDBY-WAIT FACTIVEWAIT FBANKWAIT

FOTPWAIT 以上6个寄存器的初始化代码不能在FLASH 存储器中运行,否则就会发生不可预料的结果。

FLASH控制寄存器的初始化函数在运行时 必须从FLAsh(其装载地址)复制到RAM(其运行地址)

需要注意的是:FLASH控制寄存器受CSM保护。只能复制到RAM空间的L0~L3 执行初始化。

?

?

如何将代码存入FLASH 如何进行FLASH的初始化 ?

第一步 在DSP2833X_SYSCTRl.c中 通过伪指令将InitFlash函数分配至初始化自定义段

Ramfuncs

#pragma CODE_SECTION ( InitFlash,"ramfuncs")

技术分享图片

?

?

第二步

编写InitFlash()代码 ,用于初始化FLASH 状态寄存器 在DSP2833X_SYSCTRl.c中

技术分享图片

定义初始化段ramfuncs , 并通过SECTION伪指令规定段将装载在存储器的何处以及在存储器内何处运行

技术分享图片

?

LOAD RUN 是段的两个基本属性

LOAD_START LOAD_END RUN_START 这几个并非是参数,而是能够生成全局符号的指令 。

RamfuncsLoadStart RamfuncsLoadEnd RamfuncsRunStart 就是生成的全局符号

?

代码段的含义是将FLASH中的段ramfuncs 必须调入到RAML0 中运行

其装载在Flash中的地址是 RamfuncsLoadStart RamfuncsLoadEnd

在RAML0中的运行地址是 RamfuncsRunStart

?

?

第三步 : 在DC_CONFIG.C 中 定义了memcopy()函数

?

?

第4步 由于RamfuncsLoadStart RamfuncsLoadEnd RamfuncsRunStart 是在CMD文件中定义的,为了能够在C语言中被memcopy()调用 需要声明变量

extern Uint16 RamfuncsLoadStart;

extern Uint16 RamfuncsLoadEnd;

extern Uint16 RamfuncsRunStart;

?

在DSP2833X_Globalprototypes.h中 声明

技术分享图片

?

?

在主函数中 调用 memcopy()函数 实现initFlash 到RAM的复制

?

技术分享图片

?

?

?

问题2:

经常见到有些存在Flash 中的代码调入RAM运行的情况,而这些代码也并非是TI要求必须调入RAM中运行的,为何要这么做? 操作的步骤是什么

答:为了保证掉电不丢失。用户代码会存储在FLASH或者EEPROM空间,但是访问FLASH需要等待时间,大多数应用场合并无不妥,但是在系统控制环路的设计中往往需要较高的实时性。因此会极大地限制系统的控制精度。例如电力电子控制环路。

内部RAM存储器具有零等待状态,但他掉电会都是数据,如果能够将两者有机的结合在一起,从而可以解决这两者的矛盾。

一般而言,不会将所有函数都调入RAM中运行,。 也就是说不会为整个.text 段指定独立的装载和运行地址。为了节省RAM空间,在运行时,有选择的将那些参与控制器环路调节的函数调入RAM中。

?

例如:SVPWM 发波函数GenerateSVM()从FLASH调入RAM运行。可以按照如下步骤操作:

  1. 使用伪指令CODE_SECTION 将GenerateSVM()放置在名为.ramFast 的自定义段中

    ?

    #pragma CODE_SECTION (GenerateSVM ,"ramFast")

    ?

    Void GenerateSVM()

    {

    ……………………………….//SVPWM 程序代码

    ?

    }

    ?

    ?

    ?

  2. 使用伪指令SECTION 连接ramFast段。并将其从FLASH装载到RAM中运行 生成全局符号来实现存储器复制。

    ?

    SECTION

    {

    ramFast :LOAD =FLASHBCDEFGH,

    RUN=RAML1,

    LOAD_START(_ramFastLoadStart),

    LOAD_END (_ramFastLoadEnd),

    RUN_START(_ramFastRunStart),

    PAGE=0

    }

    ?

  3. 在C文件中声明运行地址并调用Memcopy()

    ?

    Extern unsigned int ramFastLoadStart

    Extern unsigned int ramFastLoadEnd

    Extern unsigned int ramFastRunStart

    ?

    Memcopy (&ramFastLoadStart , & ramFastLoadEnd, & ramFastRunStart)

    ?

将DSP23335中的FLASH代码拷贝到RAM中去运行

原文:https://www.cnblogs.com/bailongwei654321/p/12883359.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!