在应用编程MAXQ微控制器中可分区擦除的程序和数

2012-03-19 08:47:02来源: 互联网
摘要:本应用笔记介绍了MAXQ微控制器中的程序和数据闪存,以及如何使用内置的应用ROM对闪存进行擦/写。本应用笔记适用于所有使用分区擦除闪存的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. 有界队列流程
图1. 有界队列流程

块交换
块交换能够有效防止数据在漫长的分区擦除过程中丢失或损坏。这里所讲的“块”等同于“分区”。块交换方式最适合于分区尺寸略大于数据总量的情况。缺点是至少需要两个数据闪存分区。当要写入的数据总量远小于分区尺寸时,最好将块交换和有界队列两种方法结合使用。

如果需要采用块交换,则需要选用至少含有两个数据闪存分区的MAXQ器件。表3给出了一个包含两个1K x 16闪存分区的存储器配置实例。图2给出了块交换写/擦流程。

附录A给出了一个简单的C源代码实例。

表3. 块交换存储器配置实例

Flash Sectors
Sector Number Data Flash Address
0 0xF000-0xF3FF
1 0xE000-0xE3FF

图2. 块交换流程
图2. 块交换流程

同时采用有界队列和块交换
管理数据闪存的最可靠、最灵活的办法是同时采用有界队列和块交换技术。当需要将少量的数据周期性存入闪存,并要保持数据完整性的时候,结合使用这两种技术将非常有利。表4给出了一个包含两个2K x 16分区,每个分区被划分为32个相等条目的实例。图3示例数据在两个分区之间、有界排队内的流向。

这种组合方法的程序比有界队列方法稍微复杂一些。附录A给出了一个简单的C源代码实例。

表4. 块交换和有界队列存储器配置实例

FQueueBank0[ ]
Queue Index Data Flash Address
31 0xF7C0-0xF7FF
30 0xF780-0xF7BF
29 0xF740-0xF77F
. . . . . . . .
2 0xF080-0xF0BF
1 0xF040-0xF07F
0 0xF000-0xF03F

FQueueBank0[ ]
Queue Index Data Flash Address
31 0xE7C0-0xE7FF
30 0xE780-0xE7BF
29 0xE740-0xE77F
. . . . . . . .
2 0xE080-0xE0BF
1 0xE040-0xE07F
0 0xE000-0xE03F


图3. 有界队列和块交换流程
图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)
4 : command not supportedSW_FERR - Set on error, cleared on success.
Notes The watchdog must not be active, or the watchdog timeout must be set long enough to complete this routine without triggering a reset.

以下汇编代码实例采用间接寻址方法(查表)调用flashWrite()应用例程。该例程可由C代码调用。
; This routine is callable by C code using the following prototype
; u16 flashWrite(u16 *pAddress, u16 iData);
;
flashWrite:
    move APC, #0           ; No auto inc/dec of accumulator.
    move AP,  #2           ; Set ACC to A[2]
    move DP[0], #0800Dh    ; This is where the address of the table is stored.
    move ACC, @DP[0]       ; Get the location of the routine table.
    add  #14               ; Add the index to the flashWrite routine.
    move DP[0], ACC
    move ACC, @DP[0]       ; Retrieve the address of the routine.
    call ACC               ; Execute the routine.
    ret                    ; Status returned in A[0]
flashEraseSector
Routine u16 flashEraseSector(void *pAddress)
Summary Erases a single sector of flash memory
Inputs A[0] - Address located in the sector to erase.
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)
4 : command not supported
SW_FERR - Set on error, cleared on success.
Notes The watchdog must not be active, or the watchdog timeout must be set long enough to complete this routine without triggering a reset.

; This routine is callable by C code using the following prototype
; u16 flashEraseSector(void *pAddress);
;
flashEraseSector:
    move APC, #0           ; No auto inc/dec of accumulator.
    move AP,  #1           ; Set ACC to A[1]
    move DP[0], #0800Dh    ; This is where the address of the table is stored.
    move ACC, @DP[0]       ; Get the location of the routine table.
    add  #1                ; Add the index to the flashEraseSector routine.
    move DP[0], ACC
    move ACC, @DP[0]       ; Retrieve the address of the routine.
    call ACC               ; Execute the routine.
    ret                    ; Status returned in A[0]
flashEraseAll
Routine void flashEraseAll(void)
Summary Erases the entire program and data flash memory, including the boot loader sector. This routine is not normally used for IAP, as great care must be taken to ensure that the erase/programming sequence is not interrupted.
Inputs None
Outputs Carry: Set on error and cleared on success.SW_FERR: Set on error, cleared on success.
Notes The watchdog must not be active, or the watchdog timeout must be set long enough to complete this routine without triggering a reset.

; This routine is callable by C code using the following prototype
; void flashEraseAll(void);
;
flashEraseAll:
    move APC, #0           ; No auto inc/dec of accumulator.
    move AP,  #0           ; Set ACC to A[0]
    move DP[0], #0800Dh    ; This is where the address of the table is stored.
    move ACC, @DP[0]       ; Get the location of the routine table.
    add  #2                ; Add the index to the flashEraseAll routine.
    move DP[0], ACC
    move ACC, @DP[0]       ; Retrieve the address of the routine.
    call ACC               ; Execute the routine.
    ret

在应用编程

大多数基于闪存的系统要求,当系统安装到终端产品上以后,其固件必须具备升级的能力。这种功能称为在应用编程(IAP)。本节概述了创建一个IAP应用程序的要领。

[1] [2]

关键字:编程MAXQ  微控制器  可分区  擦除

编辑:神话 引用地址:http://www.eeworld.com.cn/mndz/2012/0319/article_15251.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部
编程MAXQ
微控制器
可分区
擦除

小广播

独家专题更多

富士通铁电随机存储器FRAM主题展馆
富士通铁电随机存储器FRAM主题展馆
馆内包含了 纵览FRAM、独立FRAM存储器专区、FRAM内置LSI专区三大部分内容。 
走,跟Molex一起去看《中国电子消费品趋势》!
走,跟Molex一起去看《中国电子消费品趋势》!
 
带你走进LED王国——Microchip LED应用专题
带你走进LED王国——Microchip LED应用专题
 
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved