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

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

第二十四屆高交會(huì)閉幕,普渡科技獲評(píng)“最佳品牌獎(jiǎng)”

評(píng)論