免费预览已结束,剩余5页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
AVR106 读写Flash程序空间的C函数 翻译:吕益光AVR应用笔记AVR106 读写Flash程序空间的C函数翻译:吕益光 2006年6月8日1. 特性l 访问闪存的C函数 字节读取 分页读取 字节写入 分页写入l 可选电源失效时恢复l 可以用于任何带有自编程存储器功能的AVR单片机中l 使用Flash存储参数的例程2. 简介近来的AVR芯片有一个特性称为自编程。这一特性使得AVR能够在程序运行期间对闪存重新编程,并且适用于那些需要自升级固件或是在闪存中存储参数的应用。本应用笔记提供闪存空间访问的C函数。图1 使用闪存部分来存储参数的完整应用举例3. 工作原理本节包含关于AVR自编程存储的一些基本理论。为了更好的理解自编程的所有特性,请查阅数据手册或“AVR109 Self Programming Flash”应用笔记。3.1 使用SPM利用存储程序存储器指令(SPM)可以对闪存编程。在具备自编程特性的设备中程序存储器主要分为两个部分:应用程序闪存区和引导闪存区。在含有引导模块的设备中,SPM指令具备对整个闪存空间写入的能力,但它却只能从引导区执行。从应用程序区执行SPM将没有任何作用。在那些没有引导区的小一点的设备中,SPM指令是能够从整个存储区执行的。在闪存向引导区写入的过程中CPU总是挂起的。然而,在(闪存)向应用程序区写入的过程中,大部分的设备还是可以从引导区执行代码(进行读操作)的。值得注意的是在向应用程序区写入的过程中执行的代码并不再试图对应用程序区进行读操作。如果这一事件(写入的同时进行读操作)发生,那么整个程序的执行将被中断。这两个存储区域的大小和位置依赖于设备本身及其合并设置。一些设备具备从整个闪存空间执行SPM指令的能力。3.2 写入过程闪存是一页一页的被写入的。待写入的数据在被写进闪存以前,先整页的送到页面临时缓冲区。数据要被写到闪存的哪一地址,是由Z寄存器和RAMPZ寄存器中的内容决定的。相应的闪存页面将使用临时缓冲区中存储的数据编程,在此以前,该页面必须被擦除。本应用笔记中写入闪存的函数是按照如下步骤实现的:l 填充临时缓冲区页面l 擦除闪存页面l 写入闪存页面正如您在以上步骤中所看到的一样,如果在一个页面被擦除后的瞬间突然发生复位或掉电事件的话,就有可能导致数据的丢失。我们可以在软件上采取必要的防范,例如设置非易失性存储缓冲区等,来避免数据的丢失。应用笔记中的写入函数能够在写入时提供可选的缓冲区。这些函数在固件区作了进一步的描述。对于那些具有边读边写特性的设备,它们允许引导区代码边写入边执行,写入函数在写入过程完成后才返回。3.3 寻址AVR的闪存被设计成16位的字,这意味着每一个闪存地址能够存储两个字节的数据。对ATmega128来说,有可能扩址到64k个字长或是128k个字节的数据闪存区。在某些情况下,闪存是通过字寻址指定的,在另一些情况下则是通过字节寻址指定的,这将导致出现混乱。所有包含在本应用笔记中的功能都是通过字节寻址的。字节地址和字地址之间的关系如下:l 字节地址 = 字地址*2闪存页面是通过使用字节地址将其作为页面第一个字节的地址的。页码和页面字节地址之间的关系如下:l 字节地址 = 页码*页面大小(以字节为单位)寻址举例:ATmega128中的一个闪存页面有256个字节。字节地址0x200(512)将指向:l 闪存字节0x200(512),等于第2页的字节0l 闪存页面2当对ATmega128作页面寻址时,地址的低位字节总是0。当对字寻址时,地址的LSB总是0。4. 执行固件是为IAR编译器编写的。函数也可以适合其他编译器,但是可能需要做出一些修改,因为使用到了 IAR编译器的内部函数。主要过程就是在主程序中包含头文件“Self_programming.h”和添加文件 “Self_programming.c”到工程文件。自编程的实质就是调用位于闪存引导区的写入函数,这可以通过编译器的连接器文件(*.xcl)里面内存段使用定义来控制。所有其他的关于固件的必需配置都在文件“Self_programming.h”中。4.1 页面大小常量 PAGESIZE 必须定义成和设备的闪存页面大小(字节)相等。4.2 允许闪存恢复通过定义常量 _FLASH_RECOVER 来使能闪存恢复选项,从而避免因电源失效而造成的数据丢失。当允许闪存恢复的时候,闪存的一个页面实际上是被看作是一个恢复缓冲器。_FLASH_RECOVER 的值就是这个闪存页面(即作为恢复缓冲器的页面,译者注)的地址。该地址必须是指向闪存页面开始位置的字节地址,并且写入函数不允许写该页面。闪存恢复是通过在程序启动时调用函数RecoverFLASH()来实现的。4.3闪存空间写入的定义函数允许写入的存储空间范围通过常量ADR_LIMIT_LOW和ADR_LIMIT_HIGH来定义。函数能够使用介于ADR_LIMIT_LOW和ADR_LIMIT_HIGH之间的地址。4.4 内置于引导区的整个代码的放置我们需要对在缺省 *.xcl 文件中的分段的范围进行重定义,从而在闪存引导区中放置整个程序的代码。引导区的位置和大小是随着设备的型号和熔丝设置而变化的。对BOOTRST熔丝编程将移动复位向量到引导区的开始处,也能够移动所有的中断向量到引导区,查阅具体型号单片机的数据手册中中断部分来了解怎样实现。那些需要重定义来将整个程序代码放置到引导区的的定义部分如下所示:TINY_F,NEAR_F,SWITCH,DIFUNCT,CODE,FAR_F,HUGE_F,INITTAB,TINY_ID,NEAR_ID,CHECKSUM。应用笔记中的lnkm128s.xcl文件将整个代码放置到一个Atmega128的8kB闪存区域中。我们能够很容易的修改该文件,使其适用于其他型号,文件也提供了关于如何修改的说明。4.5 将所选函数放置到引导区作为选择,我们可能只需要将所选到的函数放置到已定义的闪存分段中。事实上,仅仅是写入函数需要在引导区中定位。这能够通过定义一个等同于引导存储空间的新的闪存分段来实现,并使用操作符来将所需要的函数放置到该分段中。在这里,操作符不应用于内部调用的函数。针对一个带有8kB引导区的ATmega128,*.xcl文件中引导分段的定义如下:1. 定义一个新的引导区大小。-D_.X_BOOTSEC_SIZE = 2000 /*4096个字长*/2. 为基于步骤1中定义的整个引导区定义一个新的分段。-Z(FARCODE)BOOT_SECTION= (_.X_FLASH_END-_.X_BOOTSEC_SIZE-1)-_.X_FLASH_END将C函数放置到所定义的段中:Void ExampleFunction() BOOT_SEGMENT-以上的C代码将函数ExampleFunction()放置到已定义的存储分段区“BOOT_SEGMENT”中。5.固件说明固件由5个C函数和一个使用ATmega128的IAR v2.28a/3.10c工程实例组成。工程实例被配置成位于闪存引导区的整个程序代码,并作为起始点使用,应用程序概略如图1。5.1 C函数描述表1 访问闪存空间的C函数函数变量返回值ReadFlashByte()MyAddressType flashAdrunsigned charReadFlashPage()MyAddressType flashStartAde, unsigned char *dataPageunsigned charWriteFlashByte()MyAddressType flashAddr, unsigned char dataunsigned charWriteFlashPage()MyAddressType flashStartAdr, unsigned char*dataPageunsigned charRecoverFlash()voidunsigned char数据类型MyAddressType定义在Self_programming.h中。这一数据类型的大小依赖于所使用的设备。当所使用的设备拥有64kB以上的闪存时,它被定义成long int型;当所使用的设备只有不大于64kB的闪存时,它被定义成int(16位)型。该数据类型实际上是作为_flash或_farflash指针(16位和24位)来使用的。新的数据类型被定义的原因是,整型数据类型比指针型数据类型有着更加灵活的应用。ReadFlashByte()返回一个字节,该字节位于输入变量给出的地址。ReadFlashPage()从地址ucFlashStartAdr读出闪存页面,并将数据存储在数组pucDataPage中。所存储的字节数取决于闪存页面的大小。如果输入地址不是一个闪存页面的地址,函数返回FALSE,否则返回TRUE。WriteFlashByte()向闪存地址ucFlashPage写入字节ucData。如果输入地址不是一个用以写入的有效闪存字节地址,函数返回FALSE,否则返回TRUE。WriteFlashPage()从数组pucDataPage向闪存页面地址ucFlashStatAdr写入数据。所写入的字节数取决于闪存页面的大小。如果输入地址不是一个用以写入的有效闪存字节地址,函数返回FALSE,否则返回TRUE。RecoverFlash()读出EEPROM中的状态变量,并在可能的时候将其存储在闪存页面中。如果闪存恢复选项使能,函数必须在程序启动的时候就调用。该函数在闪存恢复发生时返回TRUE,否则返回FALSE。5.2 闪存恢复当允许闪存恢复选项的时候,在向实际给出的闪存页面写入数据以前,会先向闪存中的专用恢复页面进行预写入。待写入页面的地址,将和包含数据的闪存恢复页面的状态标志字节一道被存储到EEPROM中。当实际的闪存页面被成功的写入时,这一状态字节就会清空。必要时,EEPROM和闪存恢复缓冲区中的变量通过闪存恢复函数RecoverFlash()将数据恢复。向EEPROM中写入一个字节所耗费的时间差不多等同于向闪存中写入整个页面
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年职业规划与自我管理能力测试题
- 2026年小学生心理健康问题测试及解答
- 2026年通信工程项目经理必刷题库
- Q-TTAY01-2023 Y型过滤器标准规范
- 九年级数学找规律专题练习
- 九年级政治教学学期工作计划
- 二年级教师工作总结九篇
- 临床执业助理医师药理学模拟试题
- 对标规范实施方案
- 通信行业工程实施方案
- 2024年巴西焊接耗材市场机会及渠道调研报告
- eras围手术期营养管理
- 面积单位间的进率课件说课稿
- 光电器件行业报告
- 汽车涂装工艺中的涂装线节能与耗能分析
- 贵州华金矿业有限公司选矿厂技改项目环境影响报告书
- 井场常见安全隐患100例课件
- 史学概论版课件
- YY/T 0316-2016医疗器械风险管理对医疗器械的应用
- GB/T 11869-2018造船和海上结构物甲板机械远洋拖曳绞车
- 变频器基础知识概述课件
评论
0/150
提交评论