單片機不可或缺的外設功能:GPIO與串行通信該如何運作
發布時間:2016-09-07 責任編輯:susan
【導讀】文(wen)章(zhang)將(jiang)介(jie)紹(shao)有(you)效(xiao)使(shi)用(yong)單(dan)片(pian)機(ji)外(wai)設(she)功(gong)能(neng)的(de)結(jie)構(gou)及(ji)使(shi)用(yong)方(fang)法(fa),能(neng)讓(rang)我(wo)們(men)將(jiang)能(neng)學(xue)到(dao)各(ge)種(zhong)單(dan)片(pian)機(ji)共(gong)通(tong)的(de)基(ji)本(ben)外(wai)設(she)功(gong)能(neng),並(bing)可(ke)廣(guang)泛(fan)應(ying)用(yong)到(dao)各(ge)個(ge)方(fang)麵(mian)。單(dan)片(pian)機(ji)僅(jin)靠(kao)CPU和內存是無法運行的!本文介紹GPIO和串行通信。
有效使用單片機不可或缺的“外設功能”是什麼呢?正如過去連載的“單片機入門”係列中所介紹的那樣,對電子產品進行控製的單片機是由CPU、內存及外設功能等部分組成的(圖1)。CPU根據指令(程序),執行運算、數據的讀寫以及進行條件判斷等,而內存則用來保存該程序(記憶)。
外設功能是指為了使單片機便於使用的各種功能。例如,CPU為了與外部的傳感器及開關等進行信號交換,就需要“輸入/輸出端口(I/O端口)”這種外設功能。
而且,將模擬輸入信號轉換為數字值的“A/D轉換器”以及反過來將數字值轉換為模擬輸出信號的“D/A轉換器”則是單片機對各種信號進行處理時不可或缺的外設功能。
另外,還有為了正確測量時間所用的“定時器”以及提供日期和時計的“實時時鍾(RTC)”,用於進行與時間相關的處理,此外還有將並行信號(parallel signal)和串行信號(serial signal)進行互相交換的“UART(Universal Asynchronous Receiver Transmitter,通用異步收發器)”等,以便進行通信。
本連載中,將以瑞薩電子單片機--RX63N為例,介紹令單片機更便於使用的外設功能的基礎知識。我們將使用搭載了“RX63N”程序的電子板“GR-SAKURA”進行說明,請你也實際操作試試看吧!

了解數字信號的輸入/輸出端口---“GPIO”
在“輸入/輸出端口(I/O端口)”中,數字信號的輸入/輸出端口即“GPIO(General Purpose Input/Output)”也被稱為“通用I/O端口”,是一種用於數字信號輸入/輸出的非常方便的端口。用於將數字輸出的傳感器值和開關的ON/OFF值傳送到單片機的輸入端及通過LED來顯示單片機的運算結果,以及輸出用於驅動電機運行的信號等等。
GPIO被bei稱cheng為wei通tong用yong端duan口kou是shi其qi引yin腳jiao既ji可ke以yi用yong於yu輸shu入ru也ye可ke以yi用yong於yu輸shu出chu。在zai早zao期qi的de單dan片pian機ji中zhong,引yin腳jiao都dou被bei固gu定ding用yong於yu輸shu入ru或huo輸shu出chu,但dan是shi現xian在zai很hen多duo單dan片pian機ji中zhong都dou可ke以yi自zi由you地di將jiang其qi設she定ding為wei輸shu入ru或huo輸shu出chu端duan口kou。假jia設sheGPIO端子有8個引腳,則可以將4個引腳用於輸入,另4個引腳用於輸出,也可以將1個引腳用於輸入,剩下的7個引腳用於輸出。
在GPIO中,為了使CPU和外部設備之間進行數據交換,要相互執行通過程序處理的數字值(0或1)與信號(電壓的LOW電平或HIGH電平)的轉換。下麵是作為RX63N單片機的GPIO端口基礎的寄存器(※1)的作用(圖2)。
(※1)寄存器(Register):存在於單片機的CPU和外設功能內部中的記憶回路。用於運算和保持CPU的執行狀態。由於是作為CPU及外設功能的內部回路,所以在對內存進行寫入和讀取時速度很快,但容量卻非常小,既有可以用於各種用途的寄存器(通用寄存器),又有用於某些限定的功能和用途的特殊寄存器。

