江協stm32學習:9-1~9-3 USART串口協議與外設
一、串口通信基礎知識
1、通信類型:
-
全雙工通信:通信雙方能夠同時進行雙向通信。一般有兩根通信線,如USART中的TX(發送)和RX(接收)線,SPI中的MOSI(發送)和MISO(接收)線。發送線路和接收線路互不影響,可實現高效的數據傳輸。
-
單工通信:數據只能從一個設備傳輸到另一個設備,不能反過來傳輸。這種方式應用較少,通常用于一些特定的單向數據流場景。(I2C,CAN和USB的兩根差分線也是組合成為一根數據線的,接收和發送會相互干擾)
2、同步與異步通信:
-
同步通信:通信雙方使用同一個時鐘信號進行數據傳輸,發送方和接收方共享一個公共的時鐘源,所有的數據傳輸都嚴格地按照這個時鐘信號的節奏進行。常見的同步通信接口有I2C和SPI,它們都具有專門的時鐘線,數據的采樣在時鐘信號的指引下進行,確保數據傳輸的同步性和準確性。
-
異步通信:發送方和接收方使用各自的獨立時鐘進行數據傳輸,雙方的時鐘信號并不需要嚴格地保持同步。數據的發送和接收主要依靠數據幀中的起始位和停止位來標識數據的開始和結束,接收方通過檢測這些控制位來對數據進行同步和識別。USART通常工作在異步模式下,適用于對實時性要求不高的場景。
I2C和SPI有自己時鐘線所以是同步,可以在時鐘信號的指引下進行采樣,其余沒有所以使用異步,需要雙方約定一個采樣頻率,并且還需要加一些幀頭幀尾等來進行采樣位置的對齊。
3、電平:
單端 & 差分:單端電平表示它們的引腳的高低電平都是對GND的電壓差,雙方都是公地的就是把GND接在一起;差分電平是靠差分引腳的電壓差來傳輸信號的,可以不需要GND(USB協議里面有一部分還是需要用到單端信號的),所以可以極大地提高抗干擾特性,故而差分信號一般傳輸速度和距離都會非常高
4、點對點與多設備通信:
-
點對點通信:一對一,兩個設備之間直接建立通信鏈路,連接簡單,通信效率高,可靠性高。
-
多設備通信:可以在總線上掛載多個設備,實現多對多的數據傳輸。
二、硬件電路連接
1、基本連接規則:
-
電源連接:除非兩個設備都具有自己的獨立供電系統,否則需要將VCC連接在一起,以確保通信雙方的電源電壓一致,保證信號的正確傳輸。
-
地線連接:為了提供穩定的參考電平,減少干擾,必須將兩個設備的GND連接在一起,尤其是在使用TTL、RS-232等單端電平時,地線的連接尤為重要。
-
信號線連接:在全雙工通信中,需要兩根信號線,發送端TX與接收端RX要交叉連接,即設備1的TX連接到設備2的RX,設備1的RX連接到設備2的TX。如果是單向數據傳輸,可以只接一根通信線。
2、電平轉換:
當通信雙方的電平標準不一致時,需要增加電平轉換芯片來進行轉換。
-
TTL電平:+3.3V或+5V表示邏輯1,0V表示邏輯0。TTL電平常見于單片機等數字電路中,具有傳輸速度快的特點,但抗干擾能力相對較弱,傳輸距離較短,一般只有幾米。(單片機中使用這種)
-
RS-232電平:-3V至-15V表示邏輯1,+3V至+15V表示邏輯0。RS-232電平具有較強的抗干擾能力,適合在較為惡劣的環境中使用,如一些大型機器的通信接口,其傳輸距離一般可達十幾米到幾十米。
-
RS-485電平:兩線壓差+2V至+6V表示邏輯1,-2V至-6V表示邏輯0,屬于差分信號。RS-485電平的抗干擾能力非常強,傳輸距離可達到幾千米,適用于長距離、高可靠性要求的通信場景。
三、USART結構與工作原理
1、USART簡介:
-
USART(Universal Synchronous/Asynchronous Receiver/Transmitter),即通用同步/異步收發器,是STM32內部集成的硬件外設。它可以根據數據寄存器的一個字節數據自動生成數據幀時序,從TX引腳發送出去,也可自動接收RX引腳的數據幀時序,拼接為一個字節數據,存放在數據寄存器里。
USART:同步;UART:異步。同步模式只多出時鐘輸出功能,輸入不支持,主要是為了兼容其他協議或者特殊用途而設置,并不支持兩個USART之間進行同步通信,所以一般還是使用異步模式
USART就是串口通信的硬件支持電路,配置好后,直接讀寫數據寄存器就能自動發送和接受數據了 -
USART支持多種功能配置,包括可配置的數據位長度(8位或9位)、停止位長度(0.5位、1位、1.5位或2位)、可選的校驗位(無校驗、奇校驗或偶校驗),以及支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN等多種通信模式。
硬件流控制:只有在接受設備準備好時才傳輸數據;IrDA用于紅外通信;LIN:局域網 -
STM32F103C8T6具有USART1、USART2和USART3三個USART資源
USART1:APB2總線上設備;USART2、USART3:APB1總線上設備
2、串口參數:
串口發送一個字節的格式是串口協議規定的,串口中,每一個字節都裝載在一個數據幀里面。每個數據為都由起始位、數據位和停止位組成(一共8個),還可以在后面加一個奇偶校驗位(共9個)
空閑狀態是高電位,所以需要把起始位置0來打破空閑狀態,最后的時候得回復來為下一幀做準備,所以結尾停止位高電平恢復。
數據位的低位先行就是說如果你實際數據是00001111,那么傳輸的順序就是11110000。
校驗位判斷是否數據傳輸錯誤,有無校驗、奇校驗、偶校驗三種。奇校驗是校驗位來保證1的個數為奇數,偶數反之。but這個校驗實際上檢出率不高,CRC校驗更好雖然也更復雜
3、USART寄存器:
-
數據寄存器(DR):TDR和RDR在程序上只表現為一個寄存器:數據寄存器DR(Data Register)
-
USART數據寄存器(USART_DR)只有低9位有效,第9位數據是否有效取決于USART控制寄存器1(USART_CR1)的M位設置。當M位為0時,表示8位數據字長;當M位為1時,表示9位數據字長。
-
USART_DR包含了已發送的數據或者接收到的數據。發送數據時,往USART_DR寫入數據會自動存儲在發送數據寄存器(TDR)內;接收數據時,向USART_DR讀取數據會自動提取接收數據寄存器(RDR)數據。
-
TDR和RDR介于系統總線和移位寄存器之間。發送時,TDR中的數據轉移到發送移位寄存器,然后逐位發送;接收時,接收到的位順序保存在接收移位寄存器內,再轉移到RDR。
-
-
移位寄存器:
-
發送移位寄存器和接收移位寄存器用于數據的逐位發送和接收。發送時,TDR中的數據轉移到發送移位寄存器,然后逐位發送出去;接收時,接收到的每一位順序保存在接收移位寄存器內,接收完成后轉移到RDR。
-
通過TDR和移位寄存器的兩重緩存機制,可以在保證數據傳輸正確率的情況下,使數據幀之間沒有空閑時間,提高通信效率。
-
4、USART控制:
-
發送器控制和接收器控制:
-
發送器控制和接收器控制用于管理移位寄存器的工作。發送使能位(TE)和接收使能位(RE)分別控制發送和接收功能的啟用和禁用。TE為1時,發送器使能;RE為1時,接收器使能。
-
-
硬件流控制:
-
硬件流控制用于控制數據傳輸速度,防止數據溢出和丟失。主要包括nRTS(請求發送)和nCTS(清除發送)兩個引腳。
-
nRTS是輸出引腳,低電平有效。當USART接收器準備好接收新數據時,nRTS引腳變為低電平;當接收寄存器已滿時,nRTS引腳變為高電平。
-
nCTS用于接收別人的nRTS信號。發送器在發送下一幀數據之前會檢測nCTS引腳,如果為低電平,表示可以發送數據;如果為高電平,則在發送完當前數據幀之后停止發送。
-
5、同步時鐘(SCLK)& 喚醒單元:
-
同步時鐘:SCLK引腳用于同步模式下的時鐘輸出。在同步模式下,發送器每移位一次,SCLK引腳的電平就跳變一個周期,用于同步數據傳輸。SCLK引腳的時鐘屬性可以通過USART時鐘初始化結構體進行配置,包括時鐘極性、時鐘相位和最尾位時鐘脈沖等。
-
喚醒單元:喚醒單元允許USART在低功耗模式下通過接收數據喚醒MCU,適用于需要長時間待機或低功耗運行的設備。
6、標志位:
- 發送寄存器空標志位(TXE):表示發送數據寄存器(TDR)是否為空。當TDR為空時,TXE位為1,表示可以繼續寫入新的發送數據。通過檢測TXE標志位,可以實現高效的數據發送流程,避免數據溢出和等待時間。
- 接收數據非空標志位(RXNE):表示接收數據寄存器(RDR)是否非空。當接收完成并將數據轉移到RDR后,RXNE位為1,表示可以讀取接收到的數據。檢測RXNE標志位后,可以及時讀取數據,避免數據丟失和延遲。
- 傳輸完成標志位(TC):TC標志位表示數據傳輸是否完成。當發送器完成最后一幀數據的發送后,TC位為1,表示數據傳輸完成。如果USART_CR1寄存器的TCIE位置1,將產生中斷,通知CPU進行后續處理。
7、起始位偵測:
輸入的時候需要保證采樣點在每一幀的中間位置,而且最好對于噪聲有一定的判斷能力
當輸入電路偵測到一個數據幀的起始位后,就會以波特率的頻率,連續采樣一幀數據,同時從起始位開始,采樣位置就要對齊到位的正中間,只要第一位對齊了,后面就肯定都是對齊的。
輸入電路采用16倍波特率對時鐘進行細分,即每位數據可進行16次采樣。初始空閑狀態為高電平時,采樣值始終為1。當出現下降沿時,采樣值會由1變為0,此時若無噪聲干擾,即表示檢測到起始位。在起始位期間,理論上16次采樣結果都應保持0值。
考慮到實際電路可能存在噪聲干擾,接收電路會在下降沿后采取額外校驗措施:分別在第3、5、7次和第8、9、10次采樣點進行兩批次驗證。每批次需滿足"3取2"原則(即3次采樣中至少有2次為0)才能確認起始位有效。若完全無噪聲,采樣結果應全為0;若存在輕微噪聲導致某批次出現2個0和1個1,系統仍會判定起始位有效,但會在狀態寄存器設置噪聲標志位(NE);若僅檢測到1個0,則認為下降沿由噪聲引起,系統將重新開始檢測。
通過起始位檢測后,接收狀態由空閑轉為接收起始位狀態。值得注意的是,第8、9、10次采樣點正好位于起始位中間位置,后續數據位的采樣也將在此位置進行,確保采樣點始終位于數據位中心。這一設計既實現了起始位檢測,又保證了采樣位置的對齊。
USART的起始位檢測需要用到特定序列。如果在RX線識別到該特定序列就認為是檢測到了起始位。起始位檢測對使用16倍或8倍過采樣的序列都是一樣的。該特定序列為:1110X0X0X0000,其中X表示電平任意,1或0皆可。
8、USART引腳:
-
TX引腳:發送數據輸出引腳,用于將數據從STM32發送到外部設備。
-
RX引腳:接收數據輸入引腳,用于從外部設備接收數據到STM32。
-
nRTS引腳:請求發送引腳,低電平有效,用于硬件流控制。當USART接收器準備好接收新數據時,nRTS引腳變為低電平;當接收寄存器已滿時,nRTS引腳變為高電平。
-
nCTS引腳:清除發送引腳,低電平有效,用于硬件流控制。發送器在發送下一幀數據之前會檢測nCTS引腳,如果為低電平,表示可以發送數據;如果為高電平,則在發送完當前數據幀之后停止發送。
-
SCLK引腳:同步模式下的時鐘輸出引腳,用于同步數據傳輸。
USART框圖?這個關于USART框圖的分解不錯
四、USART工作流程:
1、發送流程:
-
配置USART_CR1寄存器的TE位置1,使能發送器。
-
往USART_DR寄存器寫入要發送的數據,數據自動存儲在TDR內。
-
TDR中的數據轉移到發送移位寄存器,然后逐位發送出去。
-
發送完成后,發送移位寄存器將數據發送完成標志位(TC)置1,表示傳輸完成。如果USART_CR1寄存器的TCIE位置1,將產生中斷,通知CPU進行后續處理。
2、接收流程:
-
配置USART_CR1寄存器的RE位置1,使能接收器。
-
接收器檢測RX引腳上的起始位,開始接收數據。
-
接收到的數據逐位存入接收移位寄存器,接收完成后轉移到RDR,并將RXNE標志位置1。
-
檢測到RXNE標志位后,可以讀取USART_DR寄存器中的數據。如果USART_CR2寄存器的RXNEIE置1,則會產生中斷,通知CPU讀取數據。
3、波特率發生器:
波特率發生器相當于一個分頻器,用于生成USART的發送和接收時鐘。USART1的時鐘源為72MHz,USART2和USART3的時鐘源為36MHz。波特率計算公式如下:
波特率=USARTDIV×16時鐘源頻率?
其中,USARTDIV是分頻系數,通過配置USART_BRR寄存器來設置。例如,配置9600波特率時,USARTDIV的值可以通過以下公式計算:
USARTDIV=波特率×16時鐘源頻率?
配置完成后,將計算得到的USARTDIV值寫入USART_BRR寄存器。
五、USART的應用場景
-
與電腦通信:通過USART接口,STM32可以與電腦進行數據交互,方便進行調試、參數設置和數據監控等工作。例如,將采集到的傳感器數據發送到電腦進行顯示和分析,或者接收電腦發送的控制指令來控制STM32的工作狀態。
-
與傳感器或模塊通信:許多傳感器和模塊都支持USART通信接口,如溫濕度傳感器、藍牙模塊、Wi-Fi模塊等。STM32可以通過USART與這些設備相連,實現數據的采集和傳輸,從而構建各種智能系統和物聯網應用。
-
設備間通信:在一些工業控制系統或機器人系統中,多個STM32或其他微控制器之間可以通過USART進行通信,實現數據共享和協同工作。
六、USART通信的注意事項
-
硬件連接正確性:確保通信雙方的VCC、GND、TX和RX引腳正確連接,避免接錯線導致通信失敗或損壞設備。
-
通信參數一致性:通信雙方的波特率、數據位、校驗位和停止位等參數必須配置一致,否則會導致數據傳輸錯誤。
-
抗干擾措施:在長距離或惡劣環境下通信時,盡量使用差分電平(如RS-485)以提高抗干擾能力,或者采取屏蔽、濾波等措施減少干擾。
-
數據完整性校驗:除了硬件提供的校驗位外,還可以在軟件層面添加數據校驗機制,如CRC校驗等,以進一步提高數據傳輸的可靠性
代碼部分見下一篇文。