單片機(jī)必須了解的外設(shè)功能――GPIO/串行通信
活學(xué)活用單片機(jī)連載將介紹有效使用單片機(jī)外設(shè)功能的結(jié)構(gòu)及使用方法,能讓我們將能學(xué)到各種單片機(jī)共通的基本外設(shè)功能,并可廣泛應(yīng)用到各個(gè)方面。單片機(jī)僅靠CPU和內(nèi)存是無(wú)法運(yùn)行的!本文介紹 GPIO和串行通信。
本文引用地址:http://www.ex-cimer.com/article/201808/386035.htm有效使用單片機(jī)不可或缺的“外設(shè)功能”是什么呢?
正如過(guò)去連載的“單片機(jī)入門(mén)”系列中所介紹的那樣,對(duì)電子產(chǎn)品進(jìn)行控制的單片機(jī)是由CPU、內(nèi)存及外設(shè)功能等部分組成的(圖1)。CPU根據(jù)指令(程序),執(zhí)行運(yùn)算、數(shù)據(jù)的讀寫(xiě)以及進(jìn)行條件判斷等,而內(nèi)存則用來(lái)保存該程序(記憶)。
外設(shè)功能是指為了使單片機(jī)便于使用的各種功能。例如,CPU為了與外部的傳感器及開(kāi)關(guān)等進(jìn)行信號(hào)交換,就需要“輸入/輸出端口(I/O端口)”這種外設(shè)功能。
而且,將模擬輸入信號(hào)轉(zhuǎn)換為數(shù)字值的“A/D轉(zhuǎn)換器”以及反過(guò)來(lái)將數(shù)字值轉(zhuǎn)換為模擬輸出信號(hào)的“D/A轉(zhuǎn)換器”則是單片機(jī)對(duì)各種信號(hào)進(jìn)行處理時(shí)不可或缺的外設(shè)功能。
另外,還有為了正確測(cè)量時(shí)間所用的“定時(shí)器”以及提供日期和時(shí)計(jì)的“實(shí)時(shí)時(shí)鐘(RTC)”,用于進(jìn)行與時(shí)間相關(guān)的處理,此外還有將并行信號(hào)(parallel signal)和串行信號(hào)(serial signal)進(jìn)行互相交換的“UART(Universal Asynchronous Receiver Transmitter,通用異步收發(fā)器)”等,以便進(jìn)行通信。
本連載中,將以瑞薩電子單片機(jī)--RX63N為例,介紹令單片機(jī)更便于使用的外設(shè)功能的基礎(chǔ)知識(shí)。我們將使用搭載了“RX63N”程序的電子板“GR-SAKURA”進(jìn)行說(shuō)明,請(qǐng)你也實(shí)際操作試試看吧!
了解數(shù)字信號(hào)的輸入/輸出端口---“GPIO”
在“輸入/輸出端口(I/O端口)”中,數(shù)字信號(hào)的輸入/輸出端口即“GPIO(General Purpose Input/Output)”也被稱(chēng)為“通用I/O端口”,是一種用于數(shù)字信號(hào)輸入/輸出的非常方便的端口。用于將數(shù)字輸出的傳感器值和開(kāi)關(guān)的ON/OFF值傳送到單片機(jī)的輸入端及通過(guò)LED來(lái)顯示單片機(jī)的運(yùn)算結(jié)果,以及輸出用于驅(qū)動(dòng)電機(jī)運(yùn)行的信號(hào)等等。
GPIO被稱(chēng)為通用端口是其引腳既可以用于輸入也可以用于輸出。在早期的單片機(jī)中,引腳都被固定用于輸入或輸出,但是現(xiàn)在很多單片機(jī)中都可以自由地將其設(shè)定為輸入或輸出端口。假設(shè)GPIO端子有8個(gè)引腳,則可以將4個(gè)引腳用于輸入,另4個(gè)引腳用于輸出,也可以將1個(gè)引腳用于輸入,剩下的7個(gè)引腳用于輸出。
在GPIO中,為了使CPU和外部設(shè)備之間進(jìn)行數(shù)據(jù)交換,要相互執(zhí)行通過(guò)程序處理的數(shù)字值(0或1)與信號(hào)(電壓的LOW電平或HIGH電平)的轉(zhuǎn)換。下面是作為RX63N單片機(jī)的GPIO端口基礎(chǔ)的寄存器(※1)的作用(圖2)。
(※1)寄存器(Register):存在于單片機(jī)的CPU和外設(shè)功能內(nèi)部中的記憶回路。用于運(yùn)算和保持CPU的執(zhí)行狀態(tài)。由于是作為CPU及外設(shè)功能的內(nèi)部回路,所以在對(duì)內(nèi)存進(jìn)行寫(xiě)入和讀取時(shí)速度很快,但容量卻非常小,既有可以用于各種用途的寄存器(通用寄存器),又有用于某些限定的功能和用途的特殊寄存器。
端口方向寄存器(PDR)
決定引腳方向的寄存器,也稱(chēng)為“方向寄存器”。
端口輸入數(shù)據(jù)寄存器(PIDR)
輸入時(shí)反映所使用的引腳狀態(tài)的寄存器。從引腳輸入LOW電平或者HIGH電平時(shí)會(huì)將之轉(zhuǎn)換為0或1的值并讀取該轉(zhuǎn)換結(jié)果。隨著引腳的變化數(shù)值也將發(fā)生變化。所以不會(huì)保持讀取時(shí)的值。
端口輸出數(shù)據(jù)寄存器(PODR)
此寄存器保存用作輸出引腳的輸出數(shù)據(jù)。將0或1的值轉(zhuǎn)換為L(zhǎng)OW電平或HIGH電平信號(hào)并從引腳輸出。由于可以與內(nèi)存一樣保持改寫(xiě)前的值,所以在改寫(xiě)前來(lái)自引腳的輸出電壓也將保持不變。
通過(guò)GR-SAKURA來(lái)體驗(yàn)活用了GPIO的程序!
本期我們將通過(guò)“按下開(kāi)關(guān)時(shí)LED會(huì)發(fā)光”這個(gè)程序來(lái)學(xué)習(xí)GPIO的運(yùn)行。我們將利用GR-SAKURA專(zhuān)用的程序庫(kù)進(jìn)行編程。(櫻花程序庫(kù)的“數(shù)字I/O”)(僅英文版)
在櫻花程序庫(kù)(SAKURA Library)的“數(shù)字I/O”中,電路板上的I/O專(zhuān)用引腳究竟是用作輸入還是用作輸出最初由pinMode(引腳號(hào)、模式)函數(shù)來(lái)指定。一旦指定后,只要引腳的用法沒(méi)發(fā)生變化就無(wú)需執(zhí)行pinMode函數(shù)。
用作輸入時(shí),通過(guò)digitalRead函數(shù)來(lái)指定引腳號(hào),結(jié)果將被作為HIGH電平或LOW電平信號(hào)被返送回。用作輸出時(shí)通過(guò)digitalWrite函數(shù)來(lái)指定引腳號(hào)。值還是HIGH電平或LOW電平,HIGH電平相當(dāng)于1,LOW電平相當(dāng)于0,所以也可將之記述為0或1。
由于這次使用的是GR-SAKURA電路板上的開(kāi)關(guān)和LED,所以即使不知道與其相連的引腳號(hào)和端口號(hào),如為開(kāi)關(guān),只需在程序中寫(xiě)入“PIN_SW”,如為L(zhǎng)ED,只需在程序中寫(xiě)入“PIN_LED0”?“PIN_LED3”,櫻花程序庫(kù)(SAKURA Library)就會(huì)進(jìn)行處理。
圖3所示的是使用GPIO時(shí),通過(guò)LED的閃爍來(lái)反映開(kāi)關(guān)的值的程序例。首先通過(guò)pinMode函數(shù)來(lái)指定與開(kāi)關(guān)相連的引腳作為輸入引腳,將與LED連接的引腳作為輸出引腳(①)。只需在開(kāi)始時(shí)定義一次就夠了,之后將在setup函數(shù)中進(jìn)行處理。
接下來(lái),“只要按下開(kāi)關(guān)LED就點(diǎn)亮,不按開(kāi)關(guān)LED就熄滅”的部分在loop函數(shù)中進(jìn)行處理。開(kāi)關(guān)是否被按下要根據(jù)digitalRead(PIN_SW)返回的值來(lái)判斷。所以GR-SAKURA的開(kāi)關(guān)在什么都不做(松開(kāi))的狀態(tài)下為HIGH電平(通過(guò)上拉電阻連接電源),被按下時(shí)為L(zhǎng)OW電平(連接GND)。
如果digitalRead(PIN_SW)返回的值為L(zhǎng)OW電平時(shí)=開(kāi)關(guān)被按下(②)、LED將被點(diǎn)亮。D1的LED為digitalWrite(PIN_LED0, HIGH)時(shí)將被點(diǎn)亮(③)。
如果判斷為開(kāi)關(guān)沒(méi)被按下時(shí),當(dāng)是digitalWrite(PIN_LED0, LOW)時(shí)(④),GPIO的輸出為L(zhǎng)OW電平,LED熄滅。
圖3:程序例
請(qǐng)?jiān)囍褂肎R-SAKURA的Web編譯器來(lái)執(zhí)行圖4所示的程序。Web編譯器的使用方法請(qǐng)參考嵌入系統(tǒng)入門(mén)系列的“第一次挑戰(zhàn)制作!
程序的提示 通過(guò)“振蕩”來(lái)防止誤操作
開(kāi)關(guān)是用來(lái)接通(開(kāi)關(guān)有時(shí)顯示為“關(guān)”)和切斷(開(kāi)關(guān)有時(shí)顯示為“開(kāi)”)電路的,即開(kāi)和關(guān)。在開(kāi)關(guān)等裝置機(jī)械地進(jìn)行開(kāi)和關(guān)的操作時(shí),任何一種狀態(tài)都不可能在一瞬間完成。裝置會(huì)發(fā)生非常快速的振動(dòng),并非常精細(xì)地在開(kāi)和關(guān)之間反復(fù)動(dòng)作后才會(huì)轉(zhuǎn)變?yōu)樾碌臓顟B(tài)。這種現(xiàn)象被稱(chēng)為“振蕩”。為了讓大家更容易理解“振蕩”的現(xiàn)象,我們制作了一個(gè)簡(jiǎn)單易懂的體驗(yàn)程序(圖4)。請(qǐng)大家也試著體驗(yàn)一下吧。
圖4:振蕩體驗(yàn)程序
試著通過(guò)控制開(kāi)關(guān)反復(fù)點(diǎn)亮、熄滅LED來(lái)執(zhí)行所期望的動(dòng)作,怎么樣?是不是有時(shí)如你所愿,有時(shí)又適得其反?產(chǎn)生這種現(xiàn)象的原因就是因?yàn)檎袷帯H绻麑⒄駝?dòng)過(guò)程中的狀態(tài)作為開(kāi)關(guān)的信號(hào)讀取出來(lái),將得不到正確的結(jié)果。因此,需用防振蕩程序來(lái)解決。
在圖3的程序中,檢測(cè)到開(kāi)關(guān)最初被按下后先停止50微妙(0.05秒)后再進(jìn)行處理(圖3中的⑤)。如果不停止,在檢測(cè)到開(kāi)關(guān)被按下時(shí)雖然LED也會(huì)亮燈,但接下來(lái)確認(rèn)開(kāi)關(guān)的狀態(tài)時(shí),由于振蕩的原因,有可能會(huì)認(rèn)為是“開(kāi)關(guān)處于松開(kāi)的狀態(tài)”(因?yàn)檩斎霑簳r(shí)還沒(méi)返回到HIGH)而導(dǎo)致LED熄滅。因此,如上所述,我們通過(guò)在開(kāi)關(guān)的狀態(tài)穩(wěn)定之前停止處理(50微妙)的方式來(lái)解決這個(gè)問(wèn)題。
我們一起學(xué)習(xí)了GPIO的結(jié)構(gòu)和使用方法。如果將程序中的PIN_LED0的部分換成別的LED號(hào)(僅在選0?3時(shí)有效),將可以變換閃爍的LED。另外,如果改寫(xiě)判斷部分的程序,也可以進(jìn)行諸如“按兩次則LED亮燈,接下來(lái)再按1次時(shí)熄滅”等復(fù)雜的處理。這次的體驗(yàn)程序只使用了GR-SAKURA上的輸入/輸出設(shè)備,但也可將帶有數(shù)字輸出功能的外部傳感器連接到GR-SAKURA的I/O端子上,也可以連接LED以外的設(shè)備(如電子蜂鳴器)。
串行通信
單片機(jī)與外圍設(shè)備的連接:并行和串行
單片機(jī)是嵌入式設(shè)備的“頭腦”,其與作為嵌入式設(shè)備的“手和腳”是各種外圍設(shè)備(輸入輸出設(shè)備等)連接。單片機(jī)應(yīng)該怎樣與這些外圍設(shè)備連接才好呢?比如,我們來(lái)考慮一下將傳感器與單片機(jī)連接的情況。如果使用本連載第1期中介紹的“GPIO”的話(huà),從傳感器向單片機(jī)傳送8位信號(hào)時(shí)需要使用8個(gè)引腳。這種傳送模式被稱(chēng)為并行(并行通信)模式(圖1D左)。但是,僅一個(gè)傳感器就需要連接8個(gè)引腳,確實(shí)太可惜了,是否還有連接更少的引腳就能達(dá)到同樣目的的方法呢?
此時(shí),可使用串行傳送模式(串行通信)。 “串行”的意思就是直列或直線(xiàn)。通過(guò)并行傳送模式(Parallerl Transferring Mode)中需要8個(gè)引腳才能實(shí)現(xiàn)的通信,在串行傳送模式(Serial Transfer Mode)中,由于可以以排成一直線(xiàn)的模式進(jìn)行傳送,所以?xún)H需一個(gè)引腳就夠了(圖1D右)。由于在單片機(jī)內(nèi)部是通過(guò)并行模式來(lái)進(jìn)行信號(hào)交換,所以還需將通過(guò)串行模式傳送來(lái)的信號(hào)轉(zhuǎn)換為并行模式(串行并行轉(zhuǎn)換)。相反,從單片機(jī)向與單片機(jī)串行連接的外圍設(shè)備傳送的信號(hào)也需要將信號(hào)從并行模式轉(zhuǎn)換為串行模式(并行串行轉(zhuǎn)換)。瑞薩電子的單片機(jī)RX63N是通過(guò)被稱(chēng)為SCI(Serial Communication Interface,串行通信接口)的單元進(jìn)行這些轉(zhuǎn)換的。例如,使一個(gè)引腳對(duì)應(yīng)1位 的char型變量進(jìn)行信息交換的是并行通信(Parallel communication),而一個(gè)引腳以時(shí)分(time division)按每1位進(jìn)行信息交換的就是串行通信(Serial Communication)。
由于串行連接僅使用少數(shù)引腳便可進(jìn)行,所以,近年來(lái)多被用于單片機(jī)和外圍設(shè)備之間的連接。GPIO除了用于將驅(qū)動(dòng)電機(jī)的信號(hào)及LED閃爍等軟件操作結(jié)果的信號(hào)輸出時(shí)以外,還被用于通過(guò)開(kāi)關(guān)或ON/OFF輸出的傳感器的輸入等。
通過(guò)UART便可簡(jiǎn)單地使用串行通信
由于電特性的不同,以及用于進(jìn)行通信協(xié)議的規(guī)定不同,串行通信具有多種方式,其中,最易于使用的應(yīng)該是“異步通信模式”了。僅需用信號(hào)線(xiàn)將單片機(jī)和外圍設(shè)備連接起來(lái)便可使用,所以在單片機(jī)與動(dòng)作監(jiān)視器用的終端之間進(jìn)行通信時(shí)、以及單片機(jī)與無(wú)線(xiàn)LAN用模塊進(jìn)行通信時(shí)使用。
在異步通信模式的串行通信狀態(tài)下,一字節(jié)的文字信息※1在“開(kāi)始位”(Start bit,意味著開(kāi)始發(fā)送)和“停止位”(Stop bit,意味著停止發(fā)送)之間發(fā)送(圖2)。由此,無(wú)需I2C (Inter-Integrated Circuit,內(nèi)部集成電路)”及“SPI(Serial Peripheral Interface,串行外設(shè)接口)”等時(shí)鐘信號(hào)線(xiàn)(但在其他的串行通信模式中這些時(shí)鐘信號(hào)線(xiàn)是必需的,以對(duì)發(fā)送和接收的時(shí)序進(jìn)行同步)。另外,還可追加用于檢查數(shù)據(jù)是否已正常發(fā)送的“奇偶校驗(yàn)位(Parity bit)※2”。
此通信方式所使用的通信用器件被稱(chēng)為UART(Universal Asynchronous Receiver/Transmitter,通用異步收發(fā)器),在瑞薩電子的單片機(jī)--RX63N中內(nèi)置了支持此功能的SCI(串行通信接口)。
(※1)異步串行通信狀態(tài)下,一般都是從“最低有效位(LSB: Least Significant Bit),即最低二進(jìn)制數(shù)位”開(kāi)始進(jìn)行發(fā)送的。
(※2)奇偶校驗(yàn)位(Parity bit):在發(fā)送時(shí)按一定量的數(shù)據(jù)(在SCI中為7位或8位)中所具有“1”(或“0”)的個(gè)數(shù)為奇數(shù)個(gè)時(shí)定為“1”,為偶數(shù)個(gè)時(shí)定為“0”的奇偶校驗(yàn)位(使偶校驗(yàn)(Even Parity Check)、數(shù)據(jù)及奇偶校驗(yàn)位中所包括的“1”的數(shù)量成為偶數(shù)個(gè)的方法),并通過(guò)與接收側(cè)進(jìn)行校驗(yàn),以檢測(cè)出數(shù)據(jù)通信中的錯(cuò)誤。反之,如果“1”(或“0”)的個(gè)數(shù)為奇數(shù)時(shí)定為“0”,為偶數(shù)時(shí)定為“1”的方法被稱(chēng)為奇校驗(yàn)(Odd Parity Check)。
在異步通信中,能實(shí)現(xiàn)按“單片機(jī)→外圍設(shè)備”或“外圍設(shè)備→單片機(jī)”的方向確保數(shù)據(jù)信號(hào)專(zhuān)用的信號(hào)線(xiàn)時(shí),被稱(chēng)為全雙工通信。另一方面,將通過(guò)1根信號(hào)線(xiàn)來(lái)切換通信方向的方式稱(chēng)為半雙工通信。全雙工方式時(shí)需要2根信號(hào)線(xiàn),可同時(shí)進(jìn)行發(fā)送和接收。半雙工方式時(shí)僅需1根信號(hào)線(xiàn),但必須在發(fā)送和接收之間進(jìn)行切換(圖3)。
嘗試向單片機(jī)和電腦之間進(jìn)行通信!
下面,我們通過(guò)GR-SAKURA來(lái)試用樣本程序。本期我們?cè)囍ㄟ^(guò)可在電腦上運(yùn)行的終端軟件和GR-SAKURA之間進(jìn)行通信。也就是試用從終端軟件發(fā)送出“?”(半角問(wèn)號(hào))后就有“GR-SAKURA”的字符串被傳送回來(lái)的程序(圖4)。為了確認(rèn)該程序的動(dòng)作狀況,需在電腦上安裝終端軟件。如在Windows系統(tǒng)下可使用免費(fèi)軟件—TeraTerm,而在Mac系統(tǒng)下建議使用該系統(tǒng)標(biāo)準(zhǔn)配備的軟件—Terminal。
該樣本程序使用了GR-SAKURA的櫻花程序庫(kù)“串行通信(Serial Class)”。該程序庫(kù)支持全雙工異步通信。
在程序的第8行中,對(duì)經(jīng)由USB的通信進(jìn)行設(shè)定。第13行的Serial.read()是用于設(shè)定在串行通信中讀取從電腦發(fā)送過(guò)來(lái)的數(shù)據(jù),在讀取“?”(半角問(wèn)號(hào))時(shí),就將“GR-SAKURA”字符串傳送回來(lái)。如果換作是GR-SAKURA中所搭載的RX63N單片機(jī)來(lái)進(jìn)行處理的話(huà),就是:SCI將電腦傳送來(lái)的串行信號(hào)轉(zhuǎn)換為并行信號(hào),再由CPU對(duì)“?”進(jìn)行識(shí)別后判斷輸出“GR-SAKURA”字符串,之后再通過(guò)SCI將并行信號(hào)轉(zhuǎn)換為串行信號(hào)后發(fā)送到電腦上。
雖然只是非常簡(jiǎn)單的程序,但是由此便可實(shí)現(xiàn)在GR-SAKURA和電腦之間進(jìn)行文字信息的交換。本期我們介紹的是固定字符串,但也可發(fā)送GR-SAKURA的處理結(jié)果。請(qǐng)大家也作嘗試!
SAKURA Sketch Reference: Sakura Library “Serial Communication”(僅英文版)
圖4:樣本程序:從Terminal輸入“?”后,將傳送回“GR-SAKURA”的信息。
※//~為注釋符,不會(huì)影響程序的運(yùn)行
※本程序僅用于說(shuō)明程序的原理,并不具有在實(shí)際使用時(shí)所需的對(duì)策。
評(píng)論