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

通用異步收發(fā)器(UART)
F2產(chǎn)品技術(shù)培訓_18.通用同步異步收發(fā)器(USART)
2022年第二十四屆高交會綠色低碳路線

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

評論