AVR105 高效持久保存参数到 Flash.doc

上传人:豆**** 文档编号:17403724 上传时间:2022-05-23 格式:DOC 页数:8 大小:143.50KB
返回 下载 相关 举报
AVR105 高效持久保存参数到 Flash.doc_第1页
第1页 / 共8页
AVR105 高效持久保存参数到 Flash.doc_第2页
第2页 / 共8页
点击查看更多>>
资源描述

《AVR105 高效持久保存参数到 Flash.doc》由会员分享,可在线阅读,更多相关《AVR105 高效持久保存参数到 Flash.doc(8页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、AVR105 高效持久保存参数到 Flash 翻译: 邵子扬AVR105: 高效持久保存参数到 Flash翻译:邵子扬 2006年8月31日shaoziyang1 特点l 快速存储参数l 高持久性存储 350K 次写循环l 高效参数存储l 任意参数大小l 参数冗余存储l 可选写入验证l 电源失效后优化恢复2 介绍嵌入式系统在复位或掉电后依赖于保存的参数。在一些系统这个静态的参数用于初始化系统,在另外一些应用下用于记录系统的历史数据或累计数据。EEPROM 存储器可以用于这个目的,但是当一次要保存多个字节时就难以匹配 Flash 存储器的速度。Flash 存储器对于大量参数更有效率的原因是可以使

2、用页编程,减少了编程时间。这样在存储多个字节时对于 Flash 每个字节的编程时间就比 EEPROM 少。作为快速存储法的直接结果就是电源消耗可以减少,因为更多的时间可以进入休眠模式。这篇应用笔记说明了使用 AVR 的自编程特性来高效参数保存的方法。利用整个 Flash 页和类似于环形缓冲区的方法,Flash 页的每个存储器单元的写入次数不像只使用一个单元那么频繁, 这增加了存储器的使用次数,保证存储区不会被“耗尽”。存储器的使用次数与参数大小和分配页面大小成正比。3 理论AVR 单片机的 megaAVR 系列有个特性叫做“自编程”,这个特点使得 AVR 可以再次编程内部的 Flash 存储器

3、。所有 AVR 单片机的程序存储器都可以用于存储常数,现在也可以存储参数,因为能够在运行时修改 Flash 存储器的内容。使用 Flash 存储器存储参数不像使用 EEPROM 接口那样简单,自编程的目的主要是为了用于固件程序升级,但是其灵活性也允许用于更新 Flash 中的参数。这一小节说明了 Flash 存储器关于使用内部存储器保存参数的基本资料。3.1 Read-While-Write FlashFlash 存储器可以用 SPM 指令再次编程。SPM 指令只能从 Boot 区运行,从应用程序区执行SPM 指令将没有任何效果。应用程序区的范围是从地址 0x0000 直到 Boot 区的起始

4、地址(如图1)。Boot 区可以选择 4 个不同的大小,它由熔丝位来决定。Boot 大小与使用的 AVR 单片机型号有关。图1. ATmega128 的应用程序区和 Boot 区存储器映射Boot 区总是在 No-Read-While-Write (NRWW) 区,应用程序区包括了 Read-While-Write (RWW) 区以及 NRWW 区的一部分。当 Boot 区的大小选择为最大时,它占用了整个的 NRWW 区,这时应用程序区就只包含了 RWW 区。NRWW 和 RWW 是固定的,不受 Boot 区大小的影响。参考芯片的数据手册获得更详细的资料(注:也可以参考AVR109自编程,这篇

5、应用笔记已经翻译过了)。NRWW 和 RWW 区的不同在于当擦除或写入 RWW 区时,AVR 单片机可以继续执行位于 NRWW 区的程序代码。反过来则不行的:AVR 内核在修改 NRWW 区时被暂停。概括的讲,位于 Boot 区的代码可以在程序区编程时执行,这里假设被程序区修改的页面在 RWW 中。因此,Flash 参数更新的代码必须位于 Boot 区,而 Flash 参数必须在程序区的 RWW 部分。这要求在写入参数时不能禁止中断。3.2 擦除和编程 Flash 单元Flash 存储器由独立的位单元组成,Flash 单元基于浮动门晶体管工艺:一个电荷“捕捉”晶体管门电路决定 Flash 单元

6、读取的逻辑电平。Flash 的工作方式可以简单的描述为:当 “擦除” 一个单元时,对门进行充电,单元读取为逻辑 1。 “编程” Flash 等于对门电路放电,使逻辑变为 0。只能编程(放电)一个已经擦除过 (充电) 的单元。Flash 以页的形式组织,当使用自编程擦除和编程时也是以页方式进行的。注意位可以单独编程,因为位编程就是放电,没有被编程的位仍然保持电荷,任何没有被编程的位可以在以后进行编程。如果在编程一个字节前不先进行擦除,其结果就是旧参数和新参数的与。例如写参数 0x01 到一个 Flash 字节需要先擦除该字节 (8 个 Flash 单元),使其变为 0xFF。写入参数时,7 个高

7、位(Flash 单元) 被放电。如果 Flash 没有被预先擦除,结果很可能是不正确的:假设原来的参数是 0xFE,并且要编程的新参数为 0x01,编程的结果将是 0x00,因为 LSB 不能从 0 变为 1。3.3 Flash 编程次数实际上一个参数(1) 可以存储多次到一个 Flash 页,Flash 单元保证可以承受 10,000 次擦除/写入循环。就是说,每个单元可以擦除并编程 10,000 次。因此,如果一个参数可以在一个页面的不同位置写入 10 次,那么总次数可以认为是 100,000 次。注意:1. 这里的“参数”既可以是一个单独的参数,也可以是一组参数。“参数”可以看做一系列任

8、意大小的数据。3.4 写入时间当写入 EEPROM 时,一次写入一个字节,使用 Flash 就不是这样因为可以用页编程方式,这对于多个字节参数存储时是一个优势。参数越多,每个字节编程的时间越短。写入一个 long (4 字节) 类型的参数到 Flash 大约是 4 ms (不包括擦除时间,耗时基本相同),平均一个字节 1 ms。作为比较,写入相同参数到 EEPROM(1) 大约是 32 ms,这里包括了 EEPROM 的擦除时间,但比较是公平的,因为 Flash 只在所有单元都被用完后才擦除。以 ATmega128 为例:页大小是 256 字节,可以存储一个 long 类型的变量 256/4

9、= 64 次。擦除时间平均到 64 次写入中,就是 4 ms 除以 64,就已经非常小了。结论是多个参数的存储使用 Flash 在写入时间上更有效率 更多时间可以进入休眠模式,节约电能。注:1. 这里以 ATmega128 为例,具体的 EEPROM 编程时间与芯片有关 请参考芯片的数据手册。3.4.1 Flash 写访问限制Flash 和 EEPROM 共享擦除和编程模块,结果就是 EEPROM 和 Flash 不能同时写入(或擦除)。这也意味着在使用自编程来修改程序存储器时,需要先检测是否正在进行 EEPROM 写入。如果是 EEPROM 正在写入,必须等待 EEPROM 写完成。反过来也

10、一样,EEPROM 也需要等 Flash 写入完成。3.5 Flash 数据保存时间可编程存储器中数据正确保存的时间称为数据保存时间(或数据保持能力)。存储器不能无限保存数据的原因是存储器单元存在泄露,这意味着单元中存储的电荷会逐渐减弱,直到不再表现出应有的逻辑电平。擦除或编程单元都会朝向不确定状态。如果超过了数据保存时间,其内容将变得不再可靠。3.5.1 擦除和写入减少数据保存时间当擦除和写入 Flash 单元时,是有损伤的,而读取操作不会影响数据保存时间。随着擦除/写入周期次数的增加,Flash 单元的泄露也随之增加。结果就是电荷快速减弱,数据很快变得无效 换句话说,数据保存时间就会减少。

11、如果擦除/写入周期次数超过 10K 次,数据保存时间就会低于预期的 20 年。和参数保存到 Flash 相关联,知道 Flash 页是相互独立的非常重要;如果一个 Flash 页用于保存参数,这个页将会减少数据保存时间,而 Flash 其余部分,用于保存代码,不会受到参数页的影响而减少数据保存时间。3.6 掉电考虑一个必须考虑的问题是任何嵌入式系统都可能遇到电源失效,这也是使用非易失存储器保存参数的原因:这样可以在电源正常后恢复参数。有许多方法来验证参数被正确写入,首选是根据时间和代码空间来验证。一个安全方法是使用很少的存储器空间和时间,保存写完成标志到一个静态存储器位置,这个标志可以用于在电

12、源恢复后判断上次写入是否正常完成,如果没有就需要采取适当的操作。考虑关于避免类似于 EEPROM 错误那样的 Flash 故障(参考 AVR 数据手册关于避免 EEPROM 错误部分)。为了避免 Flash 因为电源失效引起的写入故障,在使用自编程时推荐总是允许低压检测功能。3.7 使用自编程详细关于自编程的内容可以在器件的数据手册中找到,以及在应用笔记 “AVR109: 自编程”中。注意到 Flash 写操作不会被外部复位或 Brown-out 复位中止是很重要的。只有上电复位才会中止 Flash 写操作,其结果就是写操作将尽可能长的执行,即使供电电压低于要求的最低低压。这不会引起数据损坏

13、这个特点增加了 Flash 页写入/擦除完成的可能。4 执行Flash 参数存储的例子使用了 IAR EWAVR 2.27b 编译器。它也能用于其他编译器,但是可能需要一些修改,因为例子代码中使用了一些 IAR 内部函数。例子的目的是创建可以快速存储多字节参数的驱动以及获得参数长久保存。存储的持久性与参数的大小和 Flash 页大小有关,在例子中存储一个 7 字节的结构体参数到 ATmega128。页大小是 256 字节,一页可以保存 35 个参数,包括了写入完成标志。那么存储的次数可以按如下方式计算:总次数 = 单元次数 * 个数 = 10,000 * 35 = 350,000一般情况下数据

14、保存次数要大于最低保存次数,可以预计比最低次数增加 10 倍 即数百万次参数更新。此外,放置参数到存储器的 RWW 区可以使电源消耗达到最小。因为在更新参数时代码可以在 NRWW 区继续运行,节约了时间。代码使得中断可以继续操作以及在 RWW 区中断驱动代码能继续执行。4.1 选项为了获得更可靠的存储方法,需要“允许”使用写完成标志。如果使用了此标志,参数写入和参数位置标志(也就是写完成标志)将分为两个写操作,这样可以通过写完成标志判断参数被正确存储。不过,和用一个操作就储存它们相比分别存储参数和写完成标志将花费两倍的时间。为了增加安全性,在擦除参数页时参数临时存储到 EEPROM。这是为了防

15、止在擦除操作和写操作之间电源失效造成丢失参数。如果发生了电源失效,参数可以从 EEPROM 中恢复并编程到参数页中。这些功能由 FlashStorageDriver.c 控制,默认情况下是允许的。4.2 需求例子使用了 ATmega128,因此适合于同样内存大小的芯片。如果用在其它型号上,命令链接文件和 FlashStorageDriver.c 文件中芯片的参数需要被修改。4.3 固件说明驱动由 3 个函数组成:它们在下面用流程图 (图 2、3、4) 说明。4.3.1 FlashStorageInitFlash 存储器的初始化就是检查 Flash 存储器的状态。如果参数存储在临时 EEPROM

16、 (根据 EEPROM 备份有效标志),参数将被恢复并复制到 Flash 存储器。否则 Flash 缓冲区最后使用的位置将从索引标志中进行识别。图2. Flash 存储初始化4.3.2 FlashStorageWrite参数存储程序先检查 EEPROM 是否正在访问。如果是,程序就禁止 EEPROM 中断并等待访问结束。如果参数页被填满,参数首先存储到 EEPROM,然后擦除参数页。当 EEPROM 保存参数时, 设置 EEPROM 备份有效标志。一旦擦除结束,参数写入到参数页并清除 EEPROM 备份有效标志。写入参数到参数页后,相应的参数索引位也被清除,这个方法可以在初始化时判断参数是否有效。最后,EEPROM 中断被恢复到初始状态。除了上面列表外,存储器的 RWW 区访问控制使得在函数返回时可以允许存储器读取。图3. Flash 存储写入过程4.3.3 FlashStorageRead 应用程序不能直接读取 Flash 中参数,因为程序不知道参数的当前位置,因此用一个专门的函数用来读取参数。函数首先判断是否可以读取参数(SPM 指令没有执行),然后读取并返回参数。图4. Flash 存储读过程5 参考文献列表1. AVR 带有自编程功能的芯片数据手册,在 Atmel 网站上。2. 应用笔记 “AVR109 自编程” ,在 Atmel 网站上。(全文完)第 8 页 共 8 页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com