在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > AVR單片機三種存儲器使用問題

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

            作者: 時間:2013-12-10 來源:網(wǎng)絡(luò) 收藏

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

            1. I/O 寄存器操作
            I/O 專用寄存器(SFR)被編址到與內(nèi)部SRAM 同一個地址空間,為此對它的操作和SRAM 變量操作類似。
            SFR 定義文件的包含:
            #include avr/io.h>
            io.h 文件在編譯器包含路徑下的avr 目錄下,由于AVR 各器件間存在同名寄存器地址有不同的問題,io.h 文件不直接定義SFR 寄存器宏,它根據(jù)在命令行給出的 –mmcu 選項再包含合適的 ioxxxx.h 文件。在器件對應(yīng)的ioxxxx.h 文件中定義了器件SFR 的預(yù)處理宏,在程序中直接對它賦值或引用的方式讀寫SFR,如:
            PORTB=0XFF;
            Val=PINB;
            從io.h 和其總包含的頭文件sfr_defs.h 可以追溯宏P(guān)ORTB 的原型在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 操作的相同點。
            關(guān)鍵字volatile 確保本條指令不會因C 編譯器的優(yōu)化而被省略。

            2. SRAM 內(nèi)變量的使用
            一個沒有其它屬性修飾的 C 變量定義將被指定到內(nèi)部SRAM,avr-libc 提供一個整數(shù)類型定義文件inttype.h,其中定義了常用的整數(shù)類型如下表:
            定義值長度(字節(jié)) 值范圍
            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
            根據(jù)習(xí)慣,在程序中可使用以上的整數(shù)定義。定義、初始化和引用
            如下示例:
            uint8_t val=8; 定義了一個SRAM 變量并初始化成8
            val=10; 改變變量值
            const uint8_t val=8; 定義SRAM 區(qū)常量
            register uint8_t val=10; 定義寄存器變量
            3. 在程序中訪問FLASH 程序存儲器
            avr-libc 支持頭文件:pgmspace.h
            #include avr/pgmspace.h >
            在程序存儲器內(nèi)的數(shù)據(jù)定義使用關(guān)鍵字 __attribute__((__progmem__))。在pgmspace.h
            中它被定義成符號 PROGMEM。
            (1). FLASH 區(qū)整數(shù)常量應(yīng)用
            定義格式:
            數(shù)據(jù)類型 常量名 PROGMEM = 值 ;
            如:
            char val8 PROGMEM = 1 ;
            int val16 PROGMEM = 1 ;
            long val32 PROGMEM =1 ;
            對于不同長度的整數(shù)類型 avr-libc 提供對應(yīng)的讀取函數(shù):
            pgm_read_byte(prog_void * addr)
            pgm_read-word(prg_void *addr)
            pgm_read_dword(prg_void* addr)
            另外在pgmspace.h 中定義的8 位整數(shù)類型 prog_char prog_uchar 分別指定在FLASH 內(nèi)的8 位有符號整數(shù)和8 位無符號整數(shù)。應(yīng)用方式如下:
            char ram_val; //ram 內(nèi)的變量
            const prog_char flash_val = 1; //flash 內(nèi)常量
            ram_val=pgm_read_byte(flash_val); //讀flash 常量值到RAM 變量
            對于應(yīng)用程序FLASH 常量是不可改變的,因此定義時加關(guān)鍵字const 是個好的習(xí)慣。

            單片機相關(guān)文章:單片機教程


            單片機相關(guān)文章:單片機視頻教程


            單片機相關(guān)文章:單片機工作原理


            存儲器相關(guān)文章:存儲器原理


            塵埃粒子計數(shù)器相關(guān)文章:塵埃粒子計數(shù)器原理

            上一頁 1 2 下一頁

            關(guān)鍵詞: AVR單片機 存儲器 RAM

            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