TMS320F28xx DSP中内部Flash的应用研究

前言

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的存储器拷贝函数,该函数可以被用来完成拷贝任务,其用法如下所示:

以上这个例子为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命令在flash存储器配置中的正确用法:

secureramfuncs段可以使用用户连接命令文件(.cmd)进行连接。这个段需要独立的装载和运行地址。另外,还想让连接器生成一些全局符号,这些全局符号可以用来决定装载地址、运行地址、段长度。在实现把这个段从装载地址拷贝到它的运行地址时需要这些信息。用户连接命令文件如下所示:

在这个例子中,假定存储器flash和secure_ram都已经在用户连接命令文件中的memory段中定义。这些存储器的page标识符要与它们的存储器定义相匹配。在上面的例程中假定两个存储空间都已经在page 0(程序存储空间)中声明过了。run_start、load_start、load_end指令将生成全局符号,这些全局符号有特定的名称,对应着相应的地址。最后,这个段必须在运行时从flash拷贝到ram,可以用到编译器运行支持库里面的函数memcpy()。

2.3性能最优化

常数是那些用c语言的const类型关键词声明的数据结构。编译器把所有的常数放置在.econst段中(假定为大存储模式)。当前tms320f28xx器件上的特殊管道(special pipelining)提高flash上运行代码的性能时.每次访问位于片上flash中的数据常数会占用许多周期。特别是在150 mhz tms320f281x dsp上flash等待状态要达到5个周期.100 mhz tms320f280x dsp达到3

  • TMS320F28xx DSP中内部Flash的应用研究已关闭评论
    A+
发布日期:2019年07月02日  所属分类:参考设计