stm32 USART串口協議與外設——江協教程踩坑經驗分享

江協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、發送流程

  1. 配置USART_CR1寄存器的TE位置1,使能發送器。

  2. 往USART_DR寄存器寫入要發送的數據,數據自動存儲在TDR內。

  3. TDR中的數據轉移到發送移位寄存器,然后逐位發送出去。

  4. 發送完成后,發送移位寄存器將數據發送完成標志位(TC)置1,表示傳輸完成。如果USART_CR1寄存器的TCIE位置1,將產生中斷,通知CPU進行后續處理。

2、接收流程

  1. 配置USART_CR1寄存器的RE位置1,使能接收器。

  2. 接收器檢測RX引腳上的起始位,開始接收數據。

  3. 接收到的數據逐位存入接收移位寄存器,接收完成后轉移到RDR,并將RXNE標志位置1。

  4. 檢測到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通信的注意事項

  1. 硬件連接正確性:確保通信雙方的VCC、GND、TX和RX引腳正確連接,避免接錯線導致通信失敗或損壞設備。

  2. 通信參數一致性:通信雙方的波特率、數據位、校驗位和停止位等參數必須配置一致,否則會導致數據傳輸錯誤。

  3. 抗干擾措施:在長距離或惡劣環境下通信時,盡量使用差分電平(如RS-485)以提高抗干擾能力,或者采取屏蔽、濾波等措施減少干擾。

  4. 數據完整性校驗:除了硬件提供的校驗位外,還可以在軟件層面添加數據校驗機制,如CRC校驗等,以進一步提高數據傳輸的可靠性

代碼部分見下一篇文。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913135.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913135.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913135.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習中的一些名詞

向前傳播 forward pass 在機器學習中,輸入的feature, 通過預測模型,輸出預測值,此過程稱之為向前傳播; 向后傳播 backward pass 為了將預測與真實值的產值減小,需要根據差值,更新模型中的參數,此…

鴻蒙系統(HarmonyOS)應用開發之手勢鎖屏密碼鎖(PatternLock)

項目概述 基于鴻蒙(OpenHarmony)平臺開發的手勢密碼鎖應用,旨在為用戶提供安全、便捷且具有良好交互體驗的身份驗證方式。通過手勢圖案輸入,用戶可以輕松設置和驗證密碼,提升設備的安全性和個性化體驗。 功能特點 手…

vue文本插值

好的,我們來詳細講解 Vue 中最基礎的數據展示方式:文本插值和在其內部使用的 JavaScript 表達式。 1. 文本插值 (Text Interpolation) 知識點: 文本插值是 Vue 中最基本的數據綁定形式。它使用“Mustache”語法(雙大括號 {{ }})…

Python:線性代數,向量內積諧音記憶。

目錄1 先說結論2 解釋3 歡迎糾錯4 論文寫作/Python 學習智能體------以下關于 Markdown 編輯器新的改變功能快捷鍵合理的創建標題,有助于目錄的生成如何改變文本的樣式插入鏈接與圖片如何插入一段漂亮的代碼片生成一個適合你的列表創建一個表格設定內容居中、居左、…

小程序導航設置更多內容的實現方法

在小程序中實現導航欄設置更多內容,可以通過以下幾種方式實現: 1. 使用原生導航欄自定義按鈕 javascript // app.json 或頁面.json中配置 {"navigationBarTitleText": "首頁","navigationBarTextStyle": "black&q…

SpringBoot 解決配置文件有黃色波浪線

在application.properties配置文件中有黃色波浪線,是警告!! 原因:編碼格式不一致!! 解決:Settings| Editor | File Encodings | 選擇UTF-8

在 Vue 3 中全局使用 Suspense 組件

Suspense 是 Vue 3 引入的一個內置組件,不需要引用可以直接用。用于處理異步依賴的等待狀態。雖然 Suspense 主要用于異步組件,但你也可以全局地使用它來管理整個應用的加載狀態。 全局 Suspense 的基本用法 1. 在根組件中使用 Suspense // main.js 或…

筆記/計算機網絡

Content 計算機網絡部分核心概念十大網絡協議一覽 計算機網絡部分核心概念 1. 什么是計算機網絡?它最基本的功能是什么? 計算機網絡是指通過某種傳輸介質將多臺獨立的計算機或設備連接起來,實現數據交換和資源共享的系統。其最基本的功能是數…