端口方向寄存器(PDR)
決定引腳方向的寄存器,也稱為“方向寄存器”。
端口輸入數據寄存器(PIDR)
輸入時反映所使用的引腳狀態的寄存器。從引腳輸入LOW電平或者HIGH電平時會將之轉換為0或1的值並讀取該轉換結果。隨著引腳的變化數值也將發生變化。所以不會保持讀取時的值。
端口輸出數據寄存器(PODR)
此寄存器保存用作輸出引腳的輸出數據。將0或1的值轉換為LOW電平或HIGH電平信號並從引腳輸出。由於可以與內存一樣保持改寫前的值,所以在改寫前來自引腳的輸出電壓也將保持不變。
通過GR-SAKURA來體驗活用了GPIO的程序!
本期我們將通過“按下開關時LED會發光”這個程序來學習GPIO的運行。我們將利用GR-SAKURA專用的程序庫進行編程。(櫻花程序庫的“數字I/O”)
在櫻花程序庫(SAKURA Library)的“數字I/O”中,電路板上的I/O專用引腳究竟是用作輸入還是用作輸出最初由pinMode(引腳號、模式)函數來指定。一旦指定後,隻要引腳的用法沒發生變化就無需執行pinMode函數。
用作輸入時,通過digitalRead函數來指定引腳號,結果將被作為HIGH電平或LOW電平信號被返送回。用作輸出時通過digitalWrite函數來指定引腳號。值還是HIGH電平或LOW電平,HIGH電平相當於1,LOW電平相當於0,所以也可將之記述為0或1。
由於這次使用的是GR-SAKURA電路板上的開關和LED,所以即使不知道與其相連的引腳號和端口號,如為開關,隻需在程序中寫入“PIN_SW”,如為LED,隻需在程序中寫入“PIN_LED0”?“PIN_LED3”,櫻花程序庫(SAKURA Library)就會進行處理。
圖3所示的是使用GPIO時,通過LED的閃爍來反映開關的值的程序例。首先通過pinMode函數來指定與開關相連的引腳作為輸入引腳,將與LED連接的引腳作為輸出引腳(①)。隻需在開始時定義一次就夠了,之後將在setup函數中進行處理。
接下來,“隻要按下開關LED就點亮,不按開關LED就熄滅”的部分在loop函數中進行處理。開關是否被按下要根據digitalRead(PIN_SW)返回的值來判斷。所以GR-SAKURA的開關在什麼都不做(鬆開)的狀態下為HIGH電平(通過上拉電阻連接電源),被按下時為LOW電平(連接GND)。
如果digitalRead(PIN_SW)返回的值為LOW電平時=開關被按下(②)、LED將被點亮。D1的LED為digitalWrite(PIN_LED0, HIGH)時將被點亮(③)。
如果判斷為開關沒被按下時,當是digitalWrite(PIN_LED0, LOW)時(④),GPIO的輸出為LOW電平,LED熄滅。

圖3:程序例
請試著使用GR-SAKURA的Web編譯器來執行圖4所示的程序。Web編譯器的使用方法請參考嵌入係統入門係列的“第一次挑戰製作!
程序的提示 通過“振蕩”來防止誤操作
開關是用來接通(開關有時顯示為“關”)和切斷(開關有時顯示為“開”)電(dian)路(lu)的(de),即(ji)開(kai)和(he)關(guan)。在(zai)開(kai)關(guan)等(deng)裝(zhuang)置(zhi)機(ji)械(xie)地(di)進(jin)行(xing)開(kai)和(he)關(guan)的(de)操(cao)作(zuo)時(shi),任(ren)何(he)一(yi)種(zhong)狀(zhuang)態(tai)都(dou)不(bu)可(ke)能(neng)在(zai)一(yi)瞬(shun)間(jian)完(wan)成(cheng)。裝(zhuang)置(zhi)會(hui)發(fa)生(sheng)非(fei)常(chang)快(kuai)速(su)的(de)振(zhen)動(dong),並(bing)非(fei)常(chang)精(jing)細(xi)地(di)在(zai)開(kai)和(he)關(guan)之(zhi)間(jian)反(fan)複(fu)動(dong)作(zuo)後(hou)才(cai)會(hui)轉(zhuan)變(bian)為(wei)新(xin)的(de)狀(zhuang)態(tai)。這(zhe)種(zhong)現(xian)象(xiang)被(bei)稱(cheng)為(wei)“振蕩”。為了讓大家更容易理解“振蕩”的現象,我們製作了一個簡單易懂的體驗程序(圖4)。請大家也試著體驗一下吧。

