新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR單片機三種存儲器使用問題

        AVR單片機三種存儲器使用問題

        作者: 時間:2013-12-10 來源:網絡 收藏

        AVR 系列單片機內部有三種類型的被獨立編址的,它們分別為:Flash 程序、內部S 數據和EEPROM 數據存儲器。
        Flash 存儲器為1K~128K 字節,支持并行編程和串行下載,下載壽命通常可達10,000 次。由于AVR 指令都為16 位或32 位,程序計數器對它按字進行尋址,因此FLASH 存儲器按字組織的,但在程序中訪問 FLASH 存儲區時專用指令LPM 可分別讀取指定地址的高低字節。
        寄存器堆(R0~R31)、I/O 寄存器和S 被統一編址。所以對寄存器和I/O 口的操作使用與訪問內部S 同樣的指令。32 個通用寄存器被編址到最前,I/O 寄存器占用接下來的64 個地址。從0X0060 開始為內部SRAM。外部SRAM 被編址到內部SRAM 后。
        AVR 單片機的內部有64~4K 的EEPROM 數據存儲器,它們被獨立編址,按字節組織。擦寫壽命可達100,000 次。

        1. I/O 寄存器操作
        I/O 專用寄存器(SFR)被編址到與內部SRAM 同一個地址空間,為此對它的操作和SRAM 變量操作類似。
        SFR 定義文件的包含:
        #include avr/io.h>
        io.h 文件在編譯器包含路徑下的avr 目錄下,由于AVR 各器件間存在同名寄存器地址有不同的問題,io.h 文件不直接定義SFR 寄存器宏,它根據在命令行給出的 –mmcu 選項再包含合適的 ioxxxx.h 文件。在器件對應的ioxxxx.h 文件中定義了器件SFR 的預處理宏,在程序中直接對它賦值或引用的方式讀寫SFR,如:
        PORTB=0XFF;
        Val=PINB;
        從io.h 和其總包含的頭文件sfr_defs.h 可以追溯宏PORTB 的原型在io2313.h 中定義:
        #define PORTB _SFR_IO8(0x18)
        在sfr_defs.h 中定義:
        #define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + 0x20)
        #define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
        這樣PORTB=0XFF; 就等同于 *(volatile unsigned char *)(0x38)=0xff;
        0x38 在器件AT90S2313 中PORTB 的地址對SFR 的定義宏進一步說明了SFR 與SRAM 操作的相同點。
        關鍵字volatile 確保本條指令不會因C 編譯器的優化而被省略。

        2. SRAM 內變量的使用
        一個沒有其它屬性修飾的 C 變量定義將被指定到內部SRAM,avr-libc 提供一個整數類型定義文件inttype.h,其中定義了常用的整數類型如下表:
        定義值長度(字節) 值范圍
        int8_t 1 -128~127
        uint8_t 1 0~255
        int16_t 2 -32768~32767
        uint16_t 2 0~65535
        int32_t 4 -2147483648~2147483647
        uint32_t 4 0~4294967295
        int64_t 8 -9.22*10^18~-9.22*10^18
        uint64_t 8 0~1.844*10^19
        根據習慣,在程序中可使用以上的整數定義。定義、初始化和引用
        如下示例:
        uint8_t val=8; 定義了一個SRAM 變量并初始化成8
        val=10; 改變變量值
        const uint8_t val=8; 定義SRAM 區常量
        register uint8_t val=10; 定義寄存器變量
        3. 在程序中訪問FLASH 程序存儲器
        avr-libc 支持頭文件:pgmspace.h
        #include avr/pgmspace.h >
        在程序存儲器內的數據定義使用關鍵字 __attribute__((__progmem__))。在pgmspace.h
        中它被定義成符號 PROGMEM。
        (1). FLASH 區整數常量應用
        定義格式:
        數據類型 常量名 PROGMEM = 值 ;
        如:
        char val8 PROGMEM = 1 ;
        int val16 PROGMEM = 1 ;
        long val32 PROGMEM =1 ;
        對于不同長度的整數類型 avr-libc 提供對應的讀取函數:
        pgm_read_byte(prog_void * addr)
        pgm_read-word(prg_void *addr)
        pgm_read_dword(prg_void* addr)
        另外在pgmspace.h 中定義的8 位整數類型 prog_char prog_uchar 分別指定在FLASH 內的8 位有符號整數和8 位無符號整數。應用方式如下:
        char ram_val; //ram 內的變量
        const prog_char flash_val = 1; //flash 內常量
        ram_val=pgm_read_byte(flash_val); //讀flash 常量值到RAM 變量
        對于應用程序FLASH 常量是不可改變的,因此定義時加關鍵字const 是個好的習慣。

        單片機相關文章:單片機教程


        單片機相關文章:單片機視頻教程


        單片機相關文章:單片機工作原理


        存儲器相關文章:存儲器原理


        塵埃粒子計數器相關文章:塵埃粒子計數器原理

        上一頁 1 2 下一頁

        關鍵詞: AVR單片機 存儲器 RAM

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 清河县| 江门市| 石棉县| 东丰县| 灌南县| 云龙县| 伊通| 霍邱县| 中山市| 安国市| 扎兰屯市| 衡阳县| 神木县| 安泽县| 六安市| 依安县| 屯留县| 万荣县| 梅河口市| 凌源市| 海门市| 五常市| 密云县| 棋牌| 汶川县| 柘荣县| 克东县| 建水县| 无棣县| 梨树县| 双桥区| 巨鹿县| 沐川县| 彭水| 恩施市| 黑水县| 南投市| 塔河县| 滨州市| 宜阳县| 双牌县|