闪存(flash)是一种可在线进行电擦写,掉电后信息不丢失的存储器。它具有低操作电压、低功耗、大容量、擦写速度快等特点。在嵌入式系统中广泛使用闪存来保存程序。在实际应用中为了节省整个嵌入式系统的成本和系统复杂程度,整个系统仅设计成具有一块闪存,CPU执行的程序被保存在闪存中,设备产生的重要数据也保存在该闪存中,且这些数据必须在设备运行过程中及时进行更新保存。因此要求系统在程序执行时必须完成向闪存中保存数据信息的功能,也就是CPU从闪存中取指执行程序时,同时向闪存中写入数据。绝大多数闪存芯片是不支持同时对芯片进行读写操作的。本文通过一个完整的应用实例,详细介绍了在应用程序执行过程中写SST32HF162的方法,并提供了相应的C语言源程序代码,同时对C语言代码的可行性进行了详细的分析。
图1:写闪存流程。
图2:写扇区流程。
[此贴子已经被作者于2005-12-8 11:30:23编辑过]
SST32HF162是来自SST公司的Combo存储器,其结构为1M×16闪存+128K×16 SRAM。它的主要特点如下:2.7~3V单电源供电;读写SRAM时可同时对闪存进行读写操作;支持JEDEC单电源闪存存储器标准;向其命令寄存器写入相应的指令即可完成闪存的擦除、写操作;通过查询特定的数据位可监控擦除或写操作是否完成。可对任一扇区、块进行读、写或擦除操作,而不影响其它部分的数据;扇区大小为2K字;支持字节编程方式。
向闪存的特定寄存器连续写入3个特定的字节可开始一个写循环,而后写入地址以及相应的数据就可对闪存进行编程操作。在写闪存期间仅有读检测位有效,其他命令都将被忽略。由于编程指令不能使闪存中的逻辑“0”改写为“1”,因此在编程闪存时必须先进行擦除操作。闪存编程命令见表1。
系统环境描述
用单一的平板地址空间,该地址空间的大小为232个8位字节。这些字节单元的地址是一个无符号的32位整数值,其取值范围为0到232-1。ARM体系支持32位或16位的数据总线,本文介绍的系统使用16位的数据总线,因此ARM的地址空间可以看作是231个16位的半字单元。
源程序代码要求系统环境中有SRAM,SRAM的大小至少能容纳写一个字到闪存中的程序代码。对于SRAM以及闪存的实际地址分配没有特别要求。
[此贴子已经被作者于2005-12-8 11:33:35编辑过]
写闪存过程
1.搬移闪存中的程序到SRAM中
系统中仅设计有一块闪存,且同块闪存在写入时读出的数据无效,因此在闪存写入期间MCU不能再从闪存中取指执行程序。因在读写SRAM时可以进行闪存的写入操作,所以我们可以将写闪存时MCU将执行的代码全部搬移到SRAM中,强制程序在SRAM中执行。通过执行SRAM中的程序完成对闪存的擦除以及写入的工作。
2.闪存写入以扇区为单位
在进行闪存写入时,首先必须进行擦除,而后再编程闪存。闪存擦除时以扇区为单位,在本应用中每个扇区为2K字。当每次写入数据少于一个扇区的大小时,原来保存在该扇区中的信息将被擦除。因此在进行写闪存时必须先读出原来在该区中保存的信息,而后与准备写入的信息共同组成一个扇区内容,再开始写闪存的操作。
程序实现流程见图1和图2。
图3:WriteWord函数编译后生成的伪代码。
。
[此贴子已经被作者于2005-12-8 11:42:09编辑过]
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |