您当前的位置:五五电子网电子知识电子学习基础知识电脑-单片机-自动控制IAR for AVR 学习笔记(4)--AVR单片机内部Flash操作 正文
IAR for AVR 学习笔记(4)--AVR单片机内部Flash操作

IAR for AVR 学习笔记(4)--AVR单片机内部Flash操作

点击数:7809 次   录入时间:03-04 11:38:45   整理:http://www.55dianzi.com   电脑-单片机-自动控制

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<iom8.h>
__flash unsigned char p[];
__flash unsigned char a;
void main(void)
{PORTB=p[1];// 读flash 数组变量的操作
PORTB=a;// 读flash 变量的操作
}
由于在正常的程序中,flash 空间是只读的,所以没有赋值的变量是没有意义的。定义常数在flash 空间,只要给变量赋与初值就可以了。由于常数在flash空间的地址是随机分配的,读取变量才可以读取到常数值。
10
IAR-AVR –C 编译器简要指南
__flash unsigned char a=9;//定义一个常数存放在EEPROM空间。
__flash unsigned char p[]={1,2,3,4,5,6,7,8};
//定义一个组常数存放在flash 空间。
例:
#i nclude<iom8.h>
__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<iom8.h>
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<iom8.h>
__flash unsigned char p;//控制存放
void main(void)
{
  unsigned char __flash* t;//控制属性
  PORTB=p;
  PORTB=*t;
}

4.4. __root 关键字保证没有使用的函数或者变量也能够包含在目标代码中.
定义存放在__flash 空间的数据在程序编译时会自动生成代码嵌入到flash代码中,对于程序没有使用也要求编译的数据(比如可以在代码中嵌入你的版本号,时间等)必须加关键字__root 限制。
例:
#i nclude<iom8.h>
__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<iom8.h>
#i nclude <intrinsics.h>
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<iom8.h>
#i nclude<comp_a90.h>
#i nclude<intrinsics.h>
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位页写入




本文关键字:单片机  FLASH  电脑-单片机-自动控制电子学习 - 基础知识 - 电脑-单片机-自动控制