前言
上兩篇文章中,已經(jīng)實(shí)現(xiàn)了GPIO的通用輸出以及通用輸出模式,從本文開始,筆者將開始有關(guān)GPIO的復(fù)用功能的介紹,首先是最常用復(fù)用功能——串口,本文主要是介紹一些關(guān)于通信以及串口的基本概念。
常用通信協(xié)議分類及其特征介紹
通信協(xié)議
通信協(xié)議:通信雙方進(jìn)行信息交換(接收或發(fā)送)要滿足的規(guī)則,而這個(gè)規(guī)則,不僅有如下圖所的軟件層的規(guī)則(軟件層主要是雙方互相約定了數(shù)據(jù)每一位的具體含義,以及 ‘?dāng)嗑洹?位置),還需要規(guī)定硬件層怎么連接,用多少線連接,每個(gè)線是什么功能等等。就比如常見的單總線協(xié)議,就只使用了一個(gè)數(shù)據(jù)線連接主從機(jī),當(dāng)然是在共地的情況下;而最常見的串口就是兩個(gè)線,一個(gè)TX,一個(gè)RX,雙方連接過程中還需要交叉連接,這些都是屬于硬件層,或者說是物理連接的規(guī)則。
通信協(xié)議分類
關(guān)于通信協(xié)議的分類有著多種分法,這里選用幾種常見的分類方式來做個(gè)說明。
1.同步異步通信
所謂的同步異步通信,主要區(qū)分在于通信雙方在通信過程中是使用的同一個(gè)時(shí)鐘,一根繩上的螞蚱;還是雙方各自使用自己的時(shí)鐘,自顧自的。如下圖所示,就是一種常見的同步通信,通信雙方使用同一個(gè)時(shí)鐘線,按照時(shí)鐘線上的頻率來傳輸和接收數(shù)據(jù)。
同步通信協(xié)議:**通信雙方在同一個(gè)時(shí)鐘脈沖作用下工作(時(shí)鐘線)**如:IIC SPI
而異步通信,通信雙方?jīng)]有共同的時(shí)鐘線,只有數(shù)據(jù)線;雙方通過約定數(shù)據(jù)發(fā)送的速率以及起始位,停止位數(shù)據(jù)位的方式來實(shí)現(xiàn)數(shù)據(jù)傳輸。
異步通信協(xié)議:通信雙方不在同一個(gè)時(shí)鐘脈沖作用下工作
如:UART USB can 單總線
這種分類方法的區(qū)別方式就是看通信雙方有沒有同步的時(shí)鐘線,有就是同步通信,沒有就是異步通信。
2.全雙工/半雙工/單工
全雙工通信,就是說同一時(shí)間,設(shè)備A既可以給設(shè)備B發(fā)送數(shù)據(jù),也可以接收從設(shè)備B發(fā)送過來的數(shù)據(jù)。全雙工最少要求有兩個(gè)數(shù)據(jù)線,發(fā)送和接收走的不同的數(shù)據(jù)線,且互不干涉,可以同時(shí)進(jìn)行。
全雙工:有兩個(gè)數(shù)據(jù)線,發(fā)送線和接收線
如:UART SPI
半雙工一般就只有一根數(shù)據(jù)了,也就是同一時(shí)間,只能一個(gè)設(shè)備發(fā)送數(shù)據(jù),另一個(gè)設(shè)備接收數(shù)據(jù),不能兩個(gè)設(shè)備同時(shí)發(fā)送和同時(shí)接收數(shù)據(jù)。半雙工既能實(shí)現(xiàn)接收也能實(shí)現(xiàn)發(fā)送,但是同一時(shí)刻同一設(shè)備只能接收或者只能發(fā)送,不能同時(shí)進(jìn)行。
半雙工:有一根數(shù)據(jù)線,可以發(fā)可以收,但不能同時(shí)進(jìn)行
如:?jiǎn)慰偩€
單工 :有一根數(shù)據(jù)線,要么只能發(fā)送,要么只能接收(一般很少遇到,大多數(shù)的外設(shè)都是需要發(fā)送和接收的)
3.現(xiàn)場(chǎng)總線/板級(jí)總線
現(xiàn)場(chǎng)協(xié)議主要是應(yīng)用在工業(yè)控制現(xiàn)場(chǎng),由于使用環(huán)境變得復(fù)雜,各種干擾會(huì)出現(xiàn)并對(duì)通信造成影響,所以這類通信協(xié)議一般采用差分信號(hào)或者提高高低電壓范圍的方式來提高抗干擾能力,不同協(xié)議有不同的電壓信號(hào)代表邏輯值0和1。
此圖來自百度百科關(guān)于現(xiàn)場(chǎng)總線的解釋。
現(xiàn)場(chǎng)總線:工業(yè)控制現(xiàn)場(chǎng)總線(可遠(yuǎn)距離傳輸數(shù)據(jù))
如:485總線—千米級(jí)別
can總線—十千米級(jí)
板級(jí)通信見名知意,就是應(yīng)用在PCB板上的的通信協(xié)議,主要是指SPI、IIC、UART、1-Wire這一類。
例如下圖中白色的SCL與SDA這兩個(gè)線就屬于板級(jí)總線。
板級(jí)總線:芯片之間通信(距離長(zhǎng)會(huì)被干擾)
如:IIC/SPI/8080
4. 串行/并行通信
按位傳輸,一位一位的發(fā)送,其優(yōu)勢(shì)在于傳輸數(shù)據(jù)所用的線極少,一個(gè)數(shù)據(jù)線即可完成數(shù)據(jù)傳輸。但是速度不如并行通信。
并行:一次發(fā)多位, 多根線,其優(yōu)勢(shì)是傳輸數(shù)據(jù)的速度快,但是需要占用較多的IO口。
5. 有線通信、無線通信
有線通信就是通過線纜進(jìn)行傳輸數(shù)據(jù),其優(yōu)勢(shì)在于可靠性強(qiáng),但缺點(diǎn)也在于對(duì)于復(fù)雜項(xiàng)目,線纜過長(zhǎng)會(huì)造成現(xiàn)場(chǎng)混亂。
而無線通信好處在于不需要線纜,會(huì)比較方便,但是相對(duì)也沒有有線通信的穩(wěn)定性高。GSM , 藍(lán)牙, 433(500m),2.4G,wifi這些都是常用的無線通信。
STM32通信協(xié)議的配置方式
使用STM32實(shí)現(xiàn)上面的那些通信協(xié)議時(shí)一般有兩種方案,一種是使用IO口模擬協(xié)議的時(shí)序,另一種就是配置對(duì)應(yīng)通信協(xié)議的片上外設(shè),通過片上外設(shè)來處理和獲取數(shù)據(jù)。
使用通信協(xié)議控制器實(shí)現(xiàn)
配置好對(duì)應(yīng)協(xié)議控制的功能
協(xié)議控制器會(huì)自己發(fā)送
不需要看相應(yīng)時(shí)序
看框圖,找配置流程,寫初始化函數(shù)
IO口配置成復(fù)用功能
使用IO口模擬的方式實(shí)現(xiàn)
通過IO口模仿對(duì)應(yīng)協(xié)議的控制器
通過高低電平實(shí)現(xiàn)通信時(shí)序的功能
相對(duì)于控制器來說不是很穩(wěn)定
IO口配置成通用功能
需要看時(shí)序圖
STM32串口通信概述
在了解了上面那么多有關(guān)通信的內(nèi)容后,現(xiàn)在開始進(jìn)入主題,什么是串口通信,串口通信能干什么,串口通信要怎么使用。
什么是串口通信
串口通信是一種設(shè)備間常用的串行通信方式,串口按位(bit)發(fā)送和接收字節(jié)。盡管比特字(byte)的串行通信慢,但是串口可以在使用一根線發(fā)送數(shù)據(jù)的同時(shí)用另一根線接收數(shù)據(jù)。
STM32F407的串口
通用同步異步收發(fā)器 (USART) 也就是STM32上的串口,注意還有另外一種名稱——UART;二者的區(qū)別在于,USART內(nèi)部有智能卡協(xié)議、紅外協(xié)議,而UART則沒有。
這里的命名既說了同步又說了異步收發(fā),按照上面的協(xié)議分類,他應(yīng)該只能屬于一種協(xié)議才對(duì),是這樣的,STM32的USART設(shè)置的有同步時(shí)鐘線,如果硬件連接這個(gè)時(shí)鐘線,那就是同步通信,如果不連接這個(gè)線,那么就是異步通信,在實(shí)際應(yīng)用中,大多使用異步通信。
所以參照上面的協(xié)議介紹,串口通信屬于,異步、串行、全雙工、有線通信。
那么STM32F407的串口一共有多少組呢,這個(gè)在數(shù)據(jù)手冊(cè)是有介紹的,一共有六組,其中USART有四組,UART有兩組。
既然看了數(shù)量,那在順便瞅一眼他們各自掛接的時(shí)鐘線,可以發(fā)現(xiàn),對(duì)于F407來說,USART1與USART6掛接在APB2上,而USART2、USART3、USAR4、USART5則是掛接在APB1上的,每個(gè)串口對(duì)應(yīng)在哪個(gè)時(shí)鐘線上,這點(diǎn)是需要知道的,因?yàn)楹筚I編程需要使用。
STM32串口通信的數(shù)據(jù)幀
所謂數(shù)據(jù)幀就是串口每次發(fā)出的數(shù)據(jù)包內(nèi)容,前面提到了,串口通信在發(fā)送數(shù)據(jù)的時(shí)候是按照一位一位去發(fā)送的,也就是單次發(fā)送的只有0或者1,為了將這些“00100110101”解析成對(duì)應(yīng)的數(shù)據(jù),通信雙方需要約定幀格式。
例如上圖這個(gè)傳輸過程就是傳輸了一個(gè)ascll 碼為0x4D的字符 ‘M’ ;
在STM32的串口通信中常用的數(shù)據(jù)幀格式為:
一個(gè)起始位 八位數(shù)據(jù)位 一個(gè)停止位,沒有使用奇偶校驗(yàn),例如我們發(fā)送一個(gè)字符A的數(shù)據(jù)幀就是如下圖所示:STM32 使用的是小端模式,也就是說,當(dāng)我們給一個(gè)int型的變量存入0x12345678時(shí),其低地址存放的就是78h,高地址存放的是12h。
數(shù)據(jù)幀:傳輸一包數(shù)據(jù) 一幀數(shù)據(jù)
一幀發(fā)一個(gè)字節(jié)數(shù)據(jù)(只能發(fā)送字符char類型的)
起始位(1) 數(shù)據(jù)位(8-9)可配置 停止位(0.5/1/2)可配置
STM32串口通信硬件連接
由于STM32的串口輸出是TTL電平的,如果要與其他工控機(jī)通信的話,需要使用到SP3232IDR的電平轉(zhuǎn)換芯片才可以通信。
我們平時(shí)與PC機(jī)通信使用的大多是USB口,USB的電平與TTL也不一樣,所以還也需要有電平轉(zhuǎn)換的IC來實(shí)現(xiàn)中轉(zhuǎn),這里常用的就是USB—TTL的CH340芯片,在使用CH340之前需要我們安裝其對(duì)應(yīng)的驅(qū)動(dòng),這也是為什么在之前搭建開發(fā)環(huán)境時(shí)需要安裝這個(gè)驅(qū)動(dòng)的原因。
一般的開發(fā)板外接USB轉(zhuǎn)串口都是用使用的PA9和PA10這一組管腳,沒有統(tǒng)一的標(biāo)準(zhǔn),但是很多板子都是這么做的。
STM32串口通信的四要素
前面說了一堆關(guān)于串口的知識(shí),在這里做個(gè)小結(jié), 串口收發(fā)的本質(zhì)實(shí)際上就是 接收和發(fā)送字符,需要掌握的無非也就是串口的四個(gè)要素:
串口的四要素分為:波特率 數(shù)據(jù)位 停止位 奇偶校驗(yàn)位
串口通信的必要條件:
兩臺(tái)設(shè)備進(jìn)行通信要確保雙方的四要素保持一致才能通信,下圖是PC端得四要素配置,也就是說,如果板子要和PC能夠通信,那么板子端的四要素也得跟PC端的配置一樣。
那么怎么配置板子端的四要素呢,繼續(xù)往下看。
STM32的串口框圖
在弄清了STM32串口的硬件連接方式以及通信數(shù)據(jù)幀格式后,就該選取配置方案了,對(duì)于串口這個(gè)模塊,絕大多數(shù)都是用的USART的控制器來實(shí)現(xiàn)的,幾乎沒有人使用IO口模擬來做,只有I2C、單總線才會(huì)更多的偏向使用IO口模擬通信。
關(guān)于怎么配置的問題,參考前面學(xué)習(xí)GPIO的配置流程,首先肯定要去查看其對(duì)應(yīng)的框圖,根據(jù)框圖搞清楚大致的通信流程,然后再去查看對(duì)應(yīng)的寄存器,最后根據(jù)流程編寫代碼。
那么接下來開始分析USART的框圖:
串口的整體框圖如下圖所示,一共分為了三個(gè)部分:
1.最上端叫做串口數(shù)據(jù)的收發(fā)過程;
2.中間叫做串口的控制過程;
3.最下面叫做波特率的計(jì)算過程。
和之前的GPIO一樣,為了方便理解,還是將框圖拆開來一個(gè)個(gè)的分析。
串口數(shù)據(jù)的收發(fā)過程
如下圖所示:其中的TX、RX就是STM32的串口通信管腳,TX對(duì)應(yīng)的是STM32的發(fā)送腳,從圖中可以看出,TX的數(shù)據(jù)來自發(fā)送移位寄存器,而且是通過串行傳輸方式,一位一位的傳輸?shù)模轿灰萍拇嫫鞯臄?shù)據(jù)又是來自上方的發(fā)送數(shù)據(jù)寄存器,且是并行傳輸,也就是說,需要發(fā)送數(shù)據(jù)時(shí),CPU通過總線將數(shù)據(jù)寫入到發(fā)送數(shù)據(jù)寄存器中,發(fā)送數(shù)據(jù)寄存器直接并行傳輸,一次性將一個(gè)字符存入發(fā)送位移寄存器,然后發(fā)送位移寄存器一位一位的將數(shù)據(jù)傳輸?shù)酵饨油ㄐ旁O(shè)備。
這里有幾個(gè)需要注意和思考的點(diǎn)
1.CPU寫數(shù)據(jù)到發(fā)送數(shù)據(jù)寄存器之前要檢測(cè)之前的發(fā)送是否完成,上一幀數(shù)據(jù)發(fā)送完成了才可以寫到發(fā)送數(shù)據(jù)寄存器,如果上一幀數(shù)據(jù)發(fā)送未完成則要等待發(fā)送完成;
2.那么CPU如何檢測(cè)之前的數(shù)據(jù)是否發(fā)送完成?這是由于在內(nèi)部有相應(yīng)的發(fā)送完成標(biāo)志位,當(dāng)數(shù)據(jù)發(fā)送完成后會(huì)有對(duì)應(yīng)的寄存器被置位,具體的到后面的寄存器講解部分再做介紹。
然后是接收部分,同樣的,外界的數(shù)據(jù)通過RX一位一位的進(jìn)入接收移位寄存器,當(dāng)接收移位寄存器檢測(cè)到接收完成時(shí),會(huì)將數(shù)據(jù)傳輸給接收數(shù)據(jù)寄存器,然后CPU再?gòu)慕邮諗?shù)據(jù)寄存器中將接收到的數(shù)據(jù)讀走。
注意:CPU在讀數(shù)據(jù)前要檢測(cè)是否接收完成, 接收完成就可以讀到變量中,如果沒有接收完成,要等待接收完成再讀到變量中。
思考:如何檢測(cè)是否接收完成?與發(fā)送一樣內(nèi)部也有相應(yīng)的接收完成標(biāo)志位,通過檢測(cè)對(duì)應(yīng)的寄存器即可,這個(gè)在后面的寄存器介紹中會(huì)詳細(xì)描述。
開發(fā)人員需要做的工作:
如果是發(fā)送數(shù)據(jù),判斷上一幀有沒有發(fā)送完,發(fā)送完了就往發(fā)送數(shù)據(jù)寄存器中寫入數(shù)據(jù)(1幀),沒有發(fā)送完就繼續(xù)等待接收完成。
如果是接收數(shù)據(jù),判斷上一幀數(shù)據(jù)有沒有接收完畢,接收完畢了就從接收數(shù)據(jù)寄存器中讀取數(shù)據(jù)(1幀),沒有接收完畢就等待接收完畢。
這一塊的偽代碼:
發(fā)送數(shù)據(jù)的過程
{
等待發(fā)送移位寄存器為空 (確保每一幀 每一幀是分開的)
發(fā)送數(shù)據(jù)
}
接收過程
{
等待接收移位寄存器為滿
接收數(shù)據(jù)
}
串口的控制過程
如下圖所示:圖中看得出來有很多的寄存器對(duì)發(fā)送控制和接收控制單元進(jìn)行配置了,具體的配置放到后面的寄存器介紹再說,然后兩個(gè)橙色框內(nèi)的硬件流以及同步時(shí)鐘引腳這些我們都用不到,所以暫時(shí)也不看。
這部分我們需要知道就是以下三點(diǎn):
1.此部分是配置串口發(fā)送和接收的使能以及前面提到的四要素中的絕大部分,具體怎么配置再下一篇的寄存器中描述,只需要知道這部分就是代碼中初始化串口所需要進(jìn)行配置的就行了。
2.上一步的發(fā)送位移寄存器是受到本部分的發(fā)送控制器控制的;
3.上一步接收移位寄存器實(shí)受到本部分的接收控制器控制的。
偽代碼以及配置了流程也留到下一篇的寄存器介紹中。
波特率的計(jì)算過程
最后是框圖的第三部分,也就是波特率的計(jì)算過程,
所謂的波特率就是表示數(shù)據(jù)的傳輸速率,常用的就是115200與9600,使用的時(shí)候注意將通信雙方配置為波特率一致即可,上一步驟配置了四要素中的三個(gè),這一步是專門用來管理第四個(gè)要素波特率的。
這個(gè)框圖也不需要看的太過認(rèn)真,需要了解的就是DIV_Mantissa存放的是USARTDIV的整數(shù)位,DIV_Fraction存放的是USARTDIV的小數(shù)位,
這個(gè)計(jì)算過程參考下面的這個(gè)公式即可,,實(shí)際上也就是上圖下方的公式做了變形:
整個(gè)公式中,fck是對(duì)應(yīng)時(shí)鐘線的頻率,這個(gè)是通過數(shù)據(jù)手冊(cè)可以查到的,就用USART1來說,它在APB2上,時(shí)鐘頻率為86 000 000HZ;
然后波特率我們也知道,要與上位機(jī)一致,這里設(shè)置為115200,
然后是OVER8這個(gè)是串口的8倍過采和16倍過采,在寄存器中有介紹,我們一般選擇16倍超采,也就是OVER8的值為0,
這樣一替換就只剩下了USARTDIV是一個(gè)未知數(shù),也就是說,我們需要對(duì)應(yīng)配置的只有這個(gè)USARTDIV,上面提到了由于它有小數(shù),所以在寫入U(xiǎn)SART_BRR寄存器時(shí)需要做一點(diǎn)處理,這里我們舉個(gè)栗子,以串口USART1 16倍過采來做個(gè)計(jì)算,看最終USART_BRR的數(shù)據(jù)如何寫入。
公式轉(zhuǎn)換:
USARTDIV=FCK/過采樣/波特率
USARTDIV=fck/(過采樣*波特率)
使用串口1
波特率:115200 時(shí)鐘大?。?span id="n5n3t3z" class="token number">84000000 過采樣:16
float USARTDIV;
unsigned int DIV_M;
unsigned int DIV_F;
USARTDIV=84000000/16/115200; // 45.57291666666667
DIV_M =(u32) USARTDIV;//讀取整數(shù)部分
DIV_F = (USARTDIV- DIV_M)*16+0.5 f //考慮四舍五入
USART1->BRR = DIV_M<<4 | DIV_F;
總結(jié)
關(guān)于串口的基礎(chǔ)概述就寫到這,下一篇分析寄存器以及編寫初始化代碼實(shí)現(xiàn)串口的通信。文中如有不妥之處歡迎大家批評(píng)指正。文章來源:http://www.zghlxwxcb.cn/news/detail-404017.html
M4系列目錄
1.嵌入式學(xué)習(xí)筆記——概述
2.嵌入式學(xué)習(xí)筆記——基于Cortex-M的單片機(jī)介紹
3.嵌入式學(xué)習(xí)筆記——STM32單片機(jī)開發(fā)前的準(zhǔn)備
4.嵌入式學(xué)習(xí)筆記——STM32硬件基礎(chǔ)知識(shí)
5.嵌入式學(xué)習(xí)筆記——認(rèn)識(shí)STM32的 GPIO口
6.嵌入式學(xué)習(xí)筆記——使用寄存器編程操作GPIO
7.嵌入式學(xué)習(xí)筆記——寄存器實(shí)現(xiàn)控制LED小燈
8.嵌入式學(xué)習(xí)筆記——使用寄存器編程實(shí)現(xiàn)按鍵輸入功能
9.嵌入式學(xué)習(xí)筆記——STM32的USART通信概述
10.嵌入式學(xué)習(xí)筆記——STM32的USART相關(guān)寄存器介紹及其配置
11.嵌入式學(xué)習(xí)筆記——STM32的USART收發(fā)字符串及串口中斷
12.嵌入式學(xué)習(xí)筆記——STM32的中斷控制體系
13.嵌入式學(xué)習(xí)筆記——STM32寄存器編程實(shí)現(xiàn)外部中斷
14.嵌入式學(xué)習(xí)筆記——STM32的時(shí)鐘樹
15.嵌入式學(xué)習(xí)筆記——SysTick(系統(tǒng)滴答)
16.嵌入式學(xué)習(xí)筆記——M4的基本定時(shí)器
17.嵌入式學(xué)習(xí)筆記——通用定時(shí)器
18.嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(上)
19.嵌入式學(xué)習(xí)筆記——PWM與輸入捕獲(下)
20.嵌入式學(xué)習(xí)筆記——ADC模數(shù)轉(zhuǎn)換器
21.嵌入式學(xué)習(xí)筆記——DMA
22.嵌入式學(xué)習(xí)筆記——SPI通信
23.嵌入式學(xué)習(xí)筆記——SPI通信的應(yīng)用
24嵌入式學(xué)習(xí)筆記——IIC通信文章來源地址http://www.zghlxwxcb.cn/news/detail-404017.html
到了這里,關(guān)于嵌入式學(xué)習(xí)筆記——STM32的USART通信概述的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!