利用CodeVisionAVR编译器实现Atmega64单片机Bootloader程序对RWW编程详解.doc

利用CodeVisionAVR编译器实现Atmega64单片机Bootloader程序对RWW编程详解.doc

ID:62035307

大小:210.50 KB

页数:9页

时间:2021-04-15

利用CodeVisionAVR编译器实现Atmega64单片机Bootloader程序对RWW编程详解.doc_第1页
利用CodeVisionAVR编译器实现Atmega64单片机Bootloader程序对RWW编程详解.doc_第2页
利用CodeVisionAVR编译器实现Atmega64单片机Bootloader程序对RWW编程详解.doc_第3页
利用CodeVisionAVR编译器实现Atmega64单片机Bootloader程序对RWW编程详解.doc_第4页
利用CodeVisionAVR编译器实现Atmega64单片机Bootloader程序对RWW编程详解.doc_第5页
资源描述:

《利用CodeVisionAVR编译器实现Atmega64单片机Bootloader程序对RWW编程详解.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、利用CodeVisionAVR编译器实现Atmega64单片机Bootloader程序对RWW编程详解一、对CodeVisionAVR编译器注意事项1、循环控制变量:如局部变量声明为volatileinti;编译后,volatileinti;成为st–Y,HIGH(i)st–Y,LOW(i)也就是将局部变量进栈,高字节在先,低字节在后。注意函数入口参数先于局部变量进栈,且入口参数进栈顺序为自左到右,同一参数高字节在先,低字节在后。如局部变量声明为inti;编译后,成为st–Y,r17st-Y,r16 ldir16,LOW(i)ldir17,High(i

2、)当然,如果变量较多的话,还会用到其它寄存器,可以通过查看。LST文件了解。2、for(i=0;i<256;i++)编译后成为:0071dfe020__GETWRN17,18,0_0x20:0071e030100071e1e0e10071e2072e__CPWRN17,18,2560071e3f45cBRGE_0x21………………………………………………0071ed4f2f__ADDWRN17,18,10071eecff1RJMP_0x20  还要注意这三个宏定义:.MACRO__CPWRN;前两个寄存器参数中的值与第三个常数参数比较CPIR@0,LO

3、W(@2)LDIR30,HIGH(@2) ;注意R30用作了中间变量CPCR@1,R30.ENDM。MACRO__GETWRN;将第三个常数参数加载到前两个寄存器参数中LDIR@0,LOW(@2)LDIR@1,HIGH(@2)。ENDMANDIR@1,HIGH(@2).MACRO__ADDWRN;前两寄存器参数加第三个常数参数结果放在寄存器中SUBIR@0,LOW(-@2)SBCIR@1,HIGH(-@2)。ENDM从上面几宏可以看出,在写RWW临时页中字单元时,R30寄存器作为字地址指针,这与for循环中中间变量R30冲突,结果不能预料。3、函数调用

4、情况如果定义了一个函数为intfun(inti),在父函数中有以下调用fun(i)这个fun(i)编译后成为ldir30,high(i)st–Y,r30ldir30,low(i)st–Y,r30这时R30作为中间变量,同样fun(i)函数返回父函数前也要用R31:R30返回整型数值。在写RWW临时页中字单元时,R30寄存器作为字地址指针,R31作为页地址指针,这与fun(inti)中间变量R30、R31冲突,结果不能预料。二、读写RWW区的函数库头文件system.h以及实现文件system.c1、system。h文件#ifndef__SYSTEM_H

5、__#define__SYSTEM_H__//以下为SPMCSR的位定义#defineSPMIE7#defineRWWSB6#defineRWWSRE4#defineBLBSET3#definePGWRT2#definePGERS1#defineSPMEN0//以下为BOOT区锁定位定义,存放在寄存器R0当中#defineBLB125#defineBLB114#defineBLB023#defineBLB012//MCUCR中的中断向量选择与修改使能位#defineIVSEL1#defineIVCE0//EEPROM控制寄存器-EECR#defineE

6、ERIE3#defineEEMWE2#defineEEWE1#defineEERE0//SPMCSR对应不同操作的值#defineSPM_PAGE_ERASE3#defineSPM_PAGE_WRITE5#defineSPM_PAGE_READ17#defineSPM_TEMP_WRITE1#defineSPM_BLT_SET9//定义atmega64单片机flash的页长#defineFLASH_PAGE_SIZE0x100//将中断向量移到BOOT区voidMove_interrupts(void);voidDo_spm(unsignedchars

7、pmcsrval);//RWW区页擦除voidPageErase(unsignedcharpage);//RWW区读使能voidRWW_ReadEnable(void);//写临时页voidWriteTempPage(unsignedchar*buffer,unsignedcharpage);//写RWW页voidWritePage(unsignedcharpage);//校验数据,从RWW区读回数据以便与原始数据比较voidReadRWW(unsignedchar*buffer,unsignedcharpage);#endif2、system.c文件

8、#include#include"sys

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。