如何使用AVR-GCC API
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的末尾。
評論