圖4:振蕩體驗程序
試著通過控製開關反複點亮、熄滅LED來(lai)執(zhi)行(xing)所(suo)期(qi)望(wang)的(de)動(dong)作(zuo),怎(zen)麼(me)樣(yang)?是(shi)不(bu)是(shi)有(you)時(shi)如(ru)你(ni)所(suo)願(yuan),有(you)時(shi)又(you)適(shi)得(de)其(qi)反(fan)?產(chan)生(sheng)這(zhe)種(zhong)現(xian)象(xiang)的(de)原(yuan)因(yin)就(jiu)是(shi)因(yin)為(wei)振(zhen)蕩(dang)。如(ru)果(guo)將(jiang)振(zhen)動(dong)過(guo)程(cheng)中(zhong)的(de)狀(zhuang)態(tai)作(zuo)為(wei)開(kai)關(guan)的(de)信(xin)號(hao)讀(du)取(qu)出(chu)來(lai),將(jiang)得(de)不(bu)到(dao)正(zheng)確(que)的(de)結(jie)果(guo)。因(yin)此(ci),需(xu)用(yong)防(fang)振(zhen)蕩(dang)程(cheng)序(xu)來(lai)解(jie)決(jue)。
在圖3的程序中,檢測到開關最初被按下後先停止50微妙(0.05秒)後再進行處理(圖3中的⑤)。如果不停止,在檢測到開關被按下時雖然LED也會亮燈,但接下來確認開關的狀態時,由於振蕩的原因,有可能會認為是“開關處於鬆開的狀態”(因為輸入暫時還沒返回到HIGH)而導致LED熄滅。因此,如上所述,我們通過在開關的狀態穩定之前停止處理(50微妙)的方式來解決這個問題。
我們一起學習了GPIO的結構和使用方法。如果將程序中的PIN_LED0的部分換成別的LED號(僅在選0?3時有效),將可以變換閃爍的LED。另外,如果改寫判斷部分的程序,也可以進行諸如“按兩次則LED亮燈,接下來再按1次時熄滅”等複雜的處理。這次的體驗程序隻使用了GR-SAKURA上的輸入/輸出設備,但也可將帶有數字輸出功能的外部傳感器連接到GR-SAKURA的I/O端子上,也可以連接LED以外的設備(如電子蜂鳴器)。
串行通信
單片機與外圍設備的連接:並行和串行
單片機是嵌入式設備的“頭腦”,其與作為嵌入式設備的“手和腳”是各種外圍設備(輸入輸出設備等)連接。單片機應該怎樣與這些外圍設備連接才好呢?比如,我們來考慮一下將傳感器與單片機連接的情況。如果使用本連載第1期中介紹的“GPIO”的話,從傳感器向單片機傳送8位信號時需要使用8個引腳。這種傳送模式被稱為並行(並行通信)模式(圖1―左)。但是,僅一個傳感器就需要連接8個引腳,確實太可惜了,是否還有連接更少的引腳就能達到同樣目的的方法呢?
此時,可使用串行傳送模式(串行通信)。 “串行”的意思就是直列或直線。通過並行傳送模式(Parallerl Transferring Mode)中需要8個引腳才能實現的通信,在串行傳送模式(Serial Transfer Mode)中,由於可以以排成一直線的模式進行傳送,所以僅需一個引腳就夠了(圖1―右)。由於在單片機內部是通過並行模式來進行信號交換,所以還需將通過串行模式傳送來的信號轉換為並行模式(串行並行轉換)。相反,從單片機向與單片機串行連接的外圍設備傳送的信號也需要將信號從並行模式轉換為串行模式(並行串行轉換)。瑞薩電子的單片機RX63N是通過被稱為SCI(Serial Communication Interface,串行通信接口)的單元進行這些轉換的。例如,使一個引腳對應1位 的char型變量進行信息交換的是並行通信(Parallel communication),而一個引腳以時分(time division)按每1位進行信息交換的就是串行通信(Serial Communication)。

由於串行連接僅使用少數引腳便可進行,所以,近年來多被用於單片機和外圍設備之間的連接。GPIO除了用於將驅動電機的信號及LED閃爍等軟件操作結果的信號輸出時以外,還被用於通過開關或ON/OFF輸出的傳感器的輸入等。
通過UART便可簡單地使用串行通信
由於電特性的不同,以及用於進行通信協議的規定不同,串行通信具有多種方式,其中,最易於使用的應該是“異步通信模式”了。僅需用信號線將單片機和外圍設備連接起來便可使用,所以在單片機與動作監視器用的終端之間進行通信時、以及單片機與無線LAN用模塊進行通信時使用。
在異步通信模式的串行通信狀態下,一字節的文字信息※1在“開始位”(Start bit,意味著開始發送)和“停止位”(Stop bit,意味著停止發送)之間發送(圖2)。由此,無需I2C (Inter-Integrated Circuit,內部集成電路)”及“SPI(Serial Peripheral Interface,串行外設接口)”等時鍾信號線(但在其他的串行通信模式中這些時鍾信號線是必需的,以對發送和接收的時序進行同步)。另外,還可追加用於檢查數據是否已正常發送的“奇偶校驗位(Parity bit)※2”。
此通信方式所使用的通信用器件被稱為UART(Universal Asynchronous Receiver/Transmitter,通用異步收發器),在瑞薩電子的單片機--RX63N中內置了支持此功能的SCI(串行通信接口)。
(※1)異步串行通信狀態下,一般都是從“最低有效位(LSB: Least Significant Bit),即最低二進製數位”開始進行發送的。
(※2)奇偶校驗位(Parity bit):在發送時按一定量的數據(在SCI中為7位或8位)中所具有“1”(或“0”)的個數為奇數個時定為“1”,為偶數個時定為“0”的奇偶校驗位(使偶校驗(Even Parity Check)、數據及奇偶校驗位中所包括的“1”的數量成為偶數個的方法),並通過與接收側進行校驗,以檢測出數據通信中的錯誤。反之,如果“1”(或“0”)的個數為奇數時定為“0”,為偶數時定為“1”的方法被稱為奇校驗(Odd Parity Check)。

