Flash存储器在TMS320C3x系统中的应用_存储器论文
关键词:flash存储器 tms320c32 自动引导 am29f040
引言
在对电力系统断路器的状态监测过程中,需要对故障数据进行保存,以便于查扑克;在则故障期间难免会出现停机的现象,因此,如何在断电的状态下保存数据,就成为一个关键问题。对于故障出现的监测装置必须满足两个基本的特性——实时性和快速性。这两种特性都需要以快速处理大量的数据为基础,所以我们采用数据信号处理dsp来满足这方面的要求。现在,闪存(flash memory)已经成为dsp系统的一个基本的配置。
这里flash存储器主要用来存放用户程序代码。一般来说,将用户需要的程序代码装入flash存储器有三种方法:一种是在存储器出厂前将数据写入;一种是用户使用编程器自己编程;最后一种是将存储器安装在用户电路板后进行编程。随着芯片制造工艺的提高,芯片的集成度也越来越高,使flash存储器正在向小型化、帖片式方向发展。本文结合tms320c3x系列的dsp上电引导表产生方法,讨论amd公司生产的am29f040闪存在系统中的编程方法。
1 flash存储器am29f040
am29f040是amd公司生产的flash存储器,主要作用是固化程序和保存数据,也就是开机后执行闪存的程序,并在程序执行的过程中实时地保存或修改其内部的数据单元。
下面首先介绍am29f040的特点和操作。
am29f040是采用5v单电源供电的可编程只读存储器,是一种电可擦除与重新编程的器件。该器件由8个独立的64k字节块组成,访问速度为55~150ns。片内的状态机编程和擦除器件、嵌入式字节编程与区段/芯片擦除功能是全自动的。内部结构框图如图1所示。
a0~a18:地址线。其中a8~a18提供存储区地址,行地址确定所在扇区;a0~a7选定其扇区的一个字节,扇区容量是256字节。
dq0~dq7:数据输入/输出。在读周期输出数据;
在写周期接收数据。写过程中写入的数据被内部锁存。
ce:输入,芯片使能,低电平时选中该器件。
oe:输入,输出使能,低电平时打开数据输出缓冲区,允许读操作。
we:输入,写使能,低电平时允许写操作。
vcc为5v电源。vss为地。
工用方式有读方式、待机方式、输出禁止及算法选择。
例如,对于写操作的编程命令,如表1所列。
其中:ra为被读出的存储单元地址;
pa为被编程的存储单元地址;
rd为所选地址单元被读出的数据;
pd为所选地址单元被编程的数据。
除编程地址、区段地址和读地址之外的所有总线周期地址,地址引脚a18、a17、a16、a15为高或低。
下面以命令表的编程命令为例。简要介绍字节编程。表1所列命令是一个4总线周期指令。首先,在地址5555h写入数据0aah,地址2aaah写入数据055h,再在地址5555h写入数据a0h,最后是编程的地址和数据。
表1 软件命令简表
命 令 | 总线周期 | 第一周期 | 第二周期 | 第三周期 | 第四周期 | ||||
地址 | 数据 | 地址 | 数据 | 地址 | 数据 | 地址 | 数据 | ||
读/复位 | 1 | xxxxh | f0h | ||||||
读/复位 | 4 | 5555h | aah | 2aaah | 55h | 5555h | f0h | ra | rd |
算法选择 | 4 | 5555h | aah | 2aaah | 55h | 5555h | 90h | ra | rd |
字节编程 | 4 | 5555h | aah | 2aaah | 55h | 5555h | a0h | pa | pd |
对于芯片擦除功能,自动地提供编程和电擦除之前,校验所有存储单元所需的电压和时序,然后自动擦除并校验单元界限。利用数据轮询(datapolling)特性,可以监视自动芯片擦除操作期间器件的状态,以检验操作是否完成。
程序如下:
int chip_erase()
{
(int)0x00005555=0xaaaaaaaa; /*写芯片擦除命令部分*/
*(int *)0x00002aaa=0x55555555;
*(int *)0x00005555=0x80808080;
*(int)0x00005555=0xaaaaaaaa;
*(int *)0x00002aaa=0x55555555;
*(int *)0x00005555=0x10101010;
while((*int)0x00005555&0x80808080)!=0x80808080)/*数据轮询*/
对于区段擦除暂停,在区段擦除期间擦除暂停有效,数据值为b0h,不管地址值。区段擦除恢复,仅在擦除暂停之后擦除有效,数据值为30h,不管地址值。下面是简要的程序代码:
int sector_erase(sectadd)
int * sectadd;
{
(int)0x00005555=0xaaaaaaaa; /*写区段擦除命令部分*/
*(int *)0x00002aaa=0x55555555;
*(int *)0x00005555=0x80808080;
*(int *)0x00005555=0xaaaaaaaa;
*(int *)0x00002aaa=0x55555555;
*sectadd=0x30303030;
对于数据保护,此特性禁止在1~8个区段的任何组合进行编程和擦除操作。执行编程和擦除被保护区段的命令时,不改变区段内的数据。数据轮询位和跳转位工作在2~100μs,然后返回到有效数据。在地址引脚a9和控制引脚e,使用11.5~12.5v高电压vid,且在控制引脚e上使用vil将使此特性起作用。其具体操作为:当w为vih,e为vil且地址引脚g为vid时,区段保护方式被激活,地址引脚a18、a17、a16用来选择被保护的区段。一旦地址稳定,w处于脉冲低电平,操作开始于w的下降沿。
2 在tms320c3x中的应用
tms320c3x支持32位或16位宽度的程序外部存储器。由于am209f040的数据宽度是8位,而从ram单元中取出的数据宽度为32位,所以还要采用移位的方法写入am29f040。
引导表的格式主要由下面几部分组成:首先,是包括引导表数据宽度和其它数据总线寄存器值的头文件。接着,是coff文件中各个段的数据,其中每个段都包含一个该段的文件头来说明该段的代码长度和地址。最后是结束段。
这里,采用coff格式生成引导表比较麻烦。ti公司提供了一个很有用的转换工具hex30,只须编写一个命令文件,就可使用这个转化工具自动生成引导表。flash存储器烧写流程如图2所示。
采用ti公司的tms320c32的dsp,amd公司生产的8位am29f040作为flash存储器,这里使用了4片am29f040。
编写时必须注意:
①目标字宽度,也就是处理器的操作码长度。选好dsp后,该长度也就确定了。按照我们的例子为32位。
②数据宽度。由-datawidth设定,为32位。
③存储器宽度。由-memwidth设定,本例中为32位。
④rom宽度。由-romwidth设定,为8位,由flash存储器确定。
程序如下:
c3xcheck.out
-map 29f040.map
-i /*输出文件为intel格式*/
-datawidth 32
-memwidth 32
-romwidth 8
roms
{
flashrom:org=000000h,len=80000h,romwidth=8, /*512k×8*/
files={f040.b0 f040.b1 f040.b2 f040.b3}
}
sections
{
.text :paddr=00000040h
.ffttxt:paddr=000008d1h
.data:paddr=0000000h
.sintab:paddr=000009eeh
.paras:paddr=00000a2eh
}
命令文件按照上述编写,生成了4个文件,分别为f040.b0、f040.b1、f040.b2及f040.b3,然后可以直接用编程器烧写至4片am29f040即可。
利用上面的方法已经可以完成工作,但是我们还可以利用tms320c32的boot loader(上电加载)功能直接调入到存储器中。
dsp芯片复位以后,将自动地运行固化0h~0ffh空间内的引导装载程序,执行引导程序装载功能。进入引导装载程序以后,dsp将一直等待中断int0~int3的中断状态,根据不同中断,决定是以boot1~boot3的存储空间装载程序到指定的快速闪存,还是以从串口将程序引导装载到指定的快速闪存。ti公司的引导装载程序公开的(如果需要,可由其网站下载得到)。实现引导装载功能时,需要自己设计程序头,其中必须描述:
①待装载程序的存储器宽度为8位/16位/32位;
②sww等待状态发生器的方式;
③装载到快速ram的程序大小;
④装载的目的地址。
如果在实际系统中目的地址不止一个,其操作过程也是一样的,当一个模块装载完毕以后,如果还有一个另外的模块,那么它将继续执行。与上面的方法一样,在程序头加上必要的就可以了。
如将引导表作为程序的一个初始化段,在运行程序的时候将该段的内容也直接写到flash存储器里面。具体来说,首先编写段c语言程序,将上面由hex30生成的文件转化为.dat数据文件(使得dsp可以识别,dsp不能识别.b0文件)。然后,在编程程序中建一个段,其中包含这个数据文件。最后,在直接运行程序时,将其中的内容烧写到存储器里面。采用这种方法,比采用eprom编程器编程速度更快,而且省时省力,需要修改时不用取出flash存储器,可以在线编程修改。
3 结论
通过实际的电路仿真测试,证明这种设计思想简单、程序语法正确,数据传输效率高,充分利用了tms320c32编程语言特点。这种方法能够实现flash存储器在系统编程和在dsp系统上电后的用户程序的自动引导。同时,由对flash存储器am29f040应用的讨论可知,其不仅可以利用编程器编程,而且可以通过tms320c32在线进行擦除、读写及编程。