串口作為嵌入式開(kāi)發(fā)中最常見(jiàn),同時(shí)也是最方便使用的一種數(shù)據(jù)交換方式,不光是我們,芯片的設(shè)計(jì)廠商也是這么想的。于是在新款的MCU上,不光設(shè)計(jì)了多個(gè)串口,而且還將這些串口設(shè)計(jì)了可以重映射的功能。即使設(shè)計(jì)的IO口被占用,也可以換為其他的引腳引出。如果是傳統(tǒng)的單片機(jī),或是引腳數(shù)極少,不能隨意更換引腳或根本沒(méi)有原生串口的單片機(jī)該怎么辦呢? 一般來(lái)說(shuō),我們使用的串口通常指的是UART(Universal Asynchronous Receiver/Transmitter),其中比較重要的是“異步 Asynchronous”這一概念,它意味著,使用UART進(jìn)行通訊時(shí),沒(méi)有一個(gè)時(shí)鐘信號(hào)來(lái)同步收發(fā)兩端的信息傳輸過(guò)程。那么為了解決這個(gè)問(wèn)題,串行協(xié)議中引入了開(kāi)始位和結(jié)束位(Start Bit / Stop Bit)的概念,并通過(guò)限定每個(gè)信息的長(zhǎng)度相同,保證收到的內(nèi)容和發(fā)送的內(nèi)容一致。光有這兩者還不能確定傳輸?shù)恼_性,因此我們還要保證收發(fā)端以同樣的速度采樣,這就是波特率的意義,它使得兩端以同樣的速度發(fā)送和接收。 那么,最簡(jiǎn)單的實(shí)現(xiàn)方法就呼之欲出了:我們可以在程序中每隔固定的時(shí)長(zhǎng)改變?nèi)我庖_的電平狀態(tài),只要延時(shí)時(shí)間滿足波特率的需求,那么我們就能夠在任意引腳上實(shí)現(xiàn)串行數(shù)據(jù)輸出。但這樣做存在著兩個(gè)問(wèn)題:首先,這一延時(shí)時(shí)間必須足夠精確,否則累加的誤差和晶振的不準(zhǔn)確會(huì)導(dǎo)致傳輸失敗。而如果采用軟延時(shí)的話,機(jī)時(shí)將被白白浪費(fèi),在數(shù)據(jù)傳輸完之前都不能夠做其他工作。 比較好的辦法是使用定時(shí)器中斷。我們需要設(shè)定定時(shí)器中斷以定期觸發(fā)數(shù)據(jù)的發(fā)送。比如如果我們采用9600波特率的話,那么此時(shí)的時(shí)間間隔就應(yīng)該為1/9600=104us。設(shè)定你的定時(shí)器中斷成這個(gè)時(shí)間。采用這種方式你也依然避免不了晶振的誤差所導(dǎo)致的誤差,所以你需要多次嘗試以找到這個(gè)晶體所存在的偏差并在定時(shí)器設(shè)定里修正。之后是最重要的中斷處理函數(shù)(ISR)了。在這里完成發(fā)送的操作。首先,我們檢查最低有效位(LSB)上的值,并將其置位給輸出的引腳。之后我們將存有發(fā)送內(nèi)容的全局變量右移一位,直到所有數(shù)據(jù)都被發(fā)送完。 這種方式被稱作bit bang'ing,也可以從功能性的角度稱它為“軟串口”。對(duì)于8腳或更少的單片機(jī),使用這種方式可以有效提高串口的靈活性。 本文為 無(wú)線電雜志 微信公眾平臺(tái)文章。詳細(xì)內(nèi)容及高清大圖請(qǐng)查閱《無(wú)線電》雜志。版權(quán)所有,歡迎個(gè)人轉(zhuǎn)發(fā)至朋友圈。公眾號(hào)、報(bào)刊等。 ………………………………………………… |
|
來(lái)自: 老友mk09qda3vs > 《電腦手機(jī)數(shù)碼3》