在应用编程MAXQ微控制器中可分区擦除的程序和数
引言
本应用笔记介绍了如何管理MAXQ微控制器中、可分区擦除的内部数据和程序闪存。一般性地介绍了怎样构建一个引导装载应用,实现程序闪存的在应用编程。注意:本文不适于那些使用页擦除闪存的MAXQ微控制器,即那些只允许少量闪存被擦除的微控制器。各MAXQ数据手册都会说明其所采用的闪存类型。闪存简介
存储器配置本应用笔记给出了多种不同尺寸的闪存配置,并不完全和某一特定MAXQ器件相符。这些配置仅用于本文中的实例。各MAXQ器件的数据手册会列出该器件的存储器配置。
引导、程序和数据区在操作上并没有区别。如果引导装载程序需要的空间超过了第一闪存区的范围,那么可将程序扩展到下一分区中。然而,在下面的实例中,标号会有所不同。
表1. 闪存配置实例
数据闪存
数据闪存可以被用来可靠地存储一些系统工作期间需要一次性或周期性保存的系统数据。数据闪存的容量因特定的MAXQ器件而异,通常在128至2k字之间。
数据闪存的使用有一些限制。与EEPROM不同,数据闪存不能按字擦除;每次必须擦除一个完整的分区。擦除一个分区通常需要0.7秒的时间,最坏情况下可能会长达15秒。在这期间,用户代码停止运行,不能进行其他操作。因此,在根据系统需求选择软件技术时,必须要仔细考虑这些限制。对于绝大多数周期性数据存储,采用有界队列和/或分区切换技术,即可满足系统可靠性的要求。下面给出分区交换和有界队列技术的简单实例。
有界队列
有界队列是一个包含固定数量元素的队列。该方法常用于处理周期性数据。例如,可以将一个2k字的数据闪存分成32至64个字的条目,如表2所示的存储器配置。
初始化时,启动程序扫描队列,以确定队列中下一个可用条目。队列填满之后只有将其擦处后方可写入下一个条目。如果要保留全部条目,那么必须改变分区以保持所有数据。闪存擦除后,则可以写入新的条目。这种方法的缺点是在擦写过程中如果掉电,所有数据将会丢失。图1示例条目载入有界队列的流程。附录A给出了一个简单的C源代码实例。
如果这种有界队列方法还不能满足您的系统要求,那么还可以采用分区交换技术。
表2. 有界队列存储器配置举例
FLASHQueue[ ] | |
Queue Index | Data Flash Address |
31 | 0xF7C0-0xF7FF |
30 | 0xF780-0xF7BF |
29 | 0xF740-0xF77F |
. . . . | . . . . |
2 | 0xF080-0xF0BF |
1 | 0xF040-0xF07F |
0 | 0xF000-0xF03F |
图1. 有界队列流程
块交换
块交换能够有效防止数据在漫长的分区擦除过程中丢失或损坏。这里所讲的“块”等同于“分区”。块交换方式最适合于分区尺寸略大于数据总量的情况。缺点是至少需要两个数据闪存分区。当要写入的数据总量远小于分区尺寸时,最好将块交换和有界队列两种方法结合使用。
如果需要采用块交换,则需要选用至少含有两个数据闪存分区的MAXQ器件。表3给出了一个包含两个1K x 16闪存分区的存储器配置实例。图2给出了块交换写/擦流程。
附录A给出了一个简单的C源代码实例。
表3. 块交换存储器配置实例
Flash Sectors | |
Sector Number | Data Flash Address |
0 | 0xF000-0xF3FF |
1 | 0xE000-0xE3FF |
图2. 块交换流程
同时采用有界队列和块交换
管理数据闪存的最可靠、最灵活的办法是同时采用有界队列和块交换技术。当需要将少量的数据周期性存入闪存,并要保持数据完整性的时候,结合使用这两种技术将非常有利。表4给出了一个包含两个2K x 16分区,每个分区被划分为32个相等条目的实例。图3示例数据在两个分区之间、有界排队内的流向。
这种组合方法的程序比有界队列方法稍微复杂一些。附录A给出了一个简单的C源代码实例。
表4. 块交换和有界队列存储器配置实例
|
|
图3. 有界队列和块交换流程
应用ROM闪存例程
MAXQ微控制器具有片内闪存支持程序,驻留在ROM (只读内存)中,用来对闪存进行编程、擦写和校验。有两种方法来调用这些例程。第一种也是最快的方法是直接访问,只需通过以下代码提供一个头文件:
u16 flashEraseSector(void *);u16 flashEraseAll(void);u16 flashWrite(u16 *pAddress, u16 iData);然后,加入链接定义给每个例程分配合适的地址。对于IAR链接文件,加入下面几行语句:
-DflashEraseSector=0x8XXX-DflashEraseAll=0x8XXX-DflashWrite=0x8XXX具体使用时,用每个例程相应的存储器地址替代0x8XXX。其他编译器可能使用不同的方法添加这些声明。
注意,直接访问方法与未来的ROM版本无法前向兼容。
第二种为查表法。尽管这种方法兼容性较好,但是执行时间较长。在下面每一段例程说明的后面,汇编例程采用查表法获取ROM应用例程的地址。表5所示为应用ROM提供的几个闪存例程。关于ROM应用例程的完整列表,参见特定MAXQ器件的用户指南。
表5. 应用ROM闪存例程
Routine Number | Routine Name | Entry Point ROMTable = ROM[800Dh] | Entry Point Physical Address |
2 | flashEraseSector | ROM[ROMTable + 1] | 0x8XXX |
3 | flashEraseAll | ROM[ROMTable + 2] | 0x8XXX |
15 | flashWrite | ROM[ROMTable + 14] | 0x8XXX |
flashWrite
Routine | u16 flashWrite(u16 *pAddress, u16 iData) |
Summary | Programs a single word of flash memory. |
Inputs | A[0] - Word address in flash memory to which to write. A[1] - Word value to write to flash memory. |
Outputs | Carry: Set on error and cleared on success. If set, then A[0] contains one of the following error codes: 1 : failure due to software timeout 2 : failure reported by hardware (DQ5/FERR)<
相关推荐
技术专区 |
评论