STM32的USART和UART的基本概念。文章主要集中在異步串行通信的原理上,講解了數據幀的結構、波特率等關鍵參數。我還介紹了UART的硬件組成部分,包括如何通過寄存器來控制數據的傳輸和接收。此外,文章還涉及了USART中斷字符的傳輸和錯誤處理的重要性。
Outline
USART基本概念和常見的應用
USART(universal synchronous asynchronous receiver transmitter, 通用異步接收發送器)是一種在計算機硬件中常見的硬件通信協議,用於串行通信。它允許設備之間進行點對點的低速度數據交換。USART的主要特點和工作原理如下:
- 異步串行通信:異步意味著在傳輸數據時,發送方和接收方的時鐘不同步。UART通信不需要時鐘信號來同步發送和接收的數據,這是它與同步串行通信(如SPI或I2C)的主要區別。
- 數據格式:UART通信中的數據通常包括起始位、數據位(通常是7或8位)、可選的奇偶校驗位,以及停止位。這種格式確保接收器可以正確地識別和解析接收到的數據。
- 波特率:UART通信中的一個關鍵參數是波特率,即每秒傳輸的位數。發送方和接收方必須設置為相同的波特率以實現正確的通信。
- 硬件結構:一個典型的UART包括一個發送器(用於發送數據, transmitter)和一個接收器(用於接收數據, receiver),以及一個串行數據線(對於全雙工通信,分別有一條用於發送和一條用於接收)。
- 應用場景:UART廣泛應用於微控制器、計算機、通信設備等場景,用於低速度的點對點通信。它非常適合於數據量不大,對實時性要求不高的應用。
- 無需外部時鐘:由於UART是異步的,它不需要外部的時鐘信號。這使得UART設計相對簡單,並減少了硬件需求。
同步異步接收發送器(USART)有多種運用,涵蓋了不同的通信需求和協議。通常有哪些運用如下:
- 全雙工數據交換:USART能夠與外部設備進行全雙工數據交換,即同時進行數據的發送和接收。這對於需要高效通信的應用非常重要。
- 支持NRZ異步串行數據格式:NRZ(Non-Return to Zero)格式廣泛用於工業標準的串行通信,USART的這一特性使其兼容多種設備。
- 廣泛的波特率範圍:通過使用分數波特率生成器,USART能夠支持非常廣泛的波特率,使其適用於多種不同速率的通信需求。
- 同步和半雙工通信:USART支持同步一向通信和半雙工單線通信,這增加了其在不同通信模式下的靈活性。
- 支持多種通信協議和標準:
- LIN(Local Interconnect Network):一種用於車載網絡的串行網絡協議。
- 智能卡協議(smart card):用於智能卡和讀卡器之間的通信。
- IrDA(Infrared Data Association)SIR ENDEC:一種紅外數據通信標準。
- 調制解調器操作(例如CTS/RTS):允許USART在調制解調器通信中使用。
- 多處理器通信:USART支持多處理器之間的通信(address mask),這對於複雜的系統和應用非常重要。
- 高速數據通信:通過使用DMA(直接內存訪問)進行多緩衝配置,USART可以實現高速數據傳輸,這對於要求高速數據處理的應用非常關鍵。
USART是一種多功能的通信工具,適用於多種不同的應用場景,從工業控制到車載系統,再到智能卡和無線通信,USART的多樣性和靈活性使其成為串行通信中一個強大的解決方案。
USART基本運作原理
做為串列通訊的工具,需要知道基本通訊的格式,如下:
在上方圖中顯示了幾種基本的data frame,而在一個frame中是由起始位(start bit)、停止位(stop bit)、可選的奇偶校驗位(parity bit,optional),以及數據位(7或8位)所組合成。其中注意兩個部分,Idle freme表示當前是閒置狀態,Break Frame是指數據線被有意或無意地保持在低電位一段時間(超過一個frame的時間),通常用於指示特殊情況或進行故障排除。
接下來介紹USART在STM32中是如何運作的,其中使用了那些Register,如下:
在下方圖USART block diagram中,首先注意背景灰色框框的部分,分成兩組分別為Transmit和Receive,再細分能夠分成Transmit Data Register (TDR)、Transmit Shift Register和Receive Data Register (RDR)、Receive Shift Register兩大部分。談談如何接收資料,首先外部資料透過Rx傳輸進來,再透過Receive Shift Register接收傳至RDR,最後由CPU或DMA的方式將資料放置SRAM內部,讓User能夠取其資料使用。反之,如果要將資料傳輸出去,能夠透過CPU或DMA方式將SRAM資料帶入到TDR內,最後再透過Transmit Shift Register傳輸至Tx,以上是基本的USART傳輸方式。
以上內容概述了USART的整體運作機制。接下來,我們將詳細介紹如何通過寄存器來控制數據傳輸和接收,探討各種中斷功能,以及如何確保資料傳輸的準確性。
USART – 單一字元傳輸與接收 (Singal Byte Communication)
字符傳輸
- TXE位的清除機制:
- TXE位在寫入數據寄存器時總是被清除。這意味著當有新數據被寫入數據寄存器時,TXE位會重置。
- TXE位設置的含義:
- 硬件設置TXE位,表示以下幾點:
- 數據已從TDR(Transmit Data Register,傳輸數據寄存器)移動到移位寄存器,並且數據傳輸已經開始。
- TDR寄存器是空的。
- 可以在不覆蓋前一數據的情況下,將下一數據寫入USART_DR(USART Data Register,USART數據寄存器)。
- 硬件設置TXE位,表示以下幾點:
- 中斷產生條件:
- 如果TXEIE(Transmit Data Register Empty Interrupt Enable)位被設置,TXE標誌將生成一個中斷。這意味著當TDR準備好接收新的數據時,系統可以配置為自動發出一個中斷信號。
- 數據寫入過程:
- 當正在進行數據傳輸時,對USART_DR(USART數據寄存器)的寫入操作會將數據存儲在TDR(傳輸數據寄存器)中。當前傳輸完成後,這些數據會被複製到移位寄存器中。
- 當沒有進行數據傳輸時,對USART_DR的寫入操作會直接將數據放入移位寄存器,隨即開始數據傳輸,並且TXE(傳輸數據寄存器空)位立即被設置。
- TXE位和TC位的行為:
- 如果一個數據幀(包括停止位)被傳輸並且TXE位被設置,則TC(傳輸完成)位會變高。
- 如果在USART_CR1(控制寄存器1)中設置了TCIE(傳輸完成中斷啟用)位,當TC位變高時會生成一個中斷。
- 關閉USART或進入低功耗模式前的要求:
- 在向USART_DR寫入最後一筆數據後,必須等待TC=1(表示傳輸完成)才能禁用USART或使微控制器進入低功耗模式。
流程圖說明:
- 將資料’A’進行傳輸,寫入至TDR,此時TXE(Transmit Data Register Empty)會被硬體重置。
- 資料會經由TDR隨著Clock帶入至Transmit Shift Register,這時TXE會被硬體設置,同時如果TXEIE有被啟用,則會發生中斷。
- 當資料透過Transmit Shift Register傳輸出去且完成,這時TC(Transmission Complete)會被硬體設置,如果有設置TCIE則會產生中斷(可軟體重置)。
請注意,上述流程適用於單字節傳輸。對於多字節傳輸情況,要使TC(傳輸完成)位被設置,除了完成當前傳輸外,還必須滿足TDR(傳輸數據寄存器)為空,即TXE(傳輸數據寄存器空)位被設置的條件。只有在這些條件都滿足時,TC位才會被設置,從而觸發TC中斷。
字符接收
- 字符接收過程:
- 在USART接收過程中,數據通過RX引腳按最低有效位先進行移位。在此模式下,USART_DR寄存器包含一個緩衝區(RDR),位於內部總線和接收移位寄存器之間。
- 接收設置步驟:
- 啟用USART:通過將USART_CR1寄存器中的UE位設置為1來啟用USART。
- 設定字長:在USART_CR1中設定M位,以定義字長。
- 設定停止位:在USART_CR2中設定停止位的數量。
- 選擇DMA使能:如果進行多緩衝通信,在USART_CR3中選擇DMA使能(DMAR),並按多緩衝通信中解釋的方式配置DMA寄存器。
- 選擇波特率:使用波特率寄存器USART_BRR來選擇所需的波特率。
- 設置接收使能:設置USART_CR1中的RE位。這啟用接收器,開始尋找起始位。
- 字符接收時的行為:
- 當字符被接收時,RXNE(接收數據寄存器非空)位被設置,表示移位寄存器的內容已轉移到RDR。換句話說,數據已被接收,可以讀取(以及相關的錯誤標誌)。
- 如果設置了RXNEIE位,則會生成中斷。
- 如果在接收過程中檢測到帧錯誤、噪聲或溢出錯誤,則可以設置錯誤標誌。
- 在多緩衝模式下,每接收一個字節後RXNE被設置,並通過DMA讀取數據寄存器來清除。
- 在單緩衝模式下,通過軟件讀取USART_DR寄存器來清除RXNE位。RXNE標誌也可以通過寫入零來清除。在接收下一個字符結束前必須清除RXNE位,以避免溢出錯誤。
- 注意事項:
- 在接收數據時不應重置RE位。如果在接收過程中禁用了RE位,則當前字節的接收將被中斷。
以上是USART傳輸接收流程筆記。
USART – Break Characters
在上小節了解Break frame用意之後,接下來說明如何傳送和接收Break frame:
USART – Transmit Break frame
通信中如何使用SBK(Send Break)位來傳送中斷字符(break character),以及相關的操作細節。以下是對這段文字的分析:
- 發送中斷字符:
- 通過設置SBK位,USART會傳送一個中斷字符。中斷幀的長度取決於M位的設定(M位用於定義數據位的長度)。
- SBK位的操作:
- 當SBK位設置為‘1’時,在完成當前字符傳輸後,USART會在TX(傳輸線)上發送一個中斷字符。
- 中斷字符傳輸完成時(即在中斷字符的停止位期間),該位會由硬件自動重置。
- 確保下一幀的識別:
- USART在最後一個中斷幀的末尾插入一個邏輯1位,以保證下一數據幀的起始位能被正確識別。
- 操作注意事項:
- 如果在中斷傳輸開始前,軟件重置了SBK位,則中斷字符將不會被傳輸。
- 對於連續兩次的中斷,應在前一次中斷的停止位之後再設置SBK位。
USART – Receive Break frame
- 中斷字符的接收:
- 在USART通信中,當接收端檢測到一個中斷字符時,這通常表示數據線被有意或無意地保持在低電平一段時間,這段時間超過了傳輸一個正常數據位的時間。
- 處理為幀錯誤:
- USART將接收到的中斷字符視為一種幀錯誤(framing error)。幀錯誤是串行通信中的一種錯誤類型,指的是數據幀的格式不符合預期,例如缺失停止位。
- 在這種情況下,USART偵測到的不是正常的數據幀結構(如起始位、數據位、可選的奇偶校驗位和停止位),而是一個異常的低電平信號,因此將其解釋為幀錯誤。
- 錯誤處理:
- 當USART檢測到幀錯誤時,它可能會通過設置錯誤標誌位、生成錯誤中斷或採取其他錯誤處理措施來響應這種情況。
- 接收到的中斷字符通常用於通信協議中的特殊目的,如指示通信的開始或結束,或用於錯誤恢復和診斷。
USART – Receiver Start bit detection
在USART中,當識別出特定的採樣序列時,起始位被檢測到。這個序列是:1 1 1 0 X 0 X 0 X 0 0 0 0。
- 起始位檢測的中止:
- 如果起始位的檢測序列不完整,起始位檢測將被中止,接收器返回到閒置狀態,不設置任何標誌位,在這個狀態下,它將等待下一個下降沿(表示新的起始位的可能開始)。
- 起始位的確認:
- 起始位被確認(RXNE接收數據寄存器非空標誌位設置,如果RXNEIE=1則生成中斷),如果在兩次採樣中,3個被採樣的位都為0(第一次採樣在第3、第5和第7位,第二次採樣在第8、第9和第10位)。
- 起始位的驗證與噪聲標誌:
- 起始位被驗證(RXNE標誌位設置,如果RXNEIE=1則生成中斷),但如果在兩次採樣中,至少有2個採樣位是0,則設置NE(噪聲)標誌位。如果這個條件不滿足,則起始位檢測被中止,並返回閒置狀態(不設置任何標誌位)。
- 如果在其中一次採樣(第3、第5和第7位或第8、第9和第10位的採樣)中,發現2個位為0,則起始位被驗證,但設置NE噪聲標誌位。
::在之後的文章會特別說明如何用軟體實現start bit detection。
UART與USART的比較
下方是UART和USART比較表格:
特性 | UART(通用異步接收發送器) | USART(通用同步異步接收發送器) |
---|---|---|
通信方式 | 只支持異步通信 | 支持同步和異步通信 |
時鐘同步 | 不需要外部時鐘信號 | 同步模式下需要外部時鐘信號 |
數據傳輸率 | 相對較低,適合低速通信 | 在同步模式下可以達到較高的數據傳輸率 |
技術複雜性 | 較低,硬件設計簡單 | 較高,特別是在同步模式下 |
應用場景 | 低速、低成本、低功耗應用,如簡單嵌入式系統 | 高速數據傳輸和複雜通信要求的場景,如高性能嵌入式系統 |
主要優勢 | 簡單性和成本效益 | 速度和靈活性 |
UART和USART最主要的區別在於它們的通信方式。UART專門用於異步通信,而USART則支持同步和異步通信。
- 通信方式:
- UART:只支持異步通信,即數據傳輸時沒有時鐘信號同步。這使得UART在設計上更為簡單,但通信速度通常較慢。
- USART:可以進行同步或異步通信。同步通信通常比異步通信快,但它需要額外的時鐘線來同步發送方和接收方。
- 應用場景和優勢:
- UART的簡單性使其非常適合於低速、低成本和低功耗的應用,如簡單的嵌入式系統和微控制器間的通信。
- USART由於其靈活性和高速能力,更適合於需要高速數據傳輸和更複雜通信要求的場景,例如高性能嵌入式系統、數據收集設備和通信接口。
技術細節的對比 除了通信方式的差異,UART和USART在技術細節上也有所不同。
- 時鐘同步:
- UART不需要外部時鐘信號,這意味著硬件設計更簡單,但也導致了數據傳輸率的限制。
- USART在同步模式下,需要時鐘同步信號,這提高了數據傳輸的速度和效率。
- 數據傳輸率:
- UART的數據傳輸率通常較低,但足以應對許多基本的串行通信需求。
- USART在同步模式下可以達到更高的數據傳輸率,適合數據量大的應用。
UART和USART都是串行通信中的重要組件,它們各有優勢。選擇使用哪一種取決於特定應用的需求。UART在簡單性和成本效益方面占優,而USART則在速度和靈活性方面更勝一籌。
以上是對USART常見的基本觀念。