1 前言
TMS320F28xx DSP片内有128 K×16 bit字的Flash、两块4 K x16bit字的单周期访问RAM(SARAM)LO和L1、一块8 Kxl6 bit字的单周期访问RAM(SARAM)HO、两块1 Kxl6 bit字的单周期访问RAM(SARAM)M0和M1。由于存储器种类多、容量大,所以从系统的高度来配置各个存储器必须有合适的方法,而这些方法一般都与片内Flash有关。另外,TMS320F28xx DSP片内有看门狗定时器模块(WDT)、引导ROM(ROM bootloader)模块、代码安全模块(CSM),要合理地使用这些模块为整个系统服务,必定也要用到Flash。
由此可以看出,Flash的地位和作用比较显著.所以本文就Flash的几种用法作了研究。
2 从Flash拷贝段到RAM
2.1拷贝中断向量
在TMS320F28xx器件中,外设扩展中断(PIE)模块管理中断请求。上电时,所有中断向量必须位于非易失性存储器(如Flash)中,但是要把中断向量拷贝到PIEVECT RAM中,这是用户代码中器件初始化程序的一部分。PIEVECT RAM是一个特定的RAM块,它在当前TMS320F28xx器件中是一个256×16的块.在数据空间中的起始地址为Ox000D00。
把中断向量连接到Flash,然后在运行时把中断向量拷贝到PIEVECT RAM中,有许多方法可以实现。一个方法是创建包含函数指针的常量C结构体,该结构体包括128个32-bit向量。如果使用DSP281x或者 DSP280x外设的结构体.这个结构体叫做PieVectTableInit,它已经在DSP281x_PieVect.c或者 DSP280x_PieVect.c创建(参看TI提供的例程)。因为这个结构体使用const类型关键词,所以它将会被编译器放置在.econst段中。运行时只需要把这个结构体拷贝到PIEVECT RAM中。C编译器运行时支持库包含名为memcpy的存储器拷贝函数,该函数可以被用来完成拷贝任务,其用法如下所示:
#include<string.h>
void main()
{
//Initialize the pie_ram
PieCtrlRegs.PIECTRL.bit.ENPIE=0;//disable the PIE
asm(" EALLOW"); //enable the eallow protected register access
memcpy((void*)0x00D00,&;PieVectTableInit,256);
asm("EDIS"); //disable the eallow protected register access
}
以上这个例子为PIE RAM起始地址使用的硬编码地址(hard coded address),明确指定为0x000D00。但是硬编码地址并不是较好的编程方式,用户可以使用DATA_SECTION指令创建一个非初始化的假变量(dummy variable),并把这个变量连接到PIE RAM.然后用这个假变量的名字来代替硬编码地址。例如,当使用DSP281x或者DSP280x外设结构体时,创建一个名为PieVectTable的非初始化结构体,并把该结构体连接到PIEVECT RAM。前面例子中的memcpy()函数可以被替换为:
memcpy(&;PieVectTable,&;PieVectTableInit,256);
注意拷贝长度是256个16-bit字.对应为128个32-bit字。
2.2初始化Flash控制寄存器
Flash控制寄存器FOPT、FPWR、:FSTDBY-WAIT、FACTIVEWAIT、 FBANKWAIT、FOTPWAIT的初始化代码不能从Flash存储器当中运行.否则就会有不可预料的结果出现。所以,Flash控制寄存器的初始化函数在运行时必须从Flash(它的装载地址)拷贝到RAM(它的运行地址)。
Flash控制寄存器由Code Security Module(CSM)保护。如果CSM被保护起来了,那么必须从被保护的RAM(例如:L0或者L1 SARAM)运行Flash控制寄存器的初始化代码,否则Flash控制寄存器的初始化代码无法访问Flash控制寄存器。要注意的是,当器件复位的时候 CSM一般都是被保护起来的,虽然使用假密码0xFFFF时ROM BOOTLOAD-ER会把它解锁。
C编译器的 CODE_SECTION指令可以用来为Flash控制寄存器的初始化函数创建独立的可连接段。例如:假定Flash控制寄存器的配置在C函数 InitFlash()中实现,并且想把这个函数放置在名为secureRamFuncs的可连接段当中。下列的C代码例程显示了 CODE_SECTION命令在 |