在異步通信中,能實現按“單片機→外圍設備”或“外圍設備→單片機”的方向確保數據信號專用的信號線時,被稱為全雙工通信。另一方麵,將通過1根信號線來切換通信方向的方式稱為半雙工通信。全雙工方式時需要2根信號線,可同時進行發送和接收。半雙工方式時僅需1根信號線,但必須在發送和接收之間進行切換(圖3)。

嚐試向單片機和電腦之間進行通信!
下麵,我們通過GR-SAKURA來試用樣本程序。本期我們試著通過可在電腦上運行的終端軟件和GR-SAKURA之間進行通信。也就是試用從終端軟件發送出“?”(半角問號)後就有“GR-SAKURA”的字符串被傳送回來的程序(圖4)。為了確認該程序的動作狀況,需在電腦上安裝終端軟件。如在Windows係統下可使用免費軟件—TeraTerm,而在Mac係統下建議使用該係統標準配備的軟件—Terminal。
該樣本程序使用了GR-SAKURA的櫻花程序庫“串行通信(Serial Class)”。該程序庫支持全雙工異步通信。
在程序的第8行中,對經由USB的通信進行設定。第13行的Serial.read()是用於設定在串行通信中讀取從電腦發送過來的數據,在讀取“?”(半角問號)時,就將“GR-SAKURA”字符串傳送回來。如果換作是GR-SAKURA中所搭載的RX63N單片機來進行處理的話,就是:SCI將電腦傳送來的串行信號轉換為並行信號,再由CPU對“?”進行識別後判斷輸出“GR-SAKURA”字符串,之後再通過SCI將並行信號轉換為串行信號後發送到電腦上。
雖然隻是非常簡單的程序,但是由此便可實現在GR-SAKURA和電腦之間進行文字信息的交換。本期我們介紹的是固定字符串,但也可發送GR-SAKURA的處理結果。請大家也作嚐試!

圖4:樣本程序:從Terminal輸入“?”後,將傳送回“GR-SAKURA”的信息。
※//~為注釋符,不會影響程序的運行
※本程序僅用於說明程序的原理,並不具有在實際使用時所需的對策。
特別推薦
- 噪聲中提取真值!瑞盟科技推出MSA2240電流檢測芯片賦能多元高端測量場景
- 10MHz高頻運行!氮矽科技發布集成驅動GaN芯片,助力電源能效再攀新高
- 失真度僅0.002%!力芯微推出超低內阻、超低失真4PST模擬開關
- 一“芯”雙電!聖邦微電子發布雙輸出電源芯片,簡化AFE與音頻設計
- 一機適配萬端:金升陽推出1200W可編程電源,賦能高端裝備製造
技術文章更多>>
- 三星上演罕見對峙:工會集會討薪,股東隔街抗議
- 摩爾線程實現DeepSeek-V4“Day-0”支持,國產GPU適配再提速
- 築牢安全防線:智能駕駛邁向規模化應用的關鍵挑戰與破局之道
- GPT-Image 2:99%文字準確率,AI生圖告別“鬼畫符”
- 機器人馬拉鬆的勝負手:藏在主板角落裏的“時鍾戰爭”
技術白皮書下載更多>>
- 車規與基於V2X的車輛協同主動避撞技術展望
- 數字隔離助力新能源汽車安全隔離的新挑戰
- 汽車模塊拋負載的解決方案
- 車用連接器的安全創新應用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall
熱門搜索
NFC
NFC芯片
NOR
ntc熱敏電阻
OGS
OLED
OLED麵板
OmniVision
Omron
OnSemi
PI
PLC
Premier Farnell
Recom
RF
RF/微波IC
RFID
rfid
RF連接器
RF模塊
RS
Rubycon
SATA連接器
SD連接器
SII
SIM卡連接器
SMT設備
SMU
SOC
SPANSION

