如何使用AVR-GCC API
4.cbi
用法:void cbi(uint8_t port, uint8_t bit);
說 明:清零port的bit位。bit的值為0~7。如果port為實(shí)際I/O寄存器,則此函數(shù)生成一條cbi指令;否則,函數(shù)生成相應(yīng)的優(yōu)化代碼。
5.inp
用 法:uint8_t inp(uint8_t port);
說明:從端口port讀入8比特的數(shù)值。如果port為常數(shù),則函數(shù)生成一條in指 令;若為變量,則函數(shù)用直接尋址指令。
6.__inw
用法:uint16_t __inw(uint8_t port);
說明: 從I/O寄存器讀入16位的數(shù)值。此函數(shù)用于讀取16位寄存器(ADC,ICR1,OCR1,TCNT1)的值,因?yàn)樽x取這些寄存器需要合適的步驟。由于 此函數(shù)只產(chǎn)生兩條匯編指令,因此要在中斷禁止時(shí)使用,否則有可能由于中斷插入到指令之間造成讀取錯(cuò)誤。
7.__inw_atomic
用 法:uint16_t __inw_atomic(uint8_t port);
說明:以原子語句方式讀取16位I/O寄存器的數(shù)值。此函數(shù)首先 禁止中斷,讀取數(shù)據(jù)之后再恢復(fù)中斷狀態(tài),因此可以安全地應(yīng)用在各種系統(tǒng)狀態(tài)。
8.loop_until_bit_is_clear
用 法:oidoid loop_until_bit_is_clear (uint8_t port, uint8_t bit);
說明:此函數(shù)簡 單地調(diào)用sbic指令來測試端口port的bit位是否清零。port必須為有效端口。
9.loop_until_bit_is_set
用 法:oidoid loop_until_bit_is_set (uint8_t port, uint8_t bit);
說明:此函數(shù)簡單地 調(diào)用sbis指令來測試端口port的bit位是否置位。port必須為有效端口。
10.outp
用法:void outp(uint8_t val, uint8_t port);
說明:將val寫入端口port。如果port為常數(shù),則函數(shù)生成一條out 指令;若為變量,則函數(shù)用直接尋址指令。
11.__outw
用法:void __outw(uint16_t val, uint8_t port);
說明:將16位的val寫入端口port。此函數(shù)適合于操作16位寄存器,如ADC,ICR1,OCR1,TCNT1。由于此函數(shù) 只產(chǎn)生兩條匯編指令,因此要在中斷禁止時(shí)使用,否則有可能由于中斷插入到指令之間造成讀取錯(cuò)誤。
12.__outw_atomic
用 法:void __outw_atomic(uint16_t val, uint8_t port);
說明:將16位的val寫入端口 port。此函數(shù)適合于操作16位寄存器,如ADC,ICR1,OCR1,TCNT1。此函數(shù)首先禁止中斷,讀取數(shù)據(jù)之后再恢復(fù)中斷狀態(tài),因此可以安全地 應(yīng)用在各種系統(tǒng)狀態(tài)。
13.sbi
用法:void sbi(uint8_t port, uint8_t bit);
說明:置位 port的bit位。bit的值為0~7。如果port為實(shí)際I/O寄存器,則此函數(shù)生成一條 sbi指令;否則,函數(shù)生成相應(yīng)的優(yōu)化代碼。
五. 看門狗API
以下函數(shù)操作看門狗。宏定義參見wdt.h。
用戶可以通過起動(dòng)代碼初始化看門狗。WDTCR的缺省值為0。如果你希望將其設(shè) 置為其他值,則需要在鏈接命令里加入相應(yīng)的命令。使用的符號(hào)為__init_wdtcr__。如下為將WDTCR設(shè)置為0x1f的例子:
avr-ld -defsym __init_wdtcr__=0x1f
1.wdt_disable
用法:void wdt_disable(void);
說明:關(guān)閉看門狗。
2.wdt_enable
用法:void wdt_disable(unit8_t timeout);
說明:使能看門狗??撮T狗溢出時(shí)間為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);
說明:產(chǎn)生喂狗指令wdr。
三.應(yīng)用程序啟動(dòng)過程(Start Up)
標(biāo) 準(zhǔn)庫文件包含一個(gè)啟動(dòng)模塊(Start Up Module),用于為真正執(zhí)行用戶程序做環(huán)境設(shè)置。
啟動(dòng)模塊完成的任務(wù)如下:
1.提 供缺省向量表
2.提供缺省中斷程序入口
3.初始化全局變量
4.初始化看門狗
5.初 始化寄存器MCUCR
6.初始化數(shù)據(jù)段
7.將數(shù)據(jù)段.bss的內(nèi)容清零
8.跳轉(zhuǎn)到 main()。(不用調(diào)用方式,因?yàn)閙ain()不用返回)
啟動(dòng)模塊包含缺省中斷向量表,其內(nèi)容為預(yù)先定義好的函數(shù)名稱。這些函數(shù)名稱可以由程序 員重載。中斷向量表的第一個(gè)內(nèi)容為復(fù)位向量,執(zhí)行結(jié)果是將程序跳轉(zhuǎn)到_init_。在啟動(dòng)模塊里,_init_表示的地址與_real_init_指向的 地址相同。如果要加入客戶代碼,則需要在程序里定義一個(gè)_init_函數(shù)。在此函數(shù)的末尾跳轉(zhuǎn)到_real_init_。具體實(shí)現(xiàn)如下:
void _real_init_(void);
void _init_(void) __attribute__((naked));
void _init_(void)
{
// 用戶代碼
// 最后的代碼必須為:
asm ("rjmp _real_init_");
}
在_real_init_部 分,系統(tǒng)將設(shè)置看門狗和MCUCR寄存器。啟動(dòng)模塊并沒有真正取用相應(yīng)寄存器的設(shè)置數(shù)值(以符號(hào) _init_wdctr_,_init_mcucr_,_init_emcucr_表示),而是通過地址來取得其值。因而用戶可以通過鏈接器的 --defsym選項(xiàng)來設(shè)置這些符號(hào)的地址。如果用戶沒有定義,則啟動(dòng)模塊將使用缺省值。
接下來系統(tǒng)將從程序存儲(chǔ)器里把具有初值的全局變量加載到 數(shù)據(jù)存儲(chǔ)器SRAM。然后是將數(shù)據(jù)段.bbs清零。此數(shù)據(jù)段包含所有沒有的初值的非AUTO變量。
最后,系統(tǒng)跳轉(zhuǎn)到main()函數(shù),用戶代碼開 始執(zhí)行。系統(tǒng)對(duì)此特殊函數(shù)加入一些特殊的處理。進(jìn)入此函數(shù)后,堆棧指向SRAM的末尾。
評(píng)論