利用CodeVisionAVR编译器实现Atmega64单片机Bootloader程序对RWW编程详解_第1页
利用CodeVisionAVR编译器实现Atmega64单片机Bootloader程序对RWW编程详解_第2页
利用CodeVisionAVR编译器实现Atmega64单片机Bootloader程序对RWW编程详解_第3页
利用CodeVisionAVR编译器实现Atmega64单片机Bootloader程序对RWW编程详解_第4页
利用CodeVisionAVR编译器实现Atmega64单片机Bootloader程序对RWW编程详解_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、用到其它寄存器,可以通过查看.LST文件了解。、for(i=0;i256;i+)编译后成为:0071df e020 _GETWRN 17,18,0 _0x20:0071e0 30100071e1 e0e10071e2 072e _CPWRN 17,18,2560071e3 f45c BRGE _0x210071ed 4f2f _ADDWRN 17,18,10071ee cff1 RJMP _0x20还要注意这三个宏定义:.MACRO _CPWRN;前两个寄存器参数中的值与第三个常数参数比较 CPI R0,LOW(2) LDI R30,HIGH(2);注意R30用作了中间变量 CPC R1,R3

3、0 .ENDM.MACRO _GETWRN;将第三个常数参数加载到前两个寄存器参数中 LDI R0,LOW(2) LDI R1,HIGH(2).ENDM ANDI R1,HIGH(2).MACRO _ADDWRN;前两寄存器参数加第三个常数参数结果放在寄存器中 SUBI R0,LOW(-2) SBCI R1,HIGH(-2).ENDM从上面几宏可以看出,在写RWW临时页中字单元时,R30寄存器作为字地址指针,这与for循环中中间变量R30冲突,结果不能预料。3、函数调用情况如果定义了一个函数为 int fun(int i),在父函数中有以下调用fun(i)这个fun(i)编译后成为ldi r3

4、0,high(i)st Y,r30ldi r30,low(i)st Y,r30这时R30作为中间变量,同样fun(i)函数返回父函数前也要用 R31:R30返回整型数值。在写RWW临时页中字单元时,R30寄存器作为字地址指针,R31作为页地址指针,这与fun(int i)中间变量R30、R31冲突,结果不能预料。二、读写RWW区的函数库头文件system.h以及实现文件system.c1、system.h文件#ifndef _SYSTEM_H_#define _SYSTEM_H_/以下为SPMCSR的位定义 #define SPMIE 7#define RWWSB 6#define RWWSR

5、E 4#define BLBSET 3#define PGWRT 2#define PGERS 1#define SPMEN 0 /以下为BOOT区锁定位定义,存放在寄存器R0当中#define BLB12 5#define BLB11 4#define BLB02 3#define BLB01 2/MCUCR中的中断向量选择与修改使能位#define IVSEL 1#define IVCE 0 /EEPROM 控制寄存器 EECR#define EERIE 3#define EEMWE 2#define EEWE 1#define EERE 0/SPMCSR对应不同操作的值#define S

6、PM_PAGE_ERASE 3#define SPM_PAGE_WRITE 5#define SPM_PAGE_READ 17#define SPM_TEMP_WRITE 1#define SPM_BLT_SET 9 /定义atmega64单片机flash的页长#define FLASH_PAGE_SIZE 0x100/将中断向量移到BOOT区void Move_interrupts(void);void Do_spm(unsigned char spmcsrval);/RWW区页擦除 void PageErase(unsigned char page);/RWW区读使能void RWW_Re

7、adEnable(void);/写临时页void WriteTempPage(unsigned char* buffer,unsigned char page) ;/写RWW页void WritePage(unsigned char page);/校验数据,从RWW区读回数据以便与原始数据比较void ReadRWW(unsigned char* buffer,unsigned char page);#endif2、system.c文件#include #include #include system.h/将中断向量移到BOOT区,函数名Move_interrupts,没有输出和输入参数voi

8、d Move_interrupts(void)/* 使能中断向量的修改 */MCUCR |= (1IVCE);/* 将中断向量转移到boot 区 */MCUCR |= (1IVSEL);/SPM执行函数 /函数名:Do_spm/输出参数:无/输入参数:spmcsrval,SPMCSR寄存器的值/在不使用R30的父函数中要以调用#pragma warn- /禁止警告信息显示void Do_spm(unsigned char spmcsrval) #asm ST -Y,R16T0X26: LDS R23,104 ANDI R23,LOW(0X1) BRNE T0X26 IN R16,63 CLIT

9、0X29: SBIC 0X1C,1 RJMP T0X29 LDD R23,Y+1 STS 104,R23 SPM OUT 0X3F,R16 LD R16,Y+ #endasm #pragma warn+ /使能警告信息显示/RWW区页擦除,可以在写临时缓冲区前调用,也可以在写临时缓冲区后调用/在写临时缓冲区后调用,主要是为了修改临时缓冲区数据,而不是将临时缓/冲数据全部写一遍的情况 #pragma warn- /禁止警告信息显示void PageErase(unsigned char page) #asm ld r31,Y /加载页号 clr r30 /不关心R30的内容 #endasm Do_spm(SPM_PAGE_ERASE); /擦除页号所指示的FLASH页的内容 #pragma warn+ /使能警告信息显示/RWW区读使能,函数名RWW_ReadEnable,没有输出参数和输入参数。在页擦除后或页写/完成后,调用本函数,才可以正常读RWW区的内容。void RWW_ReadEnable(void) do Do_spm(SPM_PAGE_READ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论