新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 如何使用AVR-GCC API

        如何使用AVR-GCC API

        作者: 時間:2016-11-25 來源:網絡 收藏

        4.cbi
        用法:void cbi(uint8_t port, uint8_t bit);
        說 明:清零port的bit位。bit的值為0~7。如果port為實際I/O寄存器,則此函數生成一條cbi指令;否則,函數生成相應的優化代碼。
        5.inp
        用 法:uint8_t inp(uint8_t port);
        說明:從端口port讀入8比特的數值。如果port為常數,則函數生成一條in指 令;若為變量,則函數用直接尋址指令。
        6.__inw
        用法:uint16_t __inw(uint8_t port);
        說明: 從I/O寄存器讀入16位的數值。此函數用于讀取16位寄存器(ADC,ICR1,OCR1,TCNT1)的值,因為讀取這些寄存器需要合適的步驟。由于 此函數只產生兩條匯編指令,因此要在中斷禁止時使用,否則有可能由于中斷插入到指令之間造成讀取錯誤。
        7.__inw_atomic
        用 法:uint16_t __inw_atomic(uint8_t port);
        說明:以原子語句方式讀取16位I/O寄存器的數值。此函數首先 禁止中斷,讀取數據之后再恢復中斷狀態,因此可以安全地應用在各種系統狀態。
        8.loop_until_bit_is_clear
        用 法:oidoid loop_until_bit_is_clear (uint8_t port, uint8_t bit);
        說明:此函數簡 單地調用sbic指令來測試端口port的bit位是否清零。port必須為有效端口。
        9.loop_until_bit_is_set
        用 法:oidoid loop_until_bit_is_set (uint8_t port, uint8_t bit);
        說明:此函數簡單地 調用sbis指令來測試端口port的bit位是否置位。port必須為有效端口。
        10.outp
        用法:void outp(uint8_t val, uint8_t port);
        說明:將val寫入端口port。如果port為常數,則函數生成一條out 指令;若為變量,則函數用直接尋址指令。
        11.__outw
        用法:void __outw(uint16_t val, uint8_t port);
        說明:將16位的val寫入端口port。此函數適合于操作16位寄存器,如ADC,ICR1,OCR1,TCNT1。由于此函數 只產生兩條匯編指令,因此要在中斷禁止時使用,否則有可能由于中斷插入到指令之間造成讀取錯誤。
        12.__outw_atomic
        用 法:void __outw_atomic(uint16_t val, uint8_t port);
        說明:將16位的val寫入端口 port。此函數適合于操作16位寄存器,如ADC,ICR1,OCR1,TCNT1。此函數首先禁止中斷,讀取數據之后再恢復中斷狀態,因此可以安全地 應用在各種系統狀態。
        13.sbi
        用法:void sbi(uint8_t port, uint8_t bit);
        說明:置位 port的bit位。bit的值為0~7。如果port為實際I/O寄存器,則此函數生成一條 sbi指令;否則,函數生成相應的優化代碼。
        五. 看門狗API
        以下函數操作看門狗。宏定義參見wdt.h。
        用戶可以通過起動代碼初始化看門狗。WDTCR的缺省值為0。如果你希望將其設 置為其他值,則需要在鏈接命令里加入相應的命令。使用的符號為__init_wdtcr__。如下為將WDTCR設置為0x1f的例子:
        avr-ld -defsym __init_wdtcr__=0x1f
        1.wdt_disable
        用法:void wdt_disable(void);
        說明:關閉看門狗。
        2.wdt_enable
        用法:void wdt_disable(unit8_t timeout);
        說明:使能看門狗。看門狗溢出時間為timeout。
        timeout 周期
        016K CLK
        132K CLK
        264K CLK
        3128K CLK
        4256K CLK
        5512K CLK
        61024K CLK
        72048K CLK

        3.wdt_reset
        用 法:void wdt_reset(void);
        說明:產生喂狗指令wdr。

        三.應用程序啟動過程(Start Up)
        標 準庫文件包含一個啟動模塊(Start Up Module),用于為真正執行用戶程序做環境設置。
        啟動模塊完成的任務如下:
        1.提 供缺省向量表
        2.提供缺省中斷程序入口
        3.初始化全局變量
        4.初始化看門狗
        5.初 始化寄存器MCUCR
        6.初始化數據段
        7.將數據段.bss的內容清零
        8.跳轉到 main()。(不用調用方式,因為main()不用返回)
        啟動模塊包含缺省中斷向量表,其內容為預先定義好的函數名稱。這些函數名稱可以由程序 員重載。中斷向量表的第一個內容為復位向量,執行結果是將程序跳轉到_init_。在啟動模塊里,_init_表示的地址與_real_init_指向的 地址相同。如果要加入客戶代碼,則需要在程序里定義一個_init_函數。在此函數的末尾跳轉到_real_init_。具體實現如下:
        void _real_init_(void);
        void _init_(void) __attribute__((naked));
        void _init_(void)
        {
        // 用戶代碼

        // 最后的代碼必須為:
        asm ("rjmp _real_init_");
        }

        在_real_init_部 分,系統將設置看門狗和MCUCR寄存器。啟動模塊并沒有真正取用相應寄存器的設置數值(以符號 _init_wdctr_,_init_mcucr_,_init_emcucr_表示),而是通過地址來取得其值。因而用戶可以通過鏈接器的 --defsym選項來設置這些符號的地址。如果用戶沒有定義,則啟動模塊將使用缺省值。
        接下來系統將從程序存儲器里把具有初值的全局變量加載到 數據存儲器SRAM。然后是將數據段.bbs清零。此數據段包含所有沒有的初值的非AUTO變量。
        最后,系統跳轉到main()函數,用戶代碼開 始執行。系統對此特殊函數加入一些特殊的處理。進入此函數后,堆棧指向SRAM的末尾。

        上一頁 1 2 下一頁

        關鍵詞: AVR-GCCAP

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 岳西县| 白沙| 闽清县| 西峡县| 桓台县| 辽源市| 越西县| 望城县| 华蓥市| 涿鹿县| 和林格尔县| 新田县| 资中县| 防城港市| 永善县| 彭山县| 静宁县| 盐源县| 仙桃市| 遂昌县| 永春县| 乐清市| 孟连| 亚东县| 安远县| 定兴县| 京山县| 彰武县| 宜州市| 呼和浩特市| 册亨县| 盘锦市| 郯城县| 紫阳县| 固安县| 滨海县| 微山县| 南澳县| 宁乡县| 大城县| 泰来县|