單芯片解決方案,開啟全新體驗——W55MH32 高性能以太網單片機
W55MH32是WIZnet重磅推出的高性能以太網單片機,它為用戶帶來前所未有的集成化體驗。這顆芯片將強大的組件集于一身,具體來說,一顆W55MH32內置高性能Arm? Cortex-M3核心,其主頻最高可達216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲與數據處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協議棧、內置MAC以及PHY,擁有獨立的32KB以太網收發緩存,可供8個獨立硬件socket使用。如此配置,真正實現了All-in-One解決方案,為開發者提供極大便利。
在封裝規格上,W55MH32 提供了兩種選擇:QFN68和QFN100。
W55MH32Q采用QFN68封裝版本,尺寸為8x8mm,它擁有36個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、3個串口、2個SPI接口(其中1個帶I2S接口復用)、1個CAN以及1個USB2.0。在保持與同系列其他版本一致的核心性能基礎上,僅減少了部分GPIO以及SDIO接口,其他參數保持一致,性價比優勢顯著,尤其適合網關模組等對空間布局要求較高的場景。緊湊的尺寸和精簡化外設配置,使其能夠在有限空間內實現高效的網絡連接與數據交互,成為物聯網網關、邊緣計算節點等緊湊型設備的理想選擇。 同系列還有QFN100封裝的W55MH32L版本,該版本擁有更豐富的外設資源,適用于需要多接口擴展的復雜工控場景,軟件使用方法一致。更多信息和資料請進入http://www.w5500.com/網站或者私信獲取。
此外,本W55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應用,涵蓋TCP SSL、HTTP SSL以及MQTT SSL等,為網絡通信安全再添保障。
為助力開發者快速上手與深入開發,基于W55MH32Q這顆芯片,WIZnet精心打造了配套開發板。開發板集成WIZ-Link芯片,借助一根USB C口數據線,就能輕松實現調試、下載以及串口打印日志等功能。開發板將所有外設全部引出,拓展功能也大幅提升,便于開發者全面評估芯片性能。
若您想獲取芯片和開發板的更多詳細信息,包括產品特性、技術參數以及價格等,歡迎訪問官方網頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。
第二十四章 通用同步異步收發器(USART)
1 USART 介紹
通用同步異步收發器(USART)提供了一種靈活的方法與使用工業標準 NRZ 異步串行數據格式的外部設備之間進行全雙工數據交換。USART 利用分數波特率發生器提供寬范圍的波特率選擇。
它支持同步單向通信和半雙工單線通信,也支持 LIN(局部互連網),智能卡協議和 IrDA(紅外數據組織)SIRENDEC 規范,以及調制解調器(CTS/RTS)操作。它還允許多處理器通信。使用多緩沖器配置的 DMA 方式,可以實現高速數據通信。
2 USART 主要特性
W55MH32的USART的主要特性有:
?全雙工的,異步通信
?NRZ 標準格式
?分數波特率發生器系統
······發送和接收共用的可編程波特率,最高達 4.5Mbits/s
?可編程數據字長度(8 位或 9 位)
?可配置的停止位-支持 1 或 2 個停止位
?LIN 主發送同步斷開符的能力以及 LIN 從檢測斷開符的能力
······當 USART 硬件配置成 LIN 時,生成 13 位斷開符;檢測 10/11 位斷開符
?發送方為同步傳輸提供時鐘
?IRDASIR 編碼器解碼器
······在正常模式下支持 3/16 位的持續時間
?智能卡模擬功能
······智能卡接口支持 ISO7816-3 標準里定義的異步智能卡協議
······智能卡用到的 0.5 和 1.5 個停止位
?單線半雙工通信
?可配置的使用 DMA 的多緩沖器通信
······在 SRAM 里利用集中式 DMA 緩沖接收/發送字節
?單獨的發送器和接收器使能位
?檢測標志
······接收緩沖器滿
······發送緩沖器空
······傳輸結束標志
?校驗控制
······發送校驗位
······對接收數據進行校驗
?四個錯誤檢測標志
······溢出錯誤
······噪音錯誤
······幀錯誤
······校驗錯誤
?10 個帶標志的中斷源
······CTS 改變
······LIN 斷開符檢測
······發送數據寄存器空
······發送完成
······接收數據寄存器滿
······檢測到總線為空閑
······溢出錯誤
······幀錯誤
······噪音錯誤
······校驗錯誤
?多處理器通信--如果地址不匹配,則進入靜默模式
?從靜默模式中喚醒(通過空閑總線檢測或地址標志檢測)
?兩種喚醒接收器的方式:地址位(MSB,第 9 位),總線空閑
3 USART 功能概述
接口通過三個引腳與其他設備連接在一起(見圖 249)。任何 USART 雙向通信至少需要兩個腳:接收數據輸入(RX)和發送數據輸出(TX)。
RX:接收數據串行輸。通過過采樣技術來區別數據和噪音,從而恢復數據。
TX:發送數據輸出。當發送器被禁止時,輸出引腳恢復到它的 I/O 端口配置。當發送器被激活,并且不發送數據時,TX 引腳處于高電平。在單線和智能卡模式里,此 I/O 口被同時用于數據的發送和接收。
?總線在發送或接收前應處于空閑狀態
?一個起始位
?一個數據字(8 或 9 位),最低有效位在前
?0.5,1.5,2 個的停止位,由此表明數據幀的結束
?使用分數波特率發生器——12 位整數和 4 位小數的表示方法。
?一個狀態寄存器(USART_SR)
?數據寄存器(USART_DR)
?一個波特率寄存器(USART_BRR),12 位的整數和 4 位小數
?一個智能卡模式下的保護時間寄存器(USART_GTPR)
關于以上寄存器中每個位的具體定義,請參考寄存器描述第 23.6 節:USART 寄存器描述。在同步模式中需要下列引腳:
?CK:發送器時鐘輸出。此引腳輸出用于同步傳輸的時鐘,(在 Start 位和 Stop 位上沒有時鐘脈沖,軟件可選地,可以在最后一個數據位送出一個時鐘脈沖)。數據可以在 RX 上同步被接收。
這可以用來控制帶有移位寄存器的外部設備(例如 LCD 驅動器)。時鐘相位和極性都是軟件可編程的。在智能卡模式里,CK 可以為智能卡提供時鐘。在 IrDA 模式里需要下列引腳:
?IrDA_RDI:IrDA 模式下的數據輸入。
?IrDA_TDO:IrDA 模式下的數據輸出。下列引腳在硬件流控模式中需要:
接口通過三個引腳與其他設備連接在一起(見圖 249)。任何 USART 雙向通信至少需要兩個腳:接收數據輸入(RX)和發送數據輸出(TX)。
RX:接收數據串行輸。通過過采樣技術來區別數據和噪音,從而恢復數據。
TX:發送數據輸出。當發送器被禁止時,輸出引腳恢復到它的 I/O 端口配置。當發送器被激活,并且不發送數據時,TX 引腳處于高電平。在單線和智能卡模式里,此 I/O 口被同時用于數據的發送和接收。
總線在發送或接收前應處于空閑狀態
?一個起始位
?一個數據字(8 或 9 位),最低有效位在前
?0.5,1.5,2 個的停止位,由此表明數據幀的結束
?使用分數波特率發生器——12 位整數和 4 位小數的表示方法。
?一個狀態寄存器(USART_SR)
?數據寄存器(USART_DR)
?一個波特率寄存器(USART_BRR),12 位的整數和 4 位小數
?一個智能卡模式下的保護時間寄存器(USART_GTPR)
關于以上寄存器中每個位的具體定義,請參考寄存器描述第 23.6 節:USART 寄存器描述。在同步模式中需要下列引腳:
?CK:發送器時鐘輸出。此引腳輸出用于同步傳輸的時鐘,(在 Start 位和 Stop 位上沒有時鐘脈沖,軟件可選地,可以在最后一個數據位送出一個時鐘脈沖)。數據可以在 RX 上同步被接收。這可以用來控制帶有移位寄存器的外部設備(例如 LCD 驅動器)。時鐘相位和極性都是軟件可編程的。在智能卡模式里,CK 可以為智能卡提供時鐘。在 IrDA 模式里需要下列引腳:
?IrDA_RDI:IrDA 模式下的數據輸入。
?IrDA_TDO:IrDA 模式下的數據輸出。下列引腳在硬件流控模式中需要:
USART 框圖
3.1 USART 特性描述
字長可以通過編程 USART_CR1 寄存器中的 M 位,選擇成 8 或 9 位(見圖 230)。在起始位期間,TX腳處于低電平,在停止位期間處于高電平。
空閑符號被視為完全由'1'組成的一個完整的數據幀,后面跟著包含了數據的下一幀的開始位(‘1'的位數也包括了停止位的位數)。
斷開符號被視為在一個幀周期內全部收到'0'(包括停止位期間,也是'0')。在斷開幀結束時,發送器再插入 1 或 2 個停止位(‘1')來應答起始位。
發送和接收由一共用的波特率發生器驅動,當發送器和接收器的使能位分別置位時,分別為其產生時鐘。
隨后將有每個功能塊的詳細說明。
字長設置
3.2 發送器
發送器根據 M 位的狀態發送 8 位或 9 位的數據字。當發送使能位(TE)被設置時,發送移位寄存器中的數據在 TX 腳上輸出,相應的時鐘脈沖在 CK 腳上輸出。
字符發送
在 USART 發送期間,在 TX 引腳上首先移出數據的最低有效位。在此模式里,USART_DR 寄存器包含了一個內部總線和發送移位寄存器之間的緩沖器(見圖 249)。
每個字符之前都有一個低電平的起始位;之后跟著的停止位,其數目可配置。USART 支持多種停止位的配置:0.5、1、1.5 和 2 個停止位。
注: 1.在數據傳輸期間不能復位 TE 位,否則將破壞 TX 腳上的數據,因為波特率計數器停止計數。正在傳輸的當前數據將丟失。
2.TE 位被激活后將發送一個空閑幀。
可配置的停止位
隨每個字符發送的停止位的位數可以通過控制寄存器 2 的位 13、12 進行編程。
1. 1 個停止位:停止位位數的默認值。
2. 2 個停止位:可用于常規 USART 模式、單線模式以及調制解調器模式。
3. 0.5 個停止位:在智能卡模式下接收數據時使用。
4. 1.5 個停止位:在智能卡模式下發送和接收數據時使用。
空閑幀包括了停止位。
斷開幀是 10 位低電平,后跟停止位(當 m=0 時);或者 11 位低電平,后跟停止位(m=1 時)。不可能傳輸更長的斷開幀(長度大于 10 或者 11 位)。
配置停止位
配置步驟:
1. 通過在 USART_CR1 寄存器上置位 UE 位來激活 USART
2. 編程 USART_CR1 的 M 位來定義字長。
3. 在 USART_CR2 中編程停止位的位數。
4. 如果采用多緩沖器通信,配置 USART_CR3 中的 DMA 使能位(DMAT)。按多緩沖器通信中的描述配置 DMA 寄存器。
5. 利用 USART_BRR 寄存器選擇要求的波特率。
6. 設置 USART_CR1 中的 TE 位,發送一個空閑幀作為第一次數據發送。
7. 把要發送的數據寫進 USART_DR 寄存器(此動作清除 TXE 位)。在只有一個緩沖器的情況下,
對每個待發送的數據重復步驟 7。
8. 在 USART_DR 寄存器中寫入最后一個數據字后,要等待 TC=1,它表示最后一個數據幀的傳輸結束。當需要關閉 USART 或需要進入停機模式之前,需要確認傳輸結束,避免破壞最后一次傳輸。
單字節通信
清零 TXE 位總是通過對數據寄存器的寫操作來完成的。TXE 位由硬件來設置,它表明:
數據已經從 TDR 移送到移位寄存器,數據發送已經開始
TDR 寄存器被清空
下一個數據可以被寫進 USART_DR 寄存器而不會覆蓋先前的數據如果 TXEIE 位被設置,此標志將產生一個中斷。
如果此時 USART 正在發送數據,對 USART_DR 寄存器的寫操作把數據存進 TDR 寄存器,并在當前傳輸結束時把該數據復制進移位寄存器。
如果此時 USART 沒有在發送數據,處于空閑狀態,對 USART_DR 寄存器的寫操作直接把數據放進移位寄存器,數據傳輸開始,TXE 位立即被置起。當一幀發送完成時(停止位發送后)并且設置了 TXE 位,TC 位被置起,如果 USART_CR1 寄存器中的 TCIE 位被置起時,則會產生中斷。在 USART_DR 寄存器中寫入了最后一個數據字后,在關閉 USART 模塊之前或設置微控制器進入低功耗模式(詳見下圖)之前,必須先等待 TC=1。使用下列軟件過程清除 TC 位:
1.讀一次 USART_SR 寄存器;
2.寫一次 USART_DR 寄存器。
注: TC 位也可以通過軟件對它寫'0'來清除。此清零方式只推薦在多緩沖器通信模式下使用。
發送時 TC/TXE 的變化情況
斷開符號
設置 SBK 可發送一個斷開符號。斷開幀長度取決 M 位(見圖 230)。如果設置 SBK=1,在完成當前數據發送后,將在 TX 線上發送一個斷開符號。斷開字符發送完成時(在斷開符號的停止位時)SBK 被硬件復位。USART 在最后一個斷開幀的結束處插入一邏輯'1',以保證能識別下一幀的起始位。
注意: 如果在開始發送斷開幀之前,軟件又復位了 SBK 位,斷開符號將不被發送。如果要發送兩個連續的斷開幀,SBK 位應該在前一個斷開符號的停止位之后置起。
空閑符號:置位 TE 將使得 USART 在第一個數據幀前發送一空閑幀。
3.3 接收器
USART 可以根據 USART_CR1 的 M 位接收 8 位或 9 位的數據字。
起始位偵測
在 USART 中,如果辨認出一個特殊的采樣序列,那么就認為偵測到一個起始位。
該序列為:1110X0X0X0000
起始位偵測
注意: 如果該序列不完整,那么接收端將退出起始位偵測并回到空閑狀態(不設置標志位)等待下降沿。如果 3 個采樣點都為'0'(在第 3、5、7 位的第一次采樣,和在第 8、9、10 的第二次采樣都為'0'),則確認收到起始位,這時設置 RXNE 標志位,如果 RXNEIE=1,則產生中斷。
如果兩次 3 個采樣點上僅有 2 個是'0'(第 3、5、7 位的采樣點和第 8、9、10 位的采樣點),那么起始位仍然是有效的,但是會設置 NE 噪聲標志位。如果不能滿足這個條件,則中止起始位的偵測過程,接收器會回到空閑狀態(不設置標志位)。如果有一次 3 個采樣點上僅有 2 個是'0'(第 3、5、7 位的采樣點或第 8、9、10 位的采樣點),那么起始位仍然是有效的,但是會設置 NE 噪聲標志位
字符接收
在 USART 接收期間,數據的最低有效位首先從 RX 腳移進。在此模式里,USART_DR 寄存器包含的緩沖器位于內部總線和接收移位寄存器之間。
配置步驟:
1. 將 USART_CR1 寄存器的 UE 置 1 來激活 USART。
2. 編程 USART_CR1 的 M 位定義字長
3. 在 USART_CR2 中編寫停止位的個數
4. 如果需多緩沖器通信,選擇 USART_CR3 中的 DMA 使能位(DMAR)。按多緩沖器通信所要求的配置 DMA 寄存器。
5. 利用波特率寄存器 USART_BRR 選擇希望的波特率。
6. 設置 USART_CR1 的 RE 位。激活接收器,使它開始尋找起始位。當一字符被接收到時,
?RXNE位被置位。它表明移位寄存器的內容被轉移到 RDR。換句話說,數據已經被接收并且可以被讀出(包括與之有關的錯誤標志)。
?如果 RXNEIE 位被設置,產生中斷。
?在接收期間如果檢測到幀錯誤,噪音或溢出錯誤,錯誤標志將被置起,
?在多緩沖器通信時,RXNE 在每個字節接收后被置起,并由 DMA 對數據寄存器的讀操作而清零。
?在單緩沖器模式里,由軟件讀 USART_DR 寄存器完成對 RXNE 位清除。RXNE 標志也可以通過對它寫 0 來清除。RXNE 位必須在下一字符接收結束前被清零,以避免溢出錯誤。
注意: 在接收數據時,RE 位不應該被復位。如果 RE 位在接收時被清零,當前字節的接收被丟失。
斷開符號
當接收到一個斷開幀時,USART 像處理幀錯誤一樣處理它。
空閑符號
當一空閑幀被檢測到時,其處理步驟和接收到普通數據幀一樣,但如果 IDLEIE 位被設置將產生一個中斷。
溢出錯誤
如果 RXNE 還沒有被復位,又接收到一個字符,則發生溢出錯誤。數據只有當 RXNE 位被清零后才能從移位寄存器轉移到 RDR 寄存器。RXNE 標記是接收到每個字節后被置位的。如果下一個數據已被收到或先前 DMA 請求還沒被服務時,RXNE 標志仍是置起的,溢出錯誤產生。當溢出錯誤產生時:
?ORE 位被置位。
?RDR 內容將不會丟失。讀 USART_DR 寄存器仍能得到先前的數據。
?移位寄存器中以前的內容將被覆蓋。隨后接收到的數據都將丟失。
?如果 RXNEIE 位被設置或 EIE 和 DMAR 位都被設置,中斷產生。
?順序執行對 USART_SR 和 USART_DR 寄存器的讀操作,可復位 ORE 位
注意: 當 ORE 位置位時,表明至少有 1 個數據已經丟失。有兩種可能性:
?如果 RXNE=1,上一個有效數據還在接收寄存器 RDR 上,可以被讀出。
?如果 RXNE=0,這意味著上一個有效數據已經被讀走,RDR已經沒有東西可讀。當上一個有效數據在 RDR 中被讀取的同時又接收到新的(也就是丟失的)數據時,此種情況可能發生。在讀序列期間(在 USART_SR 寄存器讀訪問和 USART_DR 讀訪問之間)接收到新的數據,此種情況也可能發生。
噪音錯誤
使用過采樣技術(同步模式除外),通過區別有效輸入數據和噪音來進行數據恢復。
檢測噪聲的數據采樣
檢測噪聲的數據采樣
采樣值 | NE 狀態 | 接收的位 | 數據有效性 |
000 | 0 | 0 | 有效 |
001 | 1 | 0 | 無效 |
010 | 1 | 0 | 無效 |
011 | 1 | 1 | 無效 |
100 | 1 | 0 | 無效 |
101 | 1 | 1 | 無效 |
110 | 1 | 1 | 無效 |
111 | 0 | 1 | 有效 |
當在接收幀中檢測到噪音時:
?在 RXNE 位的上升沿設置 NE 標志。
?無效數據從移位寄存器傳送到 USART_DR 寄存器。
?在單個字節通信情況下,沒有中斷產生。然而,因為 NE 標志位和 RXNE 標志位是同時被設置,RXNE 將產生中斷。在多緩沖器通信情況下,如果已經設置了 USART_CR3 寄存器中 EIE 位,將產生一個中斷。先讀出 USART_SR,再讀出 USART_DR 寄存器,將清除 NE 標志位。
幀錯誤
當以下情況發生時檢測到幀錯誤:
由于沒有同步上或大量噪音的原因,停止位沒有在預期的時間上接和收識別出來。
當幀錯誤被檢測到時:
?FE 位被硬件置起
?無效數據從移位寄存器傳送到 USART_DR 寄存器。
?在單字節通信時,沒有中斷產生。然而,這個位和 RXNE 位同時置起,后者將產生中斷。在多緩沖器通信情況下,如果 USART_CR3 寄存器中 EIE 位被置位的話,將產生中斷。順序執行對 USART_SR 和 USART_DR 寄存器的讀操作,可復位 FE 位。接收期間的可配置的停止位被接收的停止位的個數可以通過控制寄存器 2的控制位來配置,在正常模式時,可以是 1或 2個,在智能卡模式里可能是 0.5 或 1.5 個。
1. 0.5 個停止位(智能卡模式中的接收):不對 0.5 個停止位進行采樣。因此,如果選擇 0.5 個停止位則不能檢測幀錯誤和斷開幀。
2. 1 個停止位:對 1 個停止位的采樣在第 8,第 9 和第 10 采樣點上進行。
3. 1.5 個停止位(智能卡模式):當以智能卡模式發送時,器件必須檢查數據是否被正確的發送出去。所以接收器功能塊必須被激活(USART_CR1 寄存器中的 RE=1),并且在停止位的發送期間采樣數據線上的信號。如果出現校驗錯誤,智能卡會在發送方采樣 NACK 信號時,即總線上停止位對應的時間內時,拉低數據線,以此表示出現了幀錯誤。FE 在 1.5 個停止位結束時和RXNE 一起被置起。對 1.5 個停止位的采樣是在第 16,第 17 和第 18 采樣點進行的。1.5 個的停止位可以被分成 2 部分:一個是 0.5 個時鐘周期,期間不做任何事情。隨后是 1 個時鐘周期的停止位,在這段時間的中點處采樣。詳見第 23.3.11 節:智能卡。
4. 2 個停止位:對 2 個停止位的采樣是在第一停止位的第 8,第 9 和第 10 個采樣點完成的。如果第一個停止位期間檢測到一個幀錯誤,幀錯誤標志將被設置。第二個停止位不再檢查幀錯誤。在第一個停止位結束時 RXNE 標志將被設置。
3.4 分數波特率的產生
接收器和發送器的波特率在 USARTDIV 的整數和小數寄存器中的值應設置成相同。
Tx/Rx波特率 = fck/(16 ? USARTDIV)這里的 fCK 是給外設的時鐘(PCLK1 用于 USART2、3、4、5,PCLK2 用于 USART1)USARTDIV 是一個無符號的定點數。這 12 位的值設置在 USART_BRR 寄存器。
注: 在寫入 USART_BRR 之后,波特率計數器會被波特率寄存器的新值替換。因此,不要在通信進行中改變波特率寄存器的數值
如何從 USART_BRR 寄存器值得到 USARTDIV
例 1:
如果 DIV_Mantissa=0d27,DIV_Fraction=0d12(USART_BRR=0x1BC),
于是:
Mantissa(USARTDIV)=0d27
Fraction(USARTDIV)=12/16=0d0.75
所以 USARTDIV=0d27.75
例 2:
要求 USARTDIV=0d25.62,
就有:
DIV_Fraction=16*0.62=0d9.92
最接近的整數是:10=0x0A
DIV_Mantissa=mantissa(0d25.620)=0d25=0x19
于是,USART_BRR=0x19A 因此 USARTDIV = 0d25.625
例 3:
要求 USARTDIV=0d50.99
就有:
DIV_Fraction=16*0d0.99=0d15.84
最接近的整數是:16=0x10=>DIV_frac[3:0]溢出=>進位必須加到小數部分
DIV_Mantissa=mantissa(0d50.990+進位)=0d51=0x33
于是:USART_BRR=0x330,USARTDIV=0d51.000
設置波特率時的誤差計算
序號 | 波特率 (Kbps) | fPCLK=36MHz | fPCLK=72MHz | ||||
實際 | 置于波特率寄存器中的值 | 誤差 % | 實際 | 置于波特率寄存器中的值 | 誤差 % | ||
1 | 2.4 | 2.400 | 937.5 | 0% | 2.4 | 1875 | 0% |
2 | 9.6 | 9.600 | 234.375 | 0% | 9.6 | 468.75 | 0% |
3 | 19.2 | 19.2 | 117.1875 | 0% | 19.2 | 234.375 | 0% |
4 | 57.6 | 57.6 | 39.0625 | 0% | 57.6 | 78.125 | 0% |
5 | 115.2 | 115.384 | 19.5 | 0.15% | 115.2 | 39.0625 | 0% |
6 | 230.4 | 230.769 | 9.75 | 0.16% | 230.769 | 19.5 | 0.16% |
7 | 460.8 | 461.538 | 4.875 | 0.16% | 461.538 | 9.75 | 0.16% |
8 | 921.6 | 923.076 | 2.4375 | 0.16% | 923.076 | 4.875 | 0.16% |
9 | 2250 | 2250 | 1 | 0% | 2250 | 2 | 0% |
分享波特率和誤差%之間有什么關系?
fPCLK為72MHz時,置于波特率寄存器中的值能否小于實際值?
如何根據實際需求選擇合適的波特率?
注: 1.CPU 的時鐘頻率越低,則某一特定波特率的誤差也越低??梢赃_到的波特率上限可以由這組數據得到。
只有 USART1 使用 PCLK2(最高 72MHz)。其它 USART 使用 PCLK1(最高 36MHz)。
3.5 USART 接收器容忍時鐘的變化
只有當整體的時鐘系統地變化小于 USART 異步接收器能夠容忍的范圍,USART 異步接收器才能正常地工作。影響這些變化的因素有:
?DTRA:由于發送器誤差而產生的變化(包括發送器端振蕩器的變化)
?DQUANT:接收器端波特率取整所產生的誤差
?DREC:接收器端振蕩器的變化
?DTCL:由于傳輸線路產生的變化(通常是由于收發器在由低變高的轉換時序,與由高變低轉換時序之間的不一致性所造成)。需要滿足:?DTRA+DQUANT+DREC+DTCL
?由 USART_CR1 寄存器的 M 位定義的 10 或 11 位字符長度
?是否使用分數波特率產生
當 DIV_Fraction=0 時,USART 接收器的容忍度
M 位 | 認為 NF 是錯誤 | 不認為 NF 是錯誤 |
0 | 3.75% | 4.375% |
1 | 3.41% | 3.97% |
當 DIV_Fraction!=0 時,USART 接收器的容忍度
M 位 | 認為 NF 是錯誤 | 不認為 NF 是錯誤 |
0 | 3.33% | 3.88% |
1 | 3.03% | 3.53% |
注: 在特殊的情況下,即當收到的幀包含一些在 M=0 時,正好是 10 位(M=1 時是 11 位)的空閑幀,上面 2 個表格中的數據可能會有少許出入
3.6 多處理器通信
通過 USART 可以實現多處理器通信(將幾個 USART 連在一個網絡里)。例如某個 USART 設備可以是主,它的 TX 輸出和其他 USART 從設備的 RX 輸入相連接;USART 從設備各自的 TX 輸出邏輯地與在一起,并且和主設備的 RX 輸入相連接。
在多處理器配置中,我們通常希望只有被尋址的接收者才被激活,來接收隨后的數據,這樣就可以減少由未被尋址的接收器的參與帶來的多余的 USART 服務開銷。未被尋址的設備可啟用其靜默功能置于靜默模式。在靜默模式里:
?任何接收狀態位都不會被設置。
?所有接收中斷被禁止。
?USART_CR1 寄存器中的 RWU 位被置 1。RWU 可以被硬件自動控制或在某個條件下由軟件寫入。
根據 USART_CR1 寄存器中的 WAKE 位狀態,USART 可以用二種方法進入或退出靜默模式。
?如果 WAKE 位被復位:進行空閑總線檢測。
?如果 WAKE 位被設置:進行地址標記檢測。
空閑總線檢測(WAKE=0)
當 RWU 位被寫 1 時,USART 進入靜默模式。當檢測到一空閑幀時,它被喚醒。然后 RWU 被硬件清零,但是 USART_SR 寄存器中的 IDLE 位并不置起。RWU 還可以被軟件寫 0。下圖給出利用空閑總線檢測來喚醒和進入靜默模式的一個例子
利用空閑總線檢測的靜默模式
地址標記(addressmark)檢測(WAKE=1)
在這個模式里,如果 MSB 是 1,該字節被認為是地址,否則被認為是數據。在一個地址字節中,目標接收器的地址被放在 4 個 LSB 中。這個 4 位地址被接收器同它自己地址做比較,接收器的地址被編程在 USART_CR2 寄存器的 ADD。
如果接收到的字節與它的編程地址不匹配時,USART 進入靜默模式。此時,硬件設置 RWU 位。接收該字節既不會設置 RXNE 標志也不會產生中斷或發出 DMA 請求,因為 USART 已經在靜默模式。當接收到的字節與接收器內編程地址匹配時,USART 退出靜默模式。然后 RWU 位被清零,隨后的字節被正常接收。收到這個匹配的地址字節時將設置 RXNE 位,因為 RWU 位已被清零。當接收緩沖器不包含數據時(USART_SR 的 RXNE=0),RWU 位可以被寫 0 或 1。否則,該次寫操作被忽略。下圖給出利用地址標記檢測來喚醒和進入靜默模式的例子。
利用地址標記檢測的靜默模式
3.7 校驗控制
設置 USART_CR1 寄存器上的 PCE 位,可以使能奇偶控制(發送時生成一個奇偶位,接收時進行奇偶校驗)。根據 M 位定義的幀長度,可能的 USART 幀格式列在下表中。
幀格式
M 位 | PCE 位 | USART 幀 |
0 | 0 | 起始位、8 位數據、停止位 |
0 | 1 | 起始位、7 位數據、奇偶檢驗位、停止位 |
1 | 0 | 起始位、9 位數據、停止位 |
1 | 1 | 起始位、8 位數據、奇偶檢驗位、停止位 |
注意: 在用地址標記喚醒設備時,地址的匹配只考慮到數據的 MSB 位,而不用關心校驗位。(MSB 是數據位中最后發出的,后面緊跟校驗位或者停止位)
偶校驗:校驗位使得一幀中的 7 或 8 個 LSB 數據以及校驗位中'1'的個數為偶數。
例如:數據=00110101,有 4 個'1',如果選擇偶校驗(在 USART_CR1 中的 PS=0),校驗位將是'0'。
奇校驗:此校驗位使得一幀中的 7 或 8 個 LSB 數據以及校驗位中'1'的個數為奇數。
例如:數據=00110101,有 4 個'1',如果選擇奇校驗(在 USART_CR1 中的 PS=1),校驗位將是'1'。
傳輸模式:如果 USART_CR1 的 PCE 位被置位,寫進數據寄存器的數據的 MSB 位被校驗位替換后發送出去(如果選擇偶校驗偶數個'1',如果選擇奇校驗奇數個'1')。如果奇偶校驗失敗,USART_SR寄存器中的 PE 標志被置'1',并且如果 USART_CR1 寄存器的 PEIE 在被預先設置的話,中斷產生。
3.8 LIN(局域互聯網)模式
LIN 模式是通過設置 USART_CR2 寄存器的 LINEN 位選擇。在 LIN 模式下,下列位必須保持為 0:
?USART_CR2 寄存器的 CLKEN 位
?USART_CR3 寄存器的 STOP[1:0],SCEN,HDSEL 和 IREN
LIN 發送
23.3.2 節里所描述的同樣步驟適用于 LIN 主發送,但和正常 USART 發送有以下區別:
?清零 M 位以配置 8 位字長
?置位LINEN位以進入LIN模式。這時,置位SBK將發送13位'0'作為斷開符號。然后發一位'1',以允許對下一個開始位的檢測。
LIN 接收
當 LIN 模式被使能時,斷開符號檢測電路被激活。該檢測完全獨立于 USART 接收器。斷開符號只要一出現就能檢測到,不管是在總線空閑時還是在發送某數據幀其間,數據幀還未完成,又插入了斷開符號的發送。
當接收器被激活時(USART_CR1 的 RE=1),電路監測 RX 上的起始信號。監測起始位的方法同檢測斷開符號或數據是一樣的。當起始位被檢測到后,電路對每個接下來的位,在每個位的第 8,9,10 個過采樣時鐘點上進行采樣。如果 10 個(當 USART_CR2 的 LBDL=0)或 11 個(當 USART_CR2 的LBDL=1)連續位都是'0',并且又跟著一個定界符,USART_SR 的 LBD 標志被設置。如果 LBDIE 位=1,中斷產生。在確認斷開符號前,要檢查定界符,因為它意味 RX 線已經回到高電平。如果在第 10 或 11 個采樣點之前采樣到了'1',檢測電路取消當前檢測并重新尋找起始位。如果 LIN模式被禁止,接收器繼續如正常 USART 那樣工作,不需要考慮檢測斷開符號。如果 LIN 模式沒有被激活(LINEN=0),接收器仍然正常工作于 USART 模式,不會進行斷開檢測。如果 LIN 模式被激活(LINEN=1),只要一發生幀錯誤(也就是停止位檢測到'0',這種情況出現在斷開幀),接收器就停止,直到斷開符號檢測電路接收到一個'1'(這種情況發生于斷開符號沒有完整的發出來),或一個定界符(這種情況發生于已經檢測到一個完整的斷開符號)。
LIN 模式下的斷開檢測(11 位斷開長度–設置了 LBDL 位)
LIN 模式下的斷開檢測與幀錯誤的檢測
3.9 USART 同步模式
通過在 USART_CR2 寄存器上寫 CLKEN 位選擇同步模式
在同步模式里,下列位必須保持清零狀態:
USART_CR2 寄存器中的 LINEN 位
USART_CR3 寄存器中的 SCEN,HDSEL 和 IREN 位
USART 允許用戶以主模式方式控制雙向同步串行通信。CK 腳是 USART 發送器時鐘的輸出。在起始位和停止位期間,CK 腳上沒有時鐘脈沖。根據 USART_CR2 寄存器中 LBCL 位的狀態,決定在最后一個有效數據位期間產生或不產生時鐘脈沖。USART_CR2 寄存器的 CPOL 位允許用戶選擇時鐘極性,USART_CR2 寄存器上的 CPHA 位允許用戶選擇外部時鐘的相位(見圖 239、圖 260 和圖 261)。在總線空閑期間,實際數據到來之前以及發送斷開符號的時候,外部 CK 時鐘不被激活。同步模式時,USART 發送器和異步模式里工作一模一樣。但是因為 CK 是與 TX 同步的(根據 CPOL和 CPHA),所以 TX 上的數據是隨 CK 同步發出的。
同步模式的 USART 接收器工作方式與異步模式不同。如果 RE=1,數據在 CK 上采樣(根據 CPOL 和CPHA 決定在上升沿還是下降沿),不需要任何的過采樣。但必須考慮建立時間和持續時間(取決于波特率,1/16 位時間)。
注意: 1.CK 腳同 TX 腳一起聯合工作。因而,只有在使能了發送器(TE=1),并且發送數據時(寫入數據至 USART_DR 寄存器)才提供時鐘。這意味著在沒有發送數據時是不可能接收一個同步數據的。
2.LBCL,CPOL 和 CPHA 位的正確配置,應該在發送器和接收器都被禁止時;當使能了發送器或接收器時,這些位不能被改變
3.建議在同一條指令中設置 TE 和 RE,以減少接收器的建立時間和保持時間。
4.USART 只支持主模式:它不能用來自其他設備的輸入時鐘接收或發送數據(CK 永遠是輸出)。
USART 同步傳輸的例子
USART 數據時鐘時序示例(M=0)
USART 數據時鐘時序示例(M=1)
RX 數據采樣/保持時間
注: 在智能卡模式下 CK 的功能不同,有關細節請參考智能卡模式部分。
3.10 單線半雙工通信
單線半雙方模式通過設置 USART_CR3 寄存器的 HDSEL 位選擇。在這個模式里,下面的位必須保
持清零狀態:
?USART_CR2 寄存器的 LINEN 和 CLKEN 位
?USART_CR3 寄存器的 SCEN 和 IREN 位
?USART 可以配置成遵循單線半雙工協議。在單線半雙工模式下,TX 和 RX 引腳在芯片內部互連。使用控制位”HALF DUPLEX SEL”(USART_CR3 中的 HDSEL 位)選擇半雙工和全雙工通信。當 HDSEL為'1'時
?RX 不再被使用
?當沒有數據傳輸時,TX 總是被釋放。因此,它在空閑狀態的或接收狀態時表現為一個標準I/O 口。這就意味該 I/O 在不被 USART 驅動時,必須配置成懸空輸入(或開漏的輸出高)。
除此以外,通信與正常 USART 模式類似。由軟件來管理線上的沖突(例如通過使用一個中央仲裁器)。特別的是,發送從不會被硬件所阻礙。當 TE 位被設置時,只要數據一寫到數據寄存器上,發送就繼續。
3.11 智能卡
設置 USART_CR3 寄存器的 SCEN 位選擇智能卡模式。在智能卡模式下,下列位必須保持清零:
?USART_CR2 寄存器的 LINEN 位
?USART_CR3 寄存器的 HDSEL 位和 IREN 位
此外,CLKEN 位可以被設置,以提供時鐘給智能卡。
該接口符合 ISO7816-3 標準,支持智能卡異步協議。USART 應該被設置為:
?8 位數據位加校驗位:此時 USART_CR1 寄存器中 M=1、PCE=1
?發送和接收時為 1.5 個停止位:即 USART_CR2 寄存器的 STOP=11
注: 也可以在接收時選擇 0.5 個停止位,但為了避免在 2 種配置間轉換,建議在發送和接收時使用1.5 個停止位。下圖給出的例子說明了數據線上,在有校驗錯誤和沒校驗錯誤兩種情況下的信號。
ISO7816-3 異步協議
當與智能卡相連接時,USART 的 TX 驅動一根智能卡也驅動的雙向線。為了做到這點,SW_RX 必須和 TX 連接到相同的 I/O 口。在發送開始位和數據字節期間,發送器的輸出使能位 TX_EN 被置起,在發送停止位期間被釋放(弱上拉),因此在發現校驗錯誤的情況下接收器可以將數據線拉低。
如果 TX_EN 不被使用,在停止位期間 TX 被拉到高電平:這樣的話,只要 TX 配置成開漏,接收器也可以驅動這根線。智能卡是一個單線半雙工通信協議
?從發送移位寄存器把數據發送出去,要被延時最小 1/2 波特時鐘。在正常操作時,一個滿的發送移位寄存器將在下一個波特時鐘沿開始向外移出數據。在智能卡模式里,此發送被延遲1/2 波特時鐘。
? 如果在接收一個設置為 0.5 或 1.5 個停止位的數據幀期間,檢測到一奇偶校驗錯誤,在完成接收該幀后(即停止位結束時),發送線被拉低一個波特時鐘周期。這是告訴智能卡發送到USART 的數據沒有被正確地接收到。此 NACK 信號(拉低發送線一個波特時鐘周期)在發送端將產生一個幀錯誤(發送端被配置成 1.5 個停止位)。應用程序可以根據協議處理重新發送數據。如果設置了 NACK 控制位,發生校驗錯誤時接收器會給出一個 NACK 信號;否則就不會發送 NACK。
?TC 標志的置起可以通過編程保護時間寄存器得以延時。在正常操作時,當發送移位寄存器變空并且沒有新的發送請求出現時,TC 被置起。在智能卡模式里,空的發送移位寄存器將觸發保護時間計數器開始向上計數,直到保護時間寄存器中的值。TC 在這段時間被強制拉低。當保護時間計數器達到保護時間寄存器中的值時,TC 被置高。
?TC 標志的撤銷不受智能卡模式的影響。
?如果發送器檢測到一個幀錯誤(收到接收器的 NACK 信號),發送器的接收功能模塊不會把NACK 當作起始位檢測。根據 ISO 協議,接收到的 NACK 的持續時間可以是 1 或 2 波特時鐘周期。
?在接收器這邊,如果一個校驗錯誤被檢測到,并且 NACK 被發送,接收器不會把 NACK 檢測成起始位。
注意: 1.斷開符號在智能卡模式里沒有意義。一個帶幀錯誤的 00h 數據將被當成數據而不是斷開符號。
2.當來回切換 TE 位時,沒有 IDLE 幀被發送。ISO 協議沒有定義 IDLE 幀。
下圖詳述了 USART 是如何采樣 NACK 信號的。在這個例子里,USART 正在發送數據,并且被配置成 1.5 個停止位。為了檢查數據的完整性和 NACK 信號,USART 的接收功能塊被激活。
使用 1.5 停止位檢測奇偶檢驗錯
USART 可以通過 CK 輸出為智能卡提供時鐘。在智能卡模式里,CK 不和通信直接關聯,而是先通過一個 5 位預分頻器簡單地用內部的外設輸入時鐘來驅動智能卡的時鐘。分頻率在預分頻寄存器USART_GTPR 中配置。CK 頻率可以從 fCK/2 到 fCK/62,這里的 fCK 是外設輸入時鐘。
3.12 IrDA SIR ENDEC 功能模塊
通過設置 USART_CR3 寄存器的 IREN 位選擇 IrDA 模式。在 IRDA 模式里,下列位必須保持清零:
?USART_CR2 寄存器的 LINEN,STOP 和 CLKEN 位
?USART_CR3 寄存器的 SCEN 和 HDSEL 位。
IrDA SIR 物理層規定使用反相歸零調制方案(RZI),該方案用一個紅外光脈沖代表邏輯'0'(見圖 265)。
SIR 發送編碼器對從 USART 輸出的 NRZ(非歸零)比特流進行調制。輸出脈沖流被傳送到一個外部輸出驅動器和紅外 LED。USART 為 SIR ENDEC 最高只支持到 115.2Kbps 速率。在正常模式里,脈沖寬度規定為一個位周期的 3/16。SIR 接收解碼器對來自紅外接收器的歸零位比特流進行解調,并將接收到的 NRZ 串行比特流輸出到 USART。在空閑狀態里,解碼器輸入通常是高(標記狀態 markingstate)。發送編碼器輸出的極性和解碼器的輸入相反。當解碼器輸入低時,檢測到一個起始位。
?IrDA 是一個半雙工通信協議。如果發送器忙(也就是 USART 正在送數據給 IrDA 編碼器)IrDA 接收線上的任何數據將被 IrDA 解碼器忽視。如果接收器忙(也就是 USART 正在接收從 IrDA解碼器來的解碼數據),從 USART 到 IrDA 的 TX 上的數據將不會被 IrDA 編碼。當接收數據時,應該避免發送,因為將被發送的數據可能被破壞。
?SIR 發送邏輯把'0'作為高脈沖發送,把'1'作為低電平發送。脈沖的寬度規定為正常模式時位周期的 3/16(見圖 266)。
?SIR 接收邏輯把高電平狀態解釋為'1',把低脈沖解釋為'0'。
?發送編碼器輸出與解碼器輸入有著相反的極性。當空閑時,SIR 輸出處于低狀態。
?SIR 解碼器把 IrDA 兼容的接收信號轉變成給 USART 的比特流。
?IrDA 規范要求脈沖要寬于 1.41us。脈沖寬度是可編程的。接收器端的尖峰脈沖檢測邏輯濾除寬度小于 2 個 PSC 周期的脈沖(PSC 是在 IrDA 低功耗波特率寄存器 USART_GTPR 中編程的預分頻值)。寬度小于 1 個 PSC 周期的脈沖一定被濾除掉,但是那些寬度大于 1 個而小于 2 個PSC 周期的脈沖可能被接收或濾除,那些寬度大于 2 個周期的將被視為一個有效的脈沖。當PSC=0 時,IrDA 編碼器/解碼器不工作。
?接收器可以與一低功耗發送器通信。
?在 IrDA 模式里,USART_CR2 寄存器上的 STOP 位必須配置成 1 個停止位。
IrDA 低功耗模式
發送器
在低功耗模式,脈沖寬度不再持續 3/16 個位周期。取而代之,脈沖的寬度是低功耗波特率的 3 倍,它最小可以是 1.42MHz。通常這個值是 1.8432MHz(1.42MHz
接收器
低功耗模式的接收類似于正常模式的接收。為了濾除尖峰干擾脈沖,USART 應該濾除寬度短于 1個 PSC 的脈沖。只有持續時間大于 2 個周期的 IrDA 低功耗波特率時鐘(USART_GTPR 中的 PSC)的低電平信號才被接受為有效的信號。
注意: 1.寬度小于 2 個大于 1 個 PSC 周期的脈沖可能會也可能不會被濾除。
2.接收器的建立時間應該由軟件管理。IrDA 物理層技術規范規定了在發送和接收之間最小要有10ms 的延時(IrDA 是一個半雙工協議)。
IrDA SIR ENDEC 框圖
IrDA 數據調制(3/16)普通模式
3.13 利用 DMA 連續通信
USART 可以利用 DMA 連續通信。Rx 緩沖器和 Tx 緩沖器的 DMA 請求是分別產生的。
利用 DMA 發送
使用 DMA 進行發送,可以通過設置 USART_CR3 寄存器上的 DMAT 位激活。當 TXE 位被置為'1'時,DMA 就從指定的 SRAM 區傳送數據到 USART_DR 寄存器。為 USART 的發送分配一個 DMA 通道的步驟如下(x 表示通道號):
1. 在 DMA 控制寄存器上將 USART_DR 寄存器地址配置成 DMA 傳輸的目的地址。在每個 TXE 事件后,數據將被傳送到這個地址。
2. 在 DMA 控制寄存器上將存儲器地址配置成 DMA 傳輸的源地址。在每個 TXE 事件后,將從此存儲器區讀出數據并傳送到 USART_DR 寄存器。
3. 在 DMA 控制寄存器中配置要傳輸的總的字節數。
4. 在 DMA 寄存器上配置通道優先級。
5. 根據應用程序的要求,配置在傳輸完成一半還是全部完成時產生 DMA 中斷。
6. 在 DMA 寄存器上激活該通道。
當傳輸完成 DMA 控制器指定的數據量時,DMA 控制器在該 DMA 通道的中斷向量上產生一中斷。在發送模式下,當 DMA 傳輸完所有要發送的數據時,DMA 控制器設置 DMA_ISR 寄存器的 TCIF 標志;監視 USART_SR 寄存器的 TC 標志可以確認 USART 通信是否結束,這樣可以在關閉 USART 或進入停機模式之前避免破壞最后一次傳輸的數據;軟件需要先等待 TXE=1,再等待 TC=1。
利用 DMA 發送
利用 DMA 接收
可以通過設置 USART_CR3 寄存器的 DMAR 位激活使用 DMA 進行接收,每次接收到一個字節,DMA控制器就就把數據從 USART_DR 寄存器傳送到指定的 SRAM 區(參考 DMA 相關說明)。為 USART 的接收分配一個 DMA 通道的步驟如下(x 表示通道號):
1. 通過 DMA 控制寄存器把 USART_DR 寄存器地址配置成傳輸的源地址。在每個 RXNE 事件后,將從此地址讀出數據并傳輸到存儲器。
2. 通過 DMA 控制寄存器把存儲器地址配置成傳輸的目的地址。在每個 RXNE 事件后,數據將從USART_DR 傳輸到此存儲器區。
3. 在 DMA 控制寄存器中配置要傳輸的總的字節數。
4. 在 DMA 寄存器上配置通道優先級。
5. 根據應用程序的要求配置在傳輸完成一半還是全部完成時產生 DMA 中斷。
6. 在 DMA 控制寄存器上激活該通道。
當接收完成 DMA 控制器指定的傳輸量時,DMA 控制器在該 DMA 通道的中斷矢量上產生一中斷。
利用 DMA 接收
多緩沖器通信中的錯誤標志和中斷產生在多緩沖器通信的情況下,通信期間如果發生任何錯誤,在當前字節傳輸后將置起錯誤標志。如果中斷使能位被設置,將產生中斷。在單個字節接收的情況下,和 RXNE 一起被置起的幀錯誤、溢出錯誤和噪音標志,有單獨的錯誤標志中斷使能位;如果設置了,會在當前字節傳輸結束后,產生中斷。
3.14 硬件流控制
利用 nCTS 輸入和 nRTS 輸出可以控制 2 個設備間的串行數據流。下圖表明在這個模式里如何連接2 個設備。
兩個 USART 間的硬件流控制
通過將 UASRT_CR3 中的 RTSE 和 CTSE 置位,可以分別獨立地使能 RTS 和 CTS 流控制。
RTS 流控制
如果 RTS 流控制被使能(RTSE=1),只要 USART 接收器準備好接收新的數據,nRTS 就變成有效(接低電平)。當接收寄存器內有數據到達時,nRTS 被釋放,由此表明希望在當前幀結束時停止數據傳輸。下圖是一個啟用 RTS 流控制的通信的例子。
RTS 流控制
CTS 流控制
如果 CTS 流控制被使能(CTSE=1),發送器在發送下一幀前檢查 nCTS 輸入。如果 nCTS 有效(被拉成低電平),則下一個數據被發送(假設那個數據是準備發送的,也就是 TXE=0),否則下一幀數據不被發出去。若 nCTS 在傳輸期間被變成無效,當前的傳輸完成后停止發送。
當 CTSE=1 時,只要 nCTS 輸入一變換狀態,硬件就自動設置 CTSIF 狀態位。它表明接收器是否準備好進行通信。如果設置了 USART_CT3 寄存器的 CTSIE 位,則產生中斷。下圖是一個啟用 CTS 流控制通信的例子。
CTS 流控制
4 USART 中斷請求
中斷事件 | 事件標志 | 使能位 |
發送數據寄存器空 | TXE | TXEIE |
CTS 標志 | CTS | CTSIE |
發送完成 | TC | TCIE |
接收數據就緒可讀 | RXNE | RXNEIE |
檢測到數據溢出 | ORE | RXNEIE |
檢測到空閑線路 | IDLE | IDLEIE |
奇偶檢驗錯 | PE | PEIE |
斷開標志 | LBD | LBDIE |
噪聲標志,多緩沖通信中的溢出錯誤和幀錯誤 | NE 或 ORT 或 FE | EIE(1) |
(1)僅當使用 DMA 接收數據時,才使用這個標志位。USART 的各種中斷事件被連接到同一個中斷向量(見下圖),有以下各種中斷事件:
發送期間:發送完成、清除發送、發送數據寄存器空。
接收期間:空閑總線檢測、溢出錯誤、接收數據寄存器非空、校驗錯誤、LIN 斷開符號檢測、噪音標志(僅在多緩沖器通信)和幀錯誤(僅在多緩沖器通信)。
如果設置了對應的使能控制位,這些事件就可以產生各自的中斷。
USART 中斷映像圖
5 例程設計
5.1 USART_Asyn
1.初始化部分調用delay_init()函數進行延時初始化。
調用UART_Configuration(115200)函數對串口 1 進行初始化,波特率設置為 115200。
獲取系統時鐘頻率并打印相關信息。
2.主循環部分接收數據:禁用 DMA1 通道 5。
while (1) { // 禁用DMA1通道5(確保配置前停止通道) DMA_Cmd(DMA1_Channel5, DISABLE); // i. 使能串口1接收DMA請求 USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE); // ii. 配置DMA接收(通道5) DMA_RecvConfiguration(); // iii. 等待接收完成標志(DMA1通道5傳輸完成) while (DMA_GetFlagStatus(DMA1_FLAG_TC5) == RESET); // iv. 打印接收完成信息及數據 printf("USART Asyn DMA Recv Completen"); for (i = 0; i < BUFFSIZE; i++) { printf("%c ,", Buff[i]); } printf("n"); // 發送數據流程(與接收類似)... }
使能串口 1 的接收 DMA 請求。
調用DMA_RecvConfiguration()函數配置 DMA 接收。
等待 DMA 接收完成標志(DMA1_FLAG_TC5)置位。
打印接收完成信息,并輸出接收到的數據。
3.發送數據:禁用 DMA1 通道 4。
while (1) { // (接收流程代碼略)... // 禁用DMA1通道4(確保配置前停止通道) DMA_Cmd(DMA1_Channel4, DISABLE); // i. 使能串口1發送DMA請求 USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); // ii. 配置DMA發送(通道4) DMA_SendConfiguration(); // iii. 等待發送完成標志(DMA1通道4傳輸完成) while (DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET); // iv. 打印發送完成信息 printf("USART Asyn DMA Send Completen"); delay_ms(100); // 可選延時避免高頻循環 }
使能串口 1 的發送 DMA 請求。
調用DMA_SendConfiguration()函數配置 DMA 發送。
等待 DMA 發送完成標志(DMA1_FLAG_TC4)置位。
打印發送完成信息。
4.函數實現部分UART_Configuration:對串口 1 的 GPIO 和串口參數進行初始化。
void DMA_RecvConfiguration(void) { DMA_InitTypeDef DMA_InitStructure; // 使能DMA1時鐘 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 復位并配置DMA1通道5(USART1接收) DMA_DeInit(DMA1_Channel5); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR; // 外設地址:USART數據寄存器 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Buff; // 內存地址:接收緩沖區 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // 方向:外設→內存 DMA_InitStructure.DMA_BufferSize = BUFFSIZE; // 緩沖區大小:8字節 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外設地址不變 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 內存地址遞增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 8位數據 DMA_Init(DMA1_Channel5, &DMA_InitStructure); DMA_Cmd(DMA1_Channel5, ENABLE); // 啟動DMA接收 } void DMA_SendConfiguration(void) { DMA_InitTypeDef DMA_InitStructure; // 使能DMA1時鐘(已使能可省略,但代碼中保留健壯性) RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 復位并配置DMA1通道4(USART1發送) DMA_DeInit(DMA1_Channel4); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR; // 外設地址:USART數據寄存器 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Buff; // 內存地址:發送緩沖區 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; // 方向:內存→外設 DMA_InitStructure.DMA_BufferSize = BUFFSIZE; // 緩沖區大?。?字節 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外設地址不變 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 內存地址遞增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 8位數據 DMA_Init(DMA1_Channel4, &DMA_InitStructure); DMA_Cmd(DMA1_Channel4, ENABLE); // 啟動DMA發送 }
DMA_RecvConfiguration:對 DMA1 通道 5 進行初始化,用于串口 1 的接收。
DMA_SendConfiguration:對 DMA1 通道 4 進行初始化,用于串口 1 的發送。
SER_PutChar:實現字符發送功能。
fputc:重定向標準輸出函數,使printf函數可以通過串口輸出。
6 下載驗證
6.1 USART_Asyn
初始化階段
程序啟動后,會進行一系列初始化操作,包括延時初始化、串口 1 初始化,并且獲取系統時鐘頻率。
初始化完成后,會通過串口打印系統時鐘頻率信息,內容涵蓋 SYSCLK、HCLK、PCLK1、PCLK2 和 ADCCLK 的頻率,單位為 MHz。
隨后會打印出USART Asyn DMA Test.,表明開始進行串口異步 DMA 測試。
主循環階段
接收數據
程序會先禁用 DMA1 通道 5,然后使能串口 1 的接收 DMA 請求,并對 DMA 接收進行配置。
程序會等待 DMA 接收完成標志(DMA1_FLAG_TC5)置位,當接收完成后,會打印USART Asyn DMA Recv Complete信息。
接著將接收到的BUFFSIZE(即 8 個)字節數據逐字符打印出來,每個字符后會有一個逗號分隔。
發送數據
之后程序會禁用 DMA1 通道 4,使能串口 1 的發送 DMA 請求,并對 DMA 發送進行配置。
等待 DMA 發送完成標志(DMA1_FLAG_TC4)置位,發送完成后,會打印USART Asyn DMA Send Complete信息。
持續運行
上述接收和發送的過程會在主循環中不斷重復,只要程序不停止運行,就會持續進行串口數據的接收和發送操作,并在每次操作完成后輸出相應的提示信息。
WIZnet 是一家無晶圓廠半導體公司,成立于 1998 年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP 卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU? 面向各種應用中的嵌入式互聯網設備。
WIZnet 在全球擁有 70 多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
單片機
+關注
關注
6061文章
44914瀏覽量
646632 -
以太網
+關注
關注
40文章
5582瀏覽量
174711 -
異步收發器
+關注
關注
0文章
37瀏覽量
10975 -
USART
+關注
關注
1文章
200瀏覽量
31607
發布評論請先 登錄
UART通用同步異步收發器的相關資料分享
USART通用同步異步收發器介紹
USART通用同步異步收發器介紹
模擬電路網絡課件 第二十四節:甲乙類互補對稱功率放大電路

通用異步收發器(UART)
2022年第二十四屆高交會綠色低碳路線

第二十四屆高交會閉幕,普渡科技獲評“最佳品牌獎”

評論