zoukankan      html  css  js  c++  java
  • 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<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位页写入

    大部分转载 小部分自写
  • 相关阅读:
    14.3.1选择选项
    14.3 选择框表单
    14.2.4HTML5约束API验证
    input标签之外是否一定添加form标签
    14.2.3自动切换焦点
    php设计模式---抽象模式模式
    php设计模式---简单工厂模式
    git基本教程,每天更新
    第5章 卷积神经网络
    第3章 深度学习基础
  • 原文地址:https://www.cnblogs.com/8586/p/1685165.html
Copyright © 2011-2022 走看看