時頻圖數據集更正程序,去除坐標軸白邊及調整對應的標簽值

當數據集是時頻圖時可能有一個尷尬的問題,就是數據集制作好后,發現有白邊。 其實這也不影響訓練模型,可能對模型訓練效果的影響也是微乎其微的,于是大多數情況我會選擇直接用整張圖片訓練模型。但是,有的情況下&#x…

mv重命名報錯:bash:未預期的符號 ‘(‘附近有語法錯誤

文章目錄 一、報錯背景二、解決方法2.1、方法一:文件名加引號2.2、方法二:特殊字符前加\進行轉義 一、報錯背景 在linux上對一文件執行重命名時報錯。原因是該文件名包含空格與括號。 文件名如下: aa (1).txt執行命令及報錯如下…

Unity-MMORPG內容筆記-其三

繼續之前的內容: 戰斗系統 無需多言,整個項目中最復雜的部分,也是代碼量最大的部分。 屬性系統 首先我們要定義一系列屬性,畢竟所謂的戰斗就是不斷地扣血對吧。 屬性系統是戰斗系統的核心模塊,負責管理角色的所有…

Linux入門篇學習——Linux 幫助手冊

目錄 一、Linux 幫助手冊 1.怎么打開幫助手冊 2.安裝依賴 3.使用手冊查看命令 一、Linux 幫助手冊 1.怎么打開幫助手冊 打開 ubuntu ,輸入 man 命令打開幫助手冊,直接在控制臺輸入 man 就可以了, man 手冊一共有 9 頁&#xff0c…

2025年后端主流框架對比和競爭格局及趨勢發展

2025年的后端開發呈現出云原生主導、性能革命、AI深度融合的技術格局,主流框架在細分領域持續分化,新興技術快速滲透關鍵場景。以下是基于行業實踐與技術演進的深度解析: 一、主流框架競爭態勢與核心能力 1. Java生態:企業級市場的…

bRPC簡介

bRPC基礎介紹。 什么是RPC? 互聯網上的機器大都通過TCP/IP協議相互訪問,但TCP/IP只是往遠端發送了一段二進制數據,為了建立服務還有很多問題需要抽象: 數據以什么格式傳輸?不同機器間,網絡間可能是不同的字節序&am…

力扣網C語言編程題:在數組中查找目標值位置之二分查找法

一. 簡介 上一篇文章對力扣網上"有序數組中查找目標值范圍"題目進行了普通的解法。文章如下: 力扣網C語言編程題:在數組中查找目標值位置之暴力解法-CSDN博客 本文使用二分查找法進行實現,因為二分查找法符合題目要求&#xff0…

前端查詢條件加密傳輸方案(SM2加解密)

一、需求背景 控臺項目甲方進行安全測試,測試報告其中一條:敏感信息明文傳輸 1 敏感信息明文傳輸 中危 查詢接口傳輸手機號、銀行卡號等敏感信息時未加密/脫敏處理。 二、解決方案 討論出的方案是通過前端查詢條件加密,后端對加密的…

【Python】Flask網頁

Flask第三方庫安裝命令:pip install flask代碼:from flask import Flask app Flask(__name__)app.route("/") def hello():return "Hello world!"if __name__ "__main__":app.run()其中的"Hello world!"可以改…

數字資產革命中的信任之錨:RWA法律架構的隱形密碼

首席數據官高鵬團隊律師創作,AI輔助 在數字經濟的浪潮中,資產的邊界正在被重新定義。當一塊地產、一筆應收賬款、甚至一份碳配額被轉化為鏈上的數字代幣時,技術的光芒固然耀眼,但真正決定其生命力的,是背后隱匿的“信…

mobaxterm終端sqlplus亂碼問題解決

背景。使用mobaxterm終端連接linux。在查詢數據庫表注釋時發現**?**中文亂碼。影響對表的分析。完成以下三個編碼設置再打開sqlplus查詢含中文的數據就正常了 總結。需要查看sqlplus的編碼是什么 SELECT parameter, value FROM nls_database_parameters WHERE pa…

一個簡單的分布式追蹤系統

1. 準備工作 導入必要的庫 import contextvars import time from typing import Any, Optional, Dict, List, Union from dataclasses import dataclass, field2. 定義上下文變量 # 定義兩個上下文變量,存儲當前 Span 和 Trace _current_span: contextvars.Conte…