AVR單片機(jī)i/o(輸入/輸出)端口詳解
輸入/輸出端口(I/O端口)是單片機(jī)所能依賴進(jìn)行控制的唯一通道,如果把單片機(jī)內(nèi)核比作人的大腦,那I/O端口就相當(dāng)于人的五官和四肢,負(fù)責(zé)著信息的獲取和動作的執(zhí)行,如果沒有I/O端口單片機(jī)本身就變得毫無意義,因此很有必要來詳細(xì)了解它們的內(nèi)部結(jié)構(gòu)。ATMega16的端口為具有可選上拉電阻的雙向I/O端口,下面是其中某一位I/O口的內(nèi)部結(jié)構(gòu)圖(來自于Datasheet)。
在上圖中,Pxn就是這一位的輸入/輸出端口,也就是單片機(jī)的某個(gè)外部引腳。它通過PORTxn寄存器和數(shù)據(jù)總線(DATA BUS)相連。前面示例中對PORTxn的賦值其實(shí)就是通過數(shù)據(jù)總線來寫這個(gè)寄存器實(shí)現(xiàn)的。在圖中還可以看到,在Pxn和PORTxn之間實(shí)際上還串有一個(gè)門控位,如果要讓PORTxn的結(jié)果輸出至Pxn,那這個(gè)門控位必須得打開,而該門控位的受控信號來自于DDxn(DDRx中的一位)寄存器。通過數(shù)據(jù)總線對該寄存器位寫1,就可打開門控位,讓輸出信號直接輸出至引腳Pxn。這也正是為什么單片機(jī)引腳要處于輸出狀態(tài)就必須要給DDRx方向寄存器賦值1的原因所在。如果給DDxn賦值0,則門控位斷開,引腳Pxn不能做為輸出,只能做為輸入。但輸入信號可以取自兩個(gè)地方,一個(gè)是直接從外部引腳Pxn來取(圖中的下半部分),實(shí)際上是把外部引腳的信號鎖存到PINxn寄存器中來讀取;另一個(gè)則是從輸出寄存器PORTxn來?。▓D中門控位控制信號為RRx的地方)。一般稱“從外部引腳(PINxn)來取”為讀引腳,稱“從寄存器PORTxn來取”為讀端口寄存器。
從圖中還可以看出,在引腳Pxn的上方,有一個(gè)受控于MOS管的上拉電阻。而MOS管又同時(shí)受到PUD位、DDxn位和PORTxn位的共同控制。當(dāng)引腳做為輸入時(shí)(DDxn=0),在給PORTxn賦值1后,通過PUD就可以控制引腳是否使用上拉電阻。當(dāng)PUD位為0時(shí),上拉電阻有效,否則相反。PUD存在于寄存器SFIOR中的第2位,見下圖。
下面幾個(gè)圖給出了以端口A為代表的三個(gè)寄存器配置的具體情況:
從圖中可以看出,PORT和DDR兩個(gè)寄存器為可讀可寫的,而PIN寄存器為只讀的。對于寄存器中每一位的操作,在IAR開發(fā)環(huán)境中可以直接引用,這在第二個(gè)示例中已經(jīng)闡述過了。下表給出了這幾個(gè)寄存器組合配置的具體情況:
在使用I/O端口時(shí)還有幾點(diǎn)需要說明一下:
1、作為通用數(shù)字I/O使用時(shí),所有I/O端口都具有真正的讀――修改――寫的功能。
2、不論如何配置DDxn,都可以通過讀取PINxn寄存器來獲得引腳電平。
3、讀取軟件賦予的引腳電平時(shí),需要在賦值指令和讀取指令之間至少有一個(gè)時(shí)鐘周期的間隔(可插入一條nop指令)。
4、如果某些引腳未被使用,建議還是給這些引腳賦予一個(gè)確定電平。
5、復(fù)位時(shí),上拉電阻將被禁用,各引腳為高阻態(tài)。
6、穩(wěn)定狀態(tài)條件下每個(gè)I/O端口可以承受的拉電流或灌電流為:VCC=5V時(shí)為20mA、VCC=3V時(shí)為10mA。
7、所有端口拉電流或灌電流的總和不能超過400mA,且端口A、B、C、D各自的拉電流或灌電流總和不能超過200mA(在DIP封裝方式下,端口B、C、D可達(dá)300mA)。
除了通用數(shù)字I/O功能之外,大多數(shù)端口引腳都還具有第二功能,這也就是所謂的端口復(fù)用。因?yàn)閱纹瑱C(jī)的引腳畢竟是有限的,而且在大多數(shù)時(shí)候做為通用數(shù)字I/O口的引腳不一定全部用完,所以不必為單片機(jī)再實(shí)現(xiàn)其它功能而單獨(dú)制作引腳。比如A/D(模/數(shù))轉(zhuǎn)換,就可不必再單獨(dú)為單片機(jī)做輸入引腳,而直接把這個(gè)功能附屬在PORTA的I/O口上就可以了。這樣PORTA的八個(gè)引腳就有了第二功能,即做為A/D轉(zhuǎn)換的信號輸入端。當(dāng)然,在某個(gè)時(shí)刻只能使用其中的一種功能,不可能兩種功能同時(shí)使用,所以才稱之為復(fù)用。這里要注意,所謂的第二功能只是一種說法,有些單片機(jī)的引腳復(fù)用的很厲害,可以實(shí)現(xiàn)兩種以上的功能。
要實(shí)現(xiàn)引腳的第二功能,其端口內(nèi)部結(jié)構(gòu)較為復(fù)雜,這里就不再進(jìn)行深入探討了,以下僅給出ATMega16單片機(jī)引腳復(fù)用的第二功能。
要實(shí)現(xiàn)端口的第二功能,當(dāng)然還必須得有相關(guān)的寄存器來進(jìn)行選擇控制。不同的第二功能所配置的寄存器不同,配置方式也不一樣,因此要根據(jù)實(shí)際情況來確定。引腳第二功能的具體使用會在后續(xù)的相關(guān)討論中進(jìn)行詳細(xì)講述
評論