你的位置:首頁 > 測(cè)試測(cè)量 > 正文
單片機(jī)不可或缺的外設(shè)功能:GPIO與串行通信該如何運(yùn)作
發(fā)布時(shí)間:2016-09-07 責(zé)任編輯:susan
【導(dǎo)讀】文章將介紹有效使用單片機(jī)外設(shè)功能的結(jié)構(gòu)及使用方法,能讓我們將能學(xué)到各種單片機(jī)共通的基本外設(shè)功能,并可廣泛應(yīng)用到各個(gè)方面。單片機(jī)僅靠CPU和內(nèi)存是無法運(yùn)行的!本文介紹GPIO和串行通信。
有效使用單片機(jī)不可或缺的“外設(shè)功能”是什么呢?正如過去連載的“單片機(jī)入門”系列中所介紹的那樣,對(duì)電子產(chǎn)品進(jìn)行控制的單片機(jī)是由CPU、內(nèi)存及外設(shè)功能等部分組成的(圖1)。CPU根據(jù)指令(程序),執(zhí)行運(yùn)算、數(shù)據(jù)的讀寫以及進(jìn)行條件判斷等,而內(nèi)存則用來保存該程序(記憶)。
外設(shè)功能是指為了使單片機(jī)便于使用的各種功能。例如,CPU為了與外部的傳感器及開關(guān)等進(jìn)行信號(hào)交換,就需要“輸入/輸出端口(I/O端口)”這種外設(shè)功能。
而且,將模擬輸入信號(hào)轉(zhuǎn)換為數(shù)字值的“A/D轉(zhuǎn)換器”以及反過來將數(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)行說明,請(qǐng)你也實(shí)際操作試試看吧!
了解數(shù)字信號(hào)的輸入/輸出端口---“GPIO”
在“輸入/輸出端口(I/O端口)”中,數(shù)字信號(hào)的輸入/輸出端口即“GPIO(General Purpose Input/Output)”也被稱為“通用I/O端口”,是一種用于數(shù)字信號(hào)輸入/輸出的非常方便的端口。用于將數(shù)字輸出的傳感器值和開關(guān)的ON/OFF值傳送到單片機(jī)的輸入端及通過LED來顯示單片機(jī)的運(yùn)算結(jié)果,以及輸出用于驅(qū)動(dòng)電機(jī)運(yùn)行的信號(hào)等等。
GPIO被稱為通用端口是其引腳既可以用于輸入也可以用于輸出。在早期的單片機(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í)行通過程序處理的數(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)行寫入和讀取時(shí)速度很快,但容量卻非常小,既有可以用于各種用途的寄存器(通用寄存器),又有用于某些限定的功能和用途的特殊寄存器。
端口方向寄存器(PDR)
決定引腳方向的寄存器,也稱為“方向寄存器”。
端口輸入數(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)存一樣保持改寫前的值,所以在改寫前來自引腳的輸出電壓也將保持不變。
通過GR-SAKURA來體驗(yàn)活用了GPIO的程序!
本期我們將通過“按下開關(guān)時(shí)LED會(huì)發(fā)光”這個(gè)程序來學(xué)習(xí)GPIO的運(yùn)行。我們將利用GR-SAKURA專用的程序庫進(jìn)行編程。(櫻花程序庫的“數(shù)字I/O”)
在櫻花程序庫(SAKURA Library)的“數(shù)字I/O”中,電路板上的I/O專用引腳究竟是用作輸入還是用作輸出最初由pinMode(引腳號(hào)、模式)函數(shù)來指定。一旦指定后,只要引腳的用法沒發(fā)生變化就無需執(zhí)行pinMode函數(shù)。
用作輸入時(shí),通過digitalRead函數(shù)來指定引腳號(hào),結(jié)果將被作為HIGH電平或LOW電平信號(hào)被返送回。用作輸出時(shí)通過digitalWrite函數(shù)來指定引腳號(hào)。值還是HIGH電平或LOW電平,HIGH電平相當(dāng)于1,LOW電平相當(dāng)于0,所以也可將之記述為0或1。
由于這次使用的是GR-SAKURA電路板上的開關(guān)和LED,所以即使不知道與其相連的引腳號(hào)和端口號(hào),如為開關(guān),只需在程序中寫入“PIN_SW”,如為L(zhǎng)ED,只需在程序中寫入“PIN_LED0”?“PIN_LED3”,櫻花程序庫(SAKURA Library)就會(huì)進(jìn)行處理。
圖3所示的是使用GPIO時(shí),通過LED的閃爍來反映開關(guān)的值的程序例。首先通過pinMode函數(shù)來指定與開關(guān)相連的引腳作為輸入引腳,將與LED連接的引腳作為輸出引腳(①)。只需在開始時(shí)定義一次就夠了,之后將在setup函數(shù)中進(jìn)行處理。
接下來,“只要按下開關(guān)LED就點(diǎn)亮,不按開關(guān)LED就熄滅”的部分在loop函數(shù)中進(jìn)行處理。開關(guān)是否被按下要根據(jù)digitalRead(PIN_SW)返回的值來判斷。所以GR-SAKURA的開關(guān)在什么都不做(松開)的狀態(tài)下為HIGH電平(通過上拉電阻連接電源),被按下時(shí)為L(zhǎng)OW電平(連接GND)。
如果digitalRead(PIN_SW)返回的值為L(zhǎng)OW電平時(shí)=開關(guān)被按下(②)、LED將被點(diǎn)亮。D1的LED為digitalWrite(PIN_LED0, HIGH)時(shí)將被點(diǎn)亮(③)。
如果判斷為開關(guān)沒被按下時(shí),當(dāng)是digitalWrite(PIN_LED0, LOW)時(shí)(④),GPIO的輸出為L(zhǎng)OW電平,LED熄滅。
圖3:程序例
請(qǐng)?jiān)囍褂肎R-SAKURA的Web編譯器來執(zhí)行圖4所示的程序。Web編譯器的使用方法請(qǐng)參考嵌入系統(tǒng)入門系列的“第一次挑戰(zhàn)制作!
程序的提示 通過“振蕩”來防止誤操作
開關(guān)是用來接通(開關(guān)有時(shí)顯示為“關(guān)”)和切斷(開關(guān)有時(shí)顯示為“開”)電路的,即開和關(guān)。在開關(guān)等裝置機(jī)械地進(jìn)行開和關(guān)的操作時(shí),任何一種狀態(tài)都不可能在一瞬間完成。裝置會(huì)發(fā)生非常快速的振動(dòng),并非常精細(xì)地在開和關(guān)之間反復(fù)動(dòng)作后才會(huì)轉(zhuǎn)變?yōu)樾碌臓顟B(tài)。這種現(xiàn)象被稱為“振蕩”。為了讓大家更容易理解“振蕩”的現(xiàn)象,我們制作了一個(gè)簡(jiǎn)單易懂的體驗(yàn)程序(圖4)。請(qǐng)大家也試著體驗(yàn)一下吧。
圖4:振蕩體驗(yàn)程序
試著通過控制開關(guān)反復(fù)點(diǎn)亮、熄滅LED來執(zhí)行所期望的動(dòng)作,怎么樣?是不是有時(shí)如你所愿,有時(shí)又適得其反?產(chǎn)生這種現(xiàn)象的原因就是因?yàn)檎袷?。如果將振?dòng)過程中的狀態(tài)作為開關(guān)的信號(hào)讀取出來,將得不到正確的結(jié)果。因此,需用防振蕩程序來解決。
在圖3的程序中,檢測(cè)到開關(guān)最初被按下后先停止50微妙(0.05秒)后再進(jìn)行處理(圖3中的⑤)。如果不停止,在檢測(cè)到開關(guān)被按下時(shí)雖然LED也會(huì)亮燈,但接下來確認(rèn)開關(guān)的狀態(tài)時(shí),由于振蕩的原因,有可能會(huì)認(rèn)為是“開關(guān)處于松開的狀態(tài)”(因?yàn)檩斎霑簳r(shí)還沒返回到HIGH)而導(dǎo)致LED熄滅。因此,如上所述,我們通過在開關(guān)的狀態(tài)穩(wěn)定之前停止處理(50微妙)的方式來解決這個(gè)問題。
我們一起學(xué)習(xí)了GPIO的結(jié)構(gòu)和使用方法。如果將程序中的PIN_LED0的部分換成別的LED號(hào)(僅在選0?3時(shí)有效),將可以變換閃爍的LED。另外,如果改寫判斷部分的程序,也可以進(jìn)行諸如“按兩次則LED亮燈,接下來再按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è)備連接才好呢?比如,我們來考慮一下將傳感器與單片機(jī)連接的情況。如果使用本連載第1期中介紹的“GPIO”的話,從傳感器向單片機(jī)傳送8位信號(hào)時(shí)需要使用8個(gè)引腳。這種傳送模式被稱為并行(并行通信)模式(圖1―左)。但是,僅一個(gè)傳感器就需要連接8個(gè)引腳,確實(shí)太可惜了,是否還有連接更少的引腳就能達(dá)到同樣目的的方法呢?
此時(shí),可使用串行傳送模式(串行通信)。 “串行”的意思就是直列或直線。通過并行傳送模式(Parallerl Transferring Mode)中需要8個(gè)引腳才能實(shí)現(xiàn)的通信,在串行傳送模式(Serial Transfer Mode)中,由于可以以排成一直線的模式進(jìn)行傳送,所以僅需一個(gè)引腳就夠了(圖1―右)。由于在單片機(jī)內(nèi)部是通過并行模式來進(jìn)行信號(hào)交換,所以還需將通過串行模式傳送來的信號(hào)轉(zhuǎn)換為并行模式(串行并行轉(zhuǎn)換)。相反,從單片機(jī)向與單片機(jī)串行連接的外圍設(shè)備傳送的信號(hào)也需要將信號(hào)從并行模式轉(zhuǎn)換為串行模式(并行串行轉(zhuǎn)換)。瑞薩電子的單片機(jī)RX63N是通過被稱為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)行,所以,近年來多被用于單片機(jī)和外圍設(shè)備之間的連接。GPIO除了用于將驅(qū)動(dòng)電機(jī)的信號(hào)及LED閃爍等軟件操作結(jié)果的信號(hào)輸出時(shí)以外,還被用于通過開關(guān)或ON/OFF輸出的傳感器的輸入等。
通過UART便可簡(jiǎn)單地使用串行通信
由于電特性的不同,以及用于進(jìn)行通信協(xié)議的規(guī)定不同,串行通信具有多種方式,其中,最易于使用的應(yīng)該是“異步通信模式”了。僅需用信號(hào)線將單片機(jī)和外圍設(shè)備連接起來便可使用,所以在單片機(jī)與動(dòng)作監(jiān)視器用的終端之間進(jìn)行通信時(shí)、以及單片機(jī)與無線LAN用模塊進(jìn)行通信時(shí)使用。
在異步通信模式的串行通信狀態(tài)下,一字節(jié)的文字信息※1在“開始位”(Start bit,意味著開始發(fā)送)和“停止位”(Stop bit,意味著停止發(fā)送)之間發(fā)送(圖2)。由此,無需I2C (Inter-Integrated Circuit,內(nèi)部集成電路)”及“SPI(Serial Peripheral Interface,串行外設(shè)接口)”等時(shí)鐘信號(hào)線(但在其他的串行通信模式中這些時(shí)鐘信號(hào)線是必需的,以對(duì)發(fā)送和接收的時(shí)序進(jìn)行同步)。另外,還可追加用于檢查數(shù)據(jù)是否已正常發(fā)送的“奇偶校驗(yàn)位(Parity bit)※2”。
此通信方式所使用的通信用器件被稱為UART(Universal Asynchronous Receiver/Transmitter,通用異步收發(fā)器),在瑞薩電子的單片機(jī)--RX63N中內(nèi)置了支持此功能的SCI(串行通信接口)。
(※1)異步串行通信狀態(tài)下,一般都是從“最低有效位(LSB: Least Significant Bit),即最低二進(jìn)制數(shù)位”開始進(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è)的方法),并通過與接收側(cè)進(jìn)行校驗(yàn),以檢測(cè)出數(shù)據(jù)通信中的錯(cuò)誤。反之,如果“1”(或“0”)的個(gè)數(shù)為奇數(shù)時(shí)定為“0”,為偶數(shù)時(shí)定為“1”的方法被稱為奇校驗(yàn)(Odd Parity Check)。
在異步通信中,能實(shí)現(xiàn)按“單片機(jī)→外圍設(shè)備”或“外圍設(shè)備→單片機(jī)”的方向確保數(shù)據(jù)信號(hào)專用的信號(hào)線時(shí),被稱為全雙工通信。另一方面,將通過1根信號(hào)線來切換通信方向的方式稱為半雙工通信。全雙工方式時(shí)需要2根信號(hào)線,可同時(shí)進(jìn)行發(fā)送和接收。半雙工方式時(shí)僅需1根信號(hào)線,但必須在發(fā)送和接收之間進(jìn)行切換(圖3)。
嘗試向單片機(jī)和電腦之間進(jìn)行通信!
下面,我們通過GR-SAKURA來試用樣本程序。本期我們?cè)囍ㄟ^可在電腦上運(yùn)行的終端軟件和GR-SAKURA之間進(jìn)行通信。也就是試用從終端軟件發(fā)送出“?”(半角問號(hào))后就有“GR-SAKURA”的字符串被傳送回來的程序(圖4)。為了確認(rèn)該程序的動(dòng)作狀況,需在電腦上安裝終端軟件。如在Windows系統(tǒng)下可使用免費(fèi)軟件—TeraTerm,而在Mac系統(tǒng)下建議使用該系統(tǒng)標(biāo)準(zhǔn)配備的軟件—Terminal。
該樣本程序使用了GR-SAKURA的櫻花程序庫“串行通信(Serial Class)”。該程序庫支持全雙工異步通信。
在程序的第8行中,對(duì)經(jīng)由USB的通信進(jìn)行設(shè)定。第13行的Serial.read()是用于設(shè)定在串行通信中讀取從電腦發(fā)送過來的數(shù)據(jù),在讀取“?”(半角問號(hào))時(shí),就將“GR-SAKURA”字符串傳送回來。如果換作是GR-SAKURA中所搭載的RX63N單片機(jī)來進(jìn)行處理的話,就是:SCI將電腦傳送來的串行信號(hào)轉(zhuǎn)換為并行信號(hào),再由CPU對(duì)“?”進(jìn)行識(shí)別后判斷輸出“GR-SAKURA”字符串,之后再通過SCI將并行信號(hào)轉(zhuǎn)換為串行信號(hào)后發(fā)送到電腦上。
雖然只是非常簡(jiǎn)單的程序,但是由此便可實(shí)現(xiàn)在GR-SAKURA和電腦之間進(jìn)行文字信息的交換。本期我們介紹的是固定字符串,但也可發(fā)送GR-SAKURA的處理結(jié)果。請(qǐng)大家也作嘗試!
圖4:樣本程序:從Terminal輸入“?”后,將傳送回“GR-SAKURA”的信息。
※//~為注釋符,不會(huì)影響程序的運(yùn)行
※本程序僅用于說明程序的原理,并不具有在實(shí)際使用時(shí)所需的對(duì)策。
特別推薦
- 授權(quán)代理商貿(mào)澤電子供應(yīng)Same Sky多樣化電子元器件
- 使用合適的窗口電壓監(jiān)控器優(yōu)化系統(tǒng)設(shè)計(jì)
- ADI電機(jī)運(yùn)動(dòng)控制解決方案 驅(qū)動(dòng)智能運(yùn)動(dòng)新時(shí)代
- 倍福推出采用 TwinSAFE SC 技術(shù)的 EtherCAT 端子模塊 EL3453-0090
- TDK推出新的X系列環(huán)保型SMD壓敏電阻
- Vishay 推出新款采用0102、0204和 0207封裝的精密薄膜MELF電阻
- Microchip推出新款交鑰匙電容式觸摸控制器產(chǎn)品 MTCH2120
技術(shù)文章更多>>
- ADC 總諧波失真
- 貿(mào)澤電子持續(xù)擴(kuò)充工業(yè)自動(dòng)化產(chǎn)品陣容
- 更高精度、更低噪音 GMCC美芝電子膨脹閥以創(chuàng)新?lián)屨夹袠I(yè)“制高點(diǎn)”
- 本立租完成近億元估值Pre-A輪融資,打造AI賦能的租賃服務(wù)平臺(tái)
- 中微公司成功從美國國防部中國軍事企業(yè)清單中移除
技術(shù)白皮書下載更多>>
- 車規(guī)與基于V2X的車輛協(xié)同主動(dòng)避撞技術(shù)展望
- 數(shù)字隔離助力新能源汽車安全隔離的新挑戰(zhàn)
- 汽車模塊拋負(fù)載的解決方案
- 車用連接器的安全創(chuàng)新應(yīng)用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall
熱門搜索
晶體諧振器
晶體振蕩器
晶閘管
精密電阻
精密工具
景佑能源
聚合物電容
君耀電子
開發(fā)工具
開關(guān)
開關(guān)電源
開關(guān)電源電路
開關(guān)二極管
開關(guān)三極管
科通
可變電容
可調(diào)電感
可控硅
空心線圈
控制變壓器
控制模塊
藍(lán)牙
藍(lán)牙4.0
藍(lán)牙模塊
浪涌保護(hù)器
雷度電子
鋰電池
利爾達(dá)
連接器
流量單位