新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > IAR for AVR 學習筆記(4)--Flash操作

        IAR for AVR 學習筆記(4)--Flash操作

        作者: 時間:2016-11-13 來源:網絡 收藏
        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
        IAR-AVR –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 空間值
        }

        本文引用地址:http://www.104case.com/article/201611/316459.htm

        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位頁寫入



        關鍵詞: IARAVRFlash操

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 观塘区| 仁化县| 汉寿县| 云龙县| 鄢陵县| 林口县| 仲巴县| 姜堰市| 盐源县| 陆良县| 柳河县| 昌吉市| 靖江市| 武乡县| 交城县| 金乡县| 澄江县| 大新县| 凯里市| 石门县| 厦门市| 桦川县| 长子县| 从江县| 江都市| 古交市| 义马市| 新竹县| 化州市| 大宁县| 米易县| 城市| 桑日县| 永和县| 漯河市| 江门市| 墨竹工卡县| 彭山县| 大方县| 双流县| 万源市|