您的位置 首页 技术

IAR for AVR 学习笔记(4)–Flash操作

FLASH常用类型的具体操作方法4.1.FLASH区域数据存储。用关键字__flash控制来存放,__flash关键字写在数据类型前后效果一样__…

FLASH常用类型的具体操作办法

4.1.FLASH 区域数据存储。
用关键字 __flash 操控来寄存, __ flash 关键字写在数据类型前后作用相同
__flash unsigned char a;//界说一个变量寄存在flash空间
unsigned char __flash a;//作用同上
__flash unsigned char p[];//界说一个数组寄存在flash空间
关于flash空间的变量的读操作同SRAM数据空间的操作办法相同,编译器会主动用
LPM,ELPM 指令来操作。
例:
#i nclude
__flash unsigned char p[];
__flash unsigned char a;
void main(void)
{PORTB=p[1];// 读flash 数组变量的操作
PORTB=a;// 读flash 变量的操作
}
因为在正常的程序中,flash 空间是只读的,所以没有赋值的变量是没有意义的。界说常数在flash 空间,只要给变量赋与初值就能够了。因为常数在flash空间的地址是随机分配的,读取变量才能够读取到常数值。
10
IARAVR –C 编译器扼要攻略
__flash unsigned char a=9;//界说一个常数寄存在EEPROM空间。
__flash unsigned char p[]={1,2,3,4,5,6,7,8};
//界说一个组常数寄存在flash 空间。
例:
#i nclude
__flash unsigned char p[]={1,2,3,4,5,6,7,8};
__flash unsigned char a=9;
void main(void)
{
PORTB=a;//读取flash 空间值9
PORTC=p[0]; //读取flash 空间值
}

4.1.2flash 空间肯定地址定位:
__flash unsigned char a @ 0x8;//界说变量寄存在flash 空间0X08单元__flash unsigned char p[] @ 0x22//界说数组寄存在flash 空间,开端地址为0X22单元
__flash unsigned char a @ 0x08=9;//界说常数寄存在flash 空间0X08单元
__flash unsigned char p[] @ 0x22={1,2,3,4,5,6,7,8};
//界说一个组常数寄存在EEPROM空间开端地址为0X22单元
因为常数在flash 空间的地址是现已分配的,读取flash 空间值能够用变量和地址。

4.2.与 __flash 有关的指针操作。 __flash 关键字操控指针的寄存和类型。
4.2.1指向flash 空间的指针flash 指针(操控类型特点)
unsigned char __flash * p;//界说指向flash 空间地址的指针,8位。
unsigned int __flash * p;//界说个指向flash 空间地址的指针,16位。
unsigned int __farflash * p;//界说指向flash 空间地址的指针,24位。
unsigned int __hugeflash * p;//界说指向flash 空间地址的指针,24位。
unsigned char __flash * p;//界说一个指向flash 空间地址的指针,指针自身寄存在SARM中。P的值代表flash 空间的某一地址。*p表明flash 空间该地址单元寄存的内容。例:假定p=10,表明flash空间地址10单元,而flash M空间10单元的内容就用*p来读取。
例:
#i nclude
char __flash t @ 0x10 ;
char __flash *p ;
void main(void)
{
PORTB=*p;//读取flash 空间10单元的值
PORTB=*(p+3);//读取flash 空间0x13单元的值
}

4.2.2.存储于flash 空间的指针数据指针
就象存储与flash 空间的数据相同操控存储特点
__flash unsigned char * p; //界说指向SARMM空间地址的指针,指针自身寄存在flash 中。

4.3.操控数据和指针寄存的__flash 界说有必要是全局变量,操控类型特点(如同只要指针)能够是局部变量。
#i nclude
__flash unsigned char p;//操控寄存
void main(void)
{
unsigned char __flash* t;//操控特点
PORTB=p;
PORTB=*t;
}

4.4. __root 关键字确保没有运用的函数或许变量也能够包括在方针代码中.
界说寄存在__flash 空间的数据在程序编译时会主动生成代码嵌入到flash代码中,关于程序没有运用也要求编译的数据(比方能够在代码中嵌入你的版本号,时刻等)有必要加关键字__root 约束。
例:
#i nclude
__root __flash unsigned char p @ 0x10 =0x56;
void main(void)
{}
程序没有运用P变量,编译也会生成该代码。
:020000020000FC
:1000000016C018951895189518951895189518955F
:10001000569518951895189518951895189518953A
:10002000189518951895089500008895FECF0FE94A
:100030000DBF00E00EBFC0E8D0E003D0F4DFF4DF76
:06004000F3CF01E008957A
:0400000300000000F9
:00000001FF

4.5.flash 操作宏函数:在comp_a90.h intrinsics.h头文件里有具体阐明。flash 空间具正常状况下有只读功能,关于读flash 数据编译器会主动编译对应的LPM,ELPM指令,但关于flash 空间的自编程写指令SPM就没有对应的C指令了,这儿不解说具体的自编程办法,仅仅解说一下对flash 的读写函数。
直接在程序中读取flash 空间地址数据:要包括intrinsics.h头文件
__load_program_memory(const unsigned char __flash *);//64K空间
//从指定flash 空间地址读数据。该函数在intrinsics.h头文件里有具体阐明。
在comp_a90.h文件有它的简化书写_LPM(ADDR)。留意汇编指令LPM Rd ,Z中的Z是一个指针。所以用(const unsigned char __flash *)来强制转换为指向flash空间地址指针。故该条宏函数的正确写法应该如下:
__load_program_memory((const unsigned char __flash *)ADDR);
例:
#i nclude
#i nclude
void main(void)
{PORTB=__load_program_memory((const unsigned char __flash *)0x12);
}
该条函数书写不便利,在comp_a90.h文件有简化:
#define _LPM(ADDR) __load_program_memory (ADDR)略微便利一点。改为
#define _LPM(ADDR) __load_program_memory ((const unsigned char
__flash *)ADDR)就更便利了,直接运用数据就能够了。
例:
#i nclude
#i nclude
#i nclude
void main(void)
{
PORTB=__LPM(0x12);// 从指定flash 空间地址单元0x12中读数据
}
__extended_load_program_memory(const unsigned char __farflash *);
//128K空间_ELPM(ADDR); //128K空间
参照上面的了解修正能够书写更简略。

4.6.自编程函数:
_SPM_GET_LOCKBITS();//读取缩定位
_SPM_GET_FUSEBITS();//读取熔丝位
_SPM_ERASE(Addr);//16位页擦除
_SPM_FILLTEMP(Addr,Word);//16位页缓冲
_SPM_PAGEWRITE(Addr;)//16位页写入
_SPM_24_ERASE(Addr); //24位页擦除
_SPM_24_FILLTEMP(Addr,Data); //24位页缓冲
_SPM_24_PAGEWRITE(Addr) //24位页写入

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/273086.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部