- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AVR106读写Flash程序空间的C函数
AVR应用笔记
AVR106 读写Flash程序空间的C函数
翻译:吕益光 2006年6月8日 lvyiguang@163.com
特性
访问闪存的C函数
字节读取
分页读取
字节写入
分页写入
可选电源失效时恢复
可以用于任何带有自编程存储器功能的AVR单片机中
使用Flash存储参数的例程
简介
近来的AVR芯片有一个特性称为自编程。这一特性使得AVR能够在程序运行期间对闪存重新编程,并且适用于那些需要自升级固件或是在闪存中存储参数的应用。本应用笔记提供闪存空间访问的C函数。
图1 使用闪存部分来存储参数的完整应用举例
工作原理
本节包含关于AVR自编程存储的一些基本理论。为了更好的理解自编程的所有特性,请查阅数据手册或“AVR109 Self Programming Flash”应用笔记。
3.1 使用SPM
利用存储程序存储器指令(SPM)可以对闪存编程。在具备自编程特性的设备中程序存储器主要分为两个部分:应用程序闪存区和引导闪存区。
在含有引导模块的设备中,SPM指令具备对整个闪存空间写入的能力,但它却只能从引导区执行。从应用程序区执行SPM将没有任何作用。在那些没有引导区的小一点的设备中,SPM指令是能够从整个存储区执行的。
在闪存向引导区写入的过程中CPU总是挂起的。然而,在(闪存)向应用程序区写入的过程中,大部分的设备还是可以从引导区执行代码(进行读操作)的。值得注意的是在向应用程序区写入的过程中执行的代码并不再试图对应用程序区进行读操作。如果这一事件(写入的同时进行读操作)发生,那么整个程序的执行将被中断。
这两个存储区域的大小和位置依赖于设备本身及其合并设置。一些设备具备从整个闪存空间执行SPM指令的能力。
3.2 写入过程
闪存是一页一页的被写入的。待写入的数据在被写进闪存以前,先整页的送到页面临时缓冲区。数据要被写到闪存的哪一地址,是由Z寄存器和RAMPZ寄存器中的内容决定的。相应的闪存页面将使用临时缓冲区中存储的数据编程,在此以前,该页面必须被擦除。本应用笔记中写入闪存的函数是按照如下步骤实现的:
填充临时缓冲区页面
擦除闪存页面
写入闪存页面
正如您在以上步骤中所看到的一样,如果在一个页面被擦除后的瞬间突然发生复位或掉电事件的话,就有可能导致数据的丢失。我们可以在软件上采取必要的防范,例如设置非易失性存储缓冲区等,来避免数据的丢失。应用笔记中的写入函数能够在写入时提供可选的缓冲区。这些函数在固件区作了进一步的描述。对于那些具有边读边写特性的设备,它们允许引导区代码边写入边执行,写入函数在写入过程完成后才返回。
3.3 寻址
AVR的闪存被设计成16位的字,这意味着每一个闪存地址能够存储两个字节的数据。对ATmega128来说,有可能扩址到64k个字长或是128k个字节的数据闪存区。在某些情况下,闪存是通过字寻址指定的,在另一些情况下则是通过字节寻址指定的,这将导致出现混乱。所有包含在本应用笔记中的功能都是通过字节寻址的。字节地址和字地址之间的关系如下:
字节地址 = 字地址*2
闪存页面是通过使用字节地址将其作为页面第一个字节的地址的。页码和页面字节地址之间的关系如下:
字节地址 = 页码*页面大小(以字节为单位)
寻址举例:
ATmega128中的一个闪存页面有256个字节。
字节地址0x200(512)将指向:
闪存字节0x200(512),等于第2页的字节0
闪存页面2
当对ATmega128作页面寻址时,地址的低位字节总是0。
当对字寻址时,地址的LSB总是0。
执行
固件是为IAR编译器编写的。函数也可以适合其他编译器,但是可能需要做出一些修改,因为使用到了 IAR编译器的内部函数。主要过程就是在主程序中包含头文件“Self_programming.h”和添加文件 “Self_programming.c”到工程文件。自编程的实质就是调用位于闪存引导区的写入函数,这可以通过编译器的连接器文件(*.xcl)里面内存段使用定义来控制。所有其他的关于固件的必需配置都在文件“Self_programming.h”中。
4.1 页面大小
常量 PAGESIZE 必须定义成和设备的闪存页面大小(字节)相等。
4.2 允许闪存恢复
通过定义常量 _FLASH_RECOVER 来使能闪存恢复选项,从而避免因电源失效而造成的数据丢失。当允许闪存恢复的时候,闪存的一个页面实际上是被看作是一个恢复缓冲器。_FLASH_RECOVER 的值就是这个闪存页面(即作为恢复缓冲器的页面,译者注)的地址。该地址必须是指向闪存页面开始位置的字节地址,并且写入函数不允许写该页面。闪存恢复是通过在程序启动时调用函
文档评论(0)