狠狠躁夜夜躁人人爽超碰97香蕉|色婷婷日日躁夜夜躁|亚洲一区欧美一区在线播|久久久久久性高|伊人久久大香线蕉亚洲

歡迎來到同城快修-附近家電維修、家電清洗、家電安裝服務平臺

24小時家電維修熱線:

400—1558638

當前位置:主頁 > 集成灶 > 維修資訊 >

tcl總線設置好怎么保存(tcl怎樣進總線)

發布日期:2023-04-08 11:02:12 瀏覽:
tcl總線設置好怎么保存(tcl怎樣進總線)

前沿拓展:


作者:junziyang

(注:如非特別聲明,以下筆記內容均針對STM32F103ZET6而言。不同型號,細節可能存在差別。)

6.1 USART簡介

USART全稱為Universal synchronous asynchronous receiver transmitter,意為通用同步異步收發器。顧名思義,該模塊可以同步或異步方式,實現數據的接收或發送。USART是一種常用的串行(數據按一定的格式按位排隊發送)通信接口,堪稱萬能接口。主要功能和特點如下:

采用NRZ(none return zero)行業標準支持全雙工異步通信支持單線半雙工通信支持IrDA串行紅外(SIR)編解碼器,常規模式支持3/16位長度支持LIN(local interconnection network),具備主同步斷開發送能力和從斷開檢測能力。當USART硬件配置位LIN時,可生成13位斷開符和10/11為斷開檢測符具備智能卡模擬功能。支持ISO 7816-3標準定義的異步協議智能卡,支持0.5和1.5停止位。通過DMA可配置多緩沖器通信。采用集中式DMA,可在SRAM中預留接收/發送緩沖字節采用分數波特率發生系統,可編程傳輸和接收波特率高達460800(4.5M bits/s)數據字長可編程(8位或9位)停止位可配置,支持1個或2個停止位發射器為同步傳輸提供時鐘接收器和發射器使能位獨立支持以下傳輸檢查標志:接收緩沖器慢發射緩沖器孔傳輸結束標志校驗控制:發送校驗位;對接收到的數據字節進行校驗支持4個錯誤檢查標志:溢出錯誤;噪聲錯誤;幀錯誤;校驗錯誤支持10個帶標志中斷源:CTS改變;LIN斷開;傳輸數據寄存器空;傳輸完成;接收數據寄存器滿;傳輸線空閑檢測;溢出錯誤;噪聲錯誤;幀錯誤;校驗錯誤支持多處理器通信 - 如果地址不匹配,進入靜默模式從靜默模式喚醒(通過空閑總線檢測或地址標準檢測)具備2種接收器喚醒模式:地址位(MSB第9位),總線空閑

STM32F103ZET6共有3個USART和2個UART,UART功能與USART類似,只是僅支持異步通信。同步通信和異步通信的本質區別在于,通信時是否需要時鐘同步。平時常用的串口通訊基本都是UART。

6.2 USART工作原理6.2.1 USART原理框圖

圖1. USART 框圖

圖1所示為USART的框圖。左下角是波特率發生器,通過配置BRR寄存器,設置波特率分頻系數,對PCLKx進行分頻,產生接收器時鐘,再經16分頻,產生發送控制器時鐘。兩路時鐘分別送往接收控制器(Receiver control)和發送控制器(Transmit control)。兩個控制器匯總中部5個寄存器中的設置,將控制信號分別發往兩個移位寄存器和中斷控制器。

6.2.2 功能引腳

USART共有6個功能引腳,雙向通信時至少需要2個引腳(RX和TX)。各引腳功能簡述如下:

RX為接收數據輸入端。接收器通過過采樣技術來辨別數據和噪聲,從而恢復數據。TX為發送數據輸出端。當發射器被禁用時,此引腳恢復為IO端口。當發射器被開啟且無數據待發送時,此引腳處于高電平。在單線和智能卡模式下,此IO同時擔負發送和接收任務。SW_RX為單線輸入引腳,這是一個內部引腳,在單線半雙工模式下,RX和TX同時切換到SW_RX內部引腳。nCTS為停止發送(Cease To Send)引腳。該引腳為高電平時,當前傳輸結束后會阻斷下一次數據傳輸。nRTS為請求發送(Request To Send)引腳。該引腳為低電平時,指示USART已經準備接收數據。CK為發送器時鐘輸出(Transmitter ClocK output)引腳。該引腳將發射器時鐘輸出,用于實現同步傳輸。時鐘的相位和極性可以通過軟件控制。在智能卡模式下,CK可為智能卡提供時鐘。6.2.3 USART數據格式

USART通信是一種串行通信,數據以幀(Frame)為單元,按位依次發送,低位優先。USART通信過程中共涉及3種幀結構:

數據幀(Data frame) 包含數據的幀。每個數據幀發送1個字節的數據(8個比特),除了數據位,每個數據幀包括1個起始位(Start bit)、1個可選校驗位(Parity bit)和0.5-2個停止位(Stop bit)。數據位和校驗位的總長度稱為字長(Word length),所以根據有無校驗位USART的可能字長為9或8。 很顯然,起始位和停止位是為了區分相繼傳遞的兩個數據的。數據幀也稱為數據包。空閑幀(Idle frame) 一個全為“1”的幀。空閑幀長度包含停止位。在發送數據幀之前,USART的發送器會先發出一個空閑幀。空閑幀主要是用來同步的,如果接收端處于睡眠模式,收到空閑幀后會被喚醒,從空閑幀以后開始解析數據,這是USART通信協議的一部分。空閑幀發送出去的字符稱為空閑字符。斷開幀(Break frame) 一個全為“0”的幀。斷開幀包含1或2個停止位,即斷開幀是長度為10或11位的低電平。斷開幀之后發送器會插入1或2個停止位(“1”)來確認下一幀的起始位。斷開幀也是用于同步的,是USART通信協議的一部分。斷開幀發送出去的字符稱為斷開字符。

圖2所示為9位字長和1位停止位的幀結構和時序,8位字長時不包括Bit8。時鐘信號來自波特率發生器,一個時鐘周期發送1個bit的數據。顯然,為了正確解析信息,收發雙方必須采用相同的波特率,波特率越高數據發送速度越快。

圖2. USART的幀結構與時序

從圖中可以看出,起始位期間TX引腳為低電平,而停止位期間PX引腳為高電平。停止位后是下一幀的起始位,依此次序按幀將數據發送到TX引腳。

發送和接收受同一個波特率發生器驅動,通過將接收器或發送器的使能位置1,來產生各自的時鐘。異步通信并不是不需要同步,只是通過發送同步信號和約定波特率,收發雙方可以使用各自的本地時鐘,不需要一個共同的時鐘來進行同步。

6.2.4 發送器 (Transmitter)

根據CR1寄存器中M位的設置,發送器可以發送8位或9位字長的數據。發送使能位(CR1的TE位)被設置后,發送移位寄存器中的數據被依次輸出到TX引腳,相應的時鐘脈沖被輸出到CK引腳。每個數據包包含一個字節,低位優先,每個字節前有一個起始位(長度為1個位周期的低電平)來作為前導,其后用一個停止位來結尾。

1. 發送端停止位的設置

停止位的長度可以在CR2寄存器中(STOP[1:0])進行配置,USART支持長度為0.5,1,1.5和2個周期的停止位。整數對應正常模式,小數對應智能卡模式。詳情如下:

0.5 - 用于智能卡模式接收數據1 - 默認停止位位數1.5 - 用于智能卡模式收發數據2 - 常規USART、單線模式、調制解調器模式

2. 發送器的配置步驟

下面來看一下常規USART模式下,發送數據的基本過程:

向CR1寄存器的UE(USART enable)位寫入1來使能USART;設置CR1的M位來定義字長;設置CR2的STOP[1:0]來配置停止位的個數;如果采用多緩沖器通信,設置CR3的DMAT使能DMA。按多緩沖器通信要求配置DMA寄存器;設置BRR(Baud rate register)寄存器來選擇所需的波特率; 向CR1的TE位寫入1,使能發送器并發送一個空閑幀作為第一幀; 將待發送數據依次寫入DR寄存器(此操作會清除SR寄存器中的TXE位);在向DR寄存器寫入最后一個數據后,等待SR寄存器中的TC位(Transfer complete)被置1。在關閉USART或進入宕機模式時都要進行這種檢查,以避免破壞最后一次傳輸。

數據從總線傳入,依次經TDR和移位寄存器被發送出去。當向DR寄存器寫入數據時,如果有數據正在傳輸,數據會被寫入TDR緩存,在當前數據傳輸完畢,數據會被復制到移位寄存器。TDR與移位寄存器間數據是并行傳輸的。若寫入數據時沒有數據正在傳輸,則數據將會被直接寫入移位寄存器。數據的傳輸狀態可以通過查詢相關的寄存器來獲知。

3. 數據的發送

與發送過程密切相關的寄存器位有4個:TXE(Transmit data register empty)、TC(Transmision complete)、TXEIE(TXT interrupt enable)、TCIE(TC interrupt enable)。

SR寄存器中的TXE位為1時,表明前一個數據已從TDR被移入移位寄存器并開始發送了,TDR寄存器已空。因此,此時向TDR寫入下一個數據已不會覆蓋前一個數據。如果CR1寄存器中的TXEIE位開啟,TXE被置1時會產生中斷。此中斷可以用來通知軟件,將下一個數據寫入TDR。在數據傳輸過程中,SR寄存器的TC位處于低電平。如果一幀數據傳輸完畢(stop bit之后)且TXE位為1,TC位變為高電平,如果CR1寄存器中的TCIE位開啟,則會產生中斷。因為數據從移位寄存器發送出去需要一定的時間,因此在將最后一個數據寫入DR寄存器后,必須等待TC=1。在此之前不可以關閉USART或讓MCU進入低功耗模式,否則會破壞最后一個數據。顯然,開啟TCIE,在中斷回調函數中執行后續這些操作,可以避免破壞數據。

圖3. 數據發送過程中相關寄存器的時序變化

圖3所示為數據發送過程中相關寄存器的時序變化:軟件使能USART時,TXE為高電平,第一個數據被軟件寫入DR寄存器,TEX被拉低;空閑幀發送完畢,stop bit下降沿觸發第一幀數據F1被移入移位寄存器;因DR為空,TXE被拉高,軟件檢測到TXE=1將第二幀F2迅速寫入DR,TEX又被拉低;重復此過程直到最后一個數據包被寫入DR;軟件開始等待TC=1;最后一個數據包被移入移位寄存器后,TXE開始持續為高電平;最后一幀發送完畢,在其stop bit下降沿因TXE=1,硬件將TC置1,傳輸過程結束。

從上述工作過程可以看出:

整個工作過程中,TXE和TC寄存器都是通過硬件置1,軟件置0的。軟件向DR寫入數據,TXE和TC即被置0。在stop bit下降沿,TDR中的數據被移走后,TXE被硬件置1。硬件在stop bit的下降沿通過檢測TXE是否為1來判斷數據傳輸是否結束。由于從TDR移走數據需要一定的時間,如果不是最后一個數據,TXE的置1有所滯后。stop bit下降沿TXE仍為0,所以TC保持低電平。而最后一個數據被移入移位寄存器后,TXE即持續為高電平,它被發送完畢后,在其stop bit下降沿會檢測到TXE=1,因此硬件會將TC置1。數據發送完畢。數據發送結束后,TX、TXE、TC均為高電平。軟件等待TC=1的時長至少為2個數據包的發送周期,即從最后一個數據包寫入TDR開始,至TC=1結束。

空閑字符和斷開字符的發送通過軟件設置寄存器來實現。向CR1寄存器的SBK位寫入1,會在完成當前傳輸后在TX發送一個斷開字符。在斷開字符的stop bit,硬件會將SBK位重置為0。USART會在最后一個斷開字符的尾部添加一個邏輯1位,來確保對下一幀start bit的正確識別。空閑字符的發送通過設置CR1寄存器的TE位實現,發送第一個數據幀之前需要發送給一個空閑幀,來實現接收器的喚醒或同步。

6.2.5 接收器(Receiver)

接收器接收的數據字長可以為8位或9位,也是由CR1寄存器中M位進行設置。異步通信模式下,收發雙方的波特率、字長、停止位必須一致。

1. 接收器的配置步驟

接收器配置過程的前5步與發送器配置過程完全一致。

向CR1寄存器的UE(USART enable)位寫入1來使能USART;設置CR1的M位來定義字長;設置CR2的STOP[1:0]來配置停止位的個數;如果采用多緩沖器通信,設置CR3的DMAT使能DMA。按多緩沖器通信要求配置DMA寄存器;設置BRR(Baud rate register)寄存器來選擇所需的波特率;向CR1寄存器的RE(Receiver enable)位寫入1,使能接收器,使其開始尋找起始位。

2. 起始位的檢測原理

如前所述,每個數據包是以起始位(低電平)開始和停止位(高電平)結束的,識別起始位是正確接收和解析數據的前提。

圖4. 起始位檢測原理

起始位的檢測原理如圖4所示。USART接收器的采樣頻率是發送器波特率的16倍(參見圖1)。自前一個包(數據幀或空閑幀)下降沿,到下一個包起始位結束,共有16次采用。為了避免噪聲干擾,從接收到下降沿開始,分別判斷此后第3、5、7和8、9、10次采用的值。如果兩組采樣全為0,則確認找到起始位,并將SR寄存器中的RXNE(Receiver data register not empty)置1,如果開啟了RXNEIE,則會產生相應的中斷;如果兩組采樣中,有非0值,但每組的3個采樣值都至少有2個為0,仍判為有效起始位(RXNE置1,如果開啟了中斷則觸發),但同時會將SR寄存器中的NE(Noise error)位置1,標明檢測到噪聲;如果非前兩種情況,則停止檢測,接收器恢復空閑狀態,繼續等待下一個下降沿。

3. 數據的接收

如圖1所示,接收數據時數據先是存入接收移位寄存器(Receive Shift Register),然后再轉入接收數據寄存器(RDR,receive data register)的,低位優先。移位寄存器與RDR間數據是并行傳輸的。與接收過程相關的關鍵寄存器位有2個:RXNE和RXNEIE。

SR寄存器中的RXNE位為1時,表明移位寄存器的內容已被轉移到RDR,可以被讀取了。如果CR1寄存器中的RXNEIE位開啟,RXNE被置1時會產生中斷。此中斷可以用來通知軟件,及時將RDR中的數據讀取。在單緩存模式(非DMA)中,軟件讀取DR寄存器時會將RXNE位清0。在下一個字符接收完成之前(移位寄存器被填滿),RXNE必須被清0,否則會導致溢出錯誤。多緩存模式下,DMA讀取DR寄存器也會將RXNE位清0。數據位的值是根據第8,9,10三個采樣點的值來確定的。詳細情況見下面的噪聲錯誤部分。

空閑字符會被當作正常字符來接收,如果設置了IDLEIE中斷,接收到空閑字符時會觸發該中斷。斷開字符則會被當作幀錯誤來處理。USART可以識別3種接收錯誤并根據設置觸發相應的中斷。

4. 噪聲錯誤

為了區分有效的輸入數據和噪聲,異步USART接收器中采用了過采樣技術。RX線上的輸入電平會被以波特率的16倍進行采樣。這樣1個數據位中會有16個采樣點。USART會用每個位中間的3次(第8,9,10次)采樣值確定數據位的電平并判斷數據是否有效。

圖5. 取樣數據的噪聲檢測

如前所述,在找到有效起始位時會設置RXNE為1,在RNXE的上升沿會同時會設置NE位。如圖5所示,如果NE為0,即起始位無噪聲時,后續各位的取樣中只有中間3次取樣值全部相同才會被判定為有效數據。如果NE=1,接收到的位的值會根據中間3次取樣的值按照少數服從多少的原則確定,并判定為無效數據。無效數據也會被從移位寄存器轉入DR寄存器。在單緩沖器通訊情況下,噪聲錯誤不會參數中斷,但由于NE和RXNE是被同時設置的,RXNE可以觸發中斷。如果需要檢查噪聲錯誤,可以在該中斷中實現。在多緩沖器通信情況下,如果已經設置了CR3寄存器中的EIE(Error interrupt enable)位,將產生一個錯誤中斷。

通過讀取SR寄存器,接著讀取DR寄存器,可以復位NE標志位。

5. 溢出錯誤(Overrun error)

RDR每次收到數據硬件會將RXNE置1,數據被讀取后RXNE被復位為0。如果數據沒有被及時讀取(RXNE=1),移位寄存器被充滿后無法將數據轉移到RDR,就會觸發溢出錯誤。錯誤出現后:

SR寄存器的ORE位會被置1;如果開啟了RXNEIE或同時開啟了EIE和DMAR,會觸發中斷;溢出錯誤期間,RDR中的數據不會被破壞,但移位寄存器中收到的數據會因被重寫而丟失;

通過讀取SR寄存器,接著讀取DR寄存器,可以復位ORE標志位。

6. 幀錯誤

由于同步出錯或因噪聲太多,導致在預期的時間沒有識別到停止位,就會產生幀錯誤。如前所述,當接收到斷開幀時也會當作幀錯誤來處理。當檢測到幀錯誤時:硬件會將SR寄存器的FE(Frame error)位置1。后續處理與噪聲錯誤類似,但字節通信時也可以在RXNE相關的中斷中進行檢查。

通過讀取SR寄存器,接著讀取DR寄存器,可以復位FE標志位。

7. 接收端對停止位的處理

接收端停止位設置與發送端相同,也是通過CR2寄存器中STOP[1:0]位來設置。但由于接收端是過采樣,要分情況處理:

0.5個停止位(智能卡接收) 因為在0.5個停止位的位置(第8和第9次采樣中間)沒有采樣,導致這種情況下無法檢測幀錯誤和斷開幀。1個停止位 用第8,9,10個采樣點的值來確定停止位。1.5個停止位(智能卡收發) 前0.5個周期不采樣,對后一個時鐘周期的中間3個取樣點取樣。如果從停止位上升沿開始計數,對應第16,17,18個采樣點。詳情查閱智能卡相關章節。2個停止位 對第一個停止位的第8,9,10個采樣點采用。6.2.6 分數波特率的產生

1. 計算公式

USART的接收器和發送器的波特率是通過對外設總線的時鐘頻率分頻得到的,計算公式如下:

其中fCK為USART所在外設總線的時鐘頻率,USARTDIV為分頻系數,由USART_BRR寄存器進行設置。從上述公式可以看出,USART的最高波特率為外設總線APBx頻率的1/16,原因在于接收端要16倍過采樣來接收數據,采樣頻率不可能高于APBx頻率。如圖1右下角所示,USART的接收器和發射器的波特率是通過同一個寄存器進行配置的。為了支持分數波特率,BRR寄存器的低16位被分成了兩部分:0-3位設置分數部分,4-15位設置整數部分。二者共同定義分配因子USARTDIV。

根據BRR寄存器的設置,USARTDIV的計算規則如下:

4-15位轉為10進制,作為整數部分。整數部分的取值范圍為0-4095;0-3位轉為10進制再除以16即為小數部分。之所以是16,是因為小數部分在寄存器中只占4位,所以能精確表示的小數只能是N/16,其中N的取值范圍為0-15。

反之,根據系統時鐘頻率和要求的波特率,BRR寄存器的整數和分數部分分別按下列公式計算:

UrtDIV = fCK/(16×baudrate)整數部分:IntDIV = (u16)UrtDIV分數部分:FrcDIV = (u16)[(UrtDIV-IntDIV)*16+0.5]

例如:APB2總線頻率72MHz,要求波特率115200。計算結果:UrtDIV=39.0625,IntDIV=0d39(0x27),FrcDIV=0d01(0x01)。

受USARTDIV取值的限制,不是所有的波特率都可以精確的配置出來。波特率設置值與實際值之間有時會存在誤差。圖6所示即為常用波特率設置值與實際值之間的相對誤差情況。

圖6. 波特率誤差分析

對STM32F1系列芯片而言,APB1總線的最高頻率為36MHz,APB2總線的最高頻率為72MHz。除了USART1掛載在APB2總線上外,其余USART/UART均掛載與APB1總線。從圖1可以看出,常用的波特率設置115200,在36MHz情況下就會有0.15%的相對誤差。通常時鐘頻率越低,具體波特率的精度也會越低。USART1的最高波特率可達4.5M bps。

2. 接收器時鐘公差

異步通訊中,只有整個時鐘系統的誤差小于USART接收器容許的公差時數據才能被正確接收。誤差的主要來源包括:

DTRA:發送端引入的誤差,例如發送端時鐘的漂移DQUANT:接收端波特率量化誤差DREC:接收端本地時鐘的漂移DTCL:傳輸線引入的漂移,通常來源于收發器高-低、低-高時序切換間的不同步

為保證數據能被正確接收,上述4種誤差總和必須小于USART接收器的公差。而公差又與三個因素有關:字長,即CR1寄存器的M=0或1;分數波特率,即BRR寄存器的低4位是否全為0;噪聲幀的處理,忽略還是當作錯誤。根據這三個因素的不同,公差表分別如圖7所示:

圖7. 接收器時鐘公差

6.2.7 靜默與喚醒

通過USART可以實現多處理器通信。為了減少USART的服務開銷,可以讓空閑的USART進入靜默模式(mute mode),在需要與某個USART進行通信時,可以將其定向喚醒,而其余空閑USART不受影響。即使是兩個USART之間的通信,在無數據傳輸時雙方也可以進入靜默模式,有數據傳輸需求時,提出需求的一方(軟件喚醒)通過發送喚醒信號,激活對方。

USART的靜默與喚醒共涉及3個寄存器功能位:CR1寄存器的WAKE和RWU、CR2的ADD[3:0]。WAKE位設置喚醒方式,根據WAKE位的不同,使USART進入或退出靜默模式有兩種方法:空閑總線檢測(WAKE=0)和地址標記檢測(WAKE=1)。

1. 空閑總線檢測

圖8. 空閑總線檢測靜默-喚醒示意圖

空閑總線檢測靜默-喚醒示意圖如圖8所示。當WAKE=0時,通過向RWU(Receiver wakeup)位寫入1可使USART進入靜默模式。進入靜默模式后,接收器停止接收數據,但仍會檢測RX引腳上的輸入信號,如果檢測到空閑幀,硬件會清除RWU,USART被喚醒開始正常接收數據(RXNE位開始變化)。

在靜默模式下收到的空閑幀不會觸發IDLEIE中斷,因為硬件不會設置SR寄存器中的IDLE位。這種方式適合于同時需要喚醒多個USART的情形。只需發送一個空閑幀,所有WAKE=0且RWU=0的USART收到后都會被喚醒。

2. 地址標記檢測

圖9. 地址標記總線檢測靜默-喚醒示意圖

地址標記檢測靜默-喚醒示意圖如圖9所示。這種模式下通常將字長設置為9,最高位(MSB)用來作為數據和地址的標識符。當MSB=1時,數據包被解析為地址;而當MSB=0時,則解析為數據。地址包的低4位存儲一個地址標記,USART收到地址包后會與CR2寄存器的ADD[3:0]中的地址進行比較。如果地址不匹配,硬件將RWU置1,進入/保持靜默模式,RXNE不會被設置,也不會有中斷產生;如果地址匹配,硬件將RWU置0,喚醒USART,在地址包中Stop bit的下降硬件會設置RXNE,后續字符會被正常接收。

地址包也會被接收,喚醒后收到的第一個字符是地址。這種模式需要提前配置每個USART的ADD[3:0],為其分配一個地址(不一定唯一)。這種方式是一種以地址包為前導的定向通信,通信對象更明確。每次只喚醒地址匹配的USART,如果有多個同地址的會被同時喚醒。6.2.8 數據校驗

偶校驗是一種校驗代碼傳輸正確性的方法。根據被傳輸的一組二進制代碼中“1”的個數是奇數還是偶數來進行校驗。采用奇數的稱為奇校驗,反之,稱為偶校驗。校驗方式是通信雙方提前約定好的。通過在數據包中的校驗位來進行校驗。發送方根據數據設置校驗位,接收方接收數據后對校驗位進行檢查,從而確定傳輸代碼的正確性。

通過將CR1寄存器的PCE(Parity control enable)位置1來使能奇偶校驗,校驗方式通過PS(Parity selection)位來設置:PS=0,偶校驗;PS=1,奇校驗。

需要說明的是,如果開啟了奇偶校驗,USART的字長包含1個校驗位;如果同時開啟了地址標記喚醒,數據位的最高位會被用作地址標記,這種情況下實際數據的位數比所設字長會少2位。注意合理設置,防止數據被修改或誤用(比如數據包被解析為地址包)。

舉例來說:如果設置字長9位,停止位1位,同時開啟奇偶校驗和地址標記喚醒,則最高位被校驗位占據,剩余數據為的最高位會被當作地址標記位。實際數據占7位,設為1011011,如果選擇偶校驗,則校驗位為0。整個數據包的內容為:10010110110,從左到右依次為停止位1、奇偶校驗位0、地址標記0(這是數據幀)、數據位1011011、起始位0(數據傳輸低位優先)。

接收器收到數據后,會檢查數據位中“1”的個數是奇數還是偶數,并按校驗規則與校驗位核對。如果不符表明傳輸出錯(比如噪聲干擾等),SR寄存器中的PE(Parity error)位會被置1,如果CR1中的PEIE(Parity error interrupt enable)開啟,則會產生中斷。

6.2.9 USART同步模式

USART可以以同步模式工作。向CR2寄存器的CLKEN(Clock enable)寫入1即可開啟同步模式。同步模式下,數據在TX引腳輸出的同時,發送器時鐘從CK引腳輸出,但在數據包的起始位和停止位CK引腳上無時鐘脈沖。

通過配置CR2寄存器的LBCL位,可以設置最后一個有效數據位(地址標記)是否輸出時鐘脈沖;通過CR2寄存器的CPOL(Clock polarity)可以設置時鐘的極性,即在傳輸窗口外CK引腳的電平是高(CPOL=1)還是低(CPOL=0);通過CR2的CPHA位可以設置時鐘的相位,即在時鐘的第一個邊緣進行數據捕獲(CPHA=0),還是在時鐘的第二個邊沿進行數據捕獲(CPHA=1)。CPOL和CPHA一起配合來產生需要的時鐘/數據采樣關系。

發射器的運作在同步模式下和異步模式下完全相同。只是TX引腳上的數據是與CK引腳上的時鐘同步發出的。

接收器的運作在同步模式下與異步模式下不同。由于有同步時鐘,因此不需要不需要進行過采樣。而是在RE=1使能接收器后,數據在CK的上升沿或下降沿被直接采樣。但必須重視建立時間(setup time)和保持時間(hold time)。

建立時間是指,采樣時鐘邊沿到來之前,數據提前保持不變的時間;保持時間是指,采樣時鐘邊沿到來之后,數據必須繼續保持不變的時間。這兩個時間與波特率有關,通常要求這兩個時間不低于1/16個bit的時長。USART只支持主模式,即只能由它來輸出時鐘同步其他設備,而不能反過來。CK引腳永遠都是輸出端。同步模式下CR2寄存器的LINEN位、CR3寄存器的SCEN,HDSEL和IREN位必須清零。相關寄存器位(包括LBCL、CPOL、CPHA)的設置都必須在TE和RE使能前完成,發送器和接收器使能后不能再修改這些位,否則可能會導致時鐘工作不正常。CK和TX引腳一起運作,因此只有TE=1且數據已開始傳輸時才能提供時鐘。在發送數據前是無法向異步模式中那樣,提前發送一個數據進行同步的。

圖10所示是USART同步通信的時序示意圖。圖示是M=1,即9位字長的情況,8位字長與此類似。

圖10. USART同步通信時序圖

從圖10可以看出,CPOL=0時,閑時電平為低電平,而CPOL=1時,閑時電平為高電平;CPHA=0時,第一個時鐘沿采樣,而CPHA=1時,第二個時鐘沿采樣。LBCL(Last bit clock)控制的是最后一個數據是否產生輸出時鐘脈沖。

6.2.10 單線半雙工通信

單線通信的最大好處是只占一根線,通過分時收發(半雙工)來實現通信。通過將CR3寄存器的HDSEL(half-duplex selection)位置1來選擇半雙工模式。在此模式下,CR2寄存器的LINKEN位、CLKEN位,CR3寄存器的SCEN和IREN位必須清零。

單線半雙工模式下,TX和RX引腳在芯片內部被連通。HDSEL被寫入1后,RX引腳被停用;在無數據發送時,TX引腳被釋放。TX引腳在空閑或接收數據時跟一個標準的I/O口一樣。所以在不被USART驅動時,TX引腳必須配置位浮空輸入(或輸出高開漏)。除此以外,通信與正常USART模式相似。由于只有一條線路,要由軟件來負責避免出現線上沖突。特別需要說明的是,發送永遠不會被硬件阻斷,當TE=1時,只要有數據被寫到DR寄存器,就會被發送出去。

6.2.11 硬件流控制

圖11. 硬件流控制工作原理

所謂硬件流控制,是指通過硬件發送控制信號來控制數據流的一種方式,相當于一種握手協議。主要是為了避免因雙方處理速度不匹配或USART網絡中多個發送器同時向一個接收器發送數據導致接收端溢出錯誤和數據丟失。硬件流控制的基本原理圖如圖11所示,在兩個USART間增加了兩條控制信號線,一個USART的nRTS連到另一個的nCTS(n表示低電平有效)。當接收端數據處理即將完畢時,通過nRTS端口向發送端發送RTS(Request to send)請求發送信號。而發送端的nCTS端口收到信號后,將其解讀為CTS(Clear to send)允許發送信號,進而允許發送器繼續發送數據。

RTS和CTS可以通過向CR3寄存器的RTSE(RTS enable)和CTSE(CTS enable)位寫入1來獨立開啟。

RTS流控

圖12. RTS流控過程

圖12所示為RTS流控過程示意圖。如前所述,接收器接收數據時,數據先通過移位寄存器接收,當接收到Stop bit后,數據會被存入緩存RDR,RXNE=1。如果使能了RTS,在RXNE=1期間,接收器停止接收數據,nRTS輸出高電平1,向發送器發出停止發送請求,發送器應當在當前幀發送結束后會暫停發送,直至收到新的發送請求。

數據被從RDR讀取后,RXNE=0。如果使能了RTS,nRTS輸出低電平0,向發送器發出新的發送請求。如果數據傳輸通暢,RXNE=1的時間很短,數據幾乎是連續發送。如果發生特殊情況耽誤了RDR中數據的讀取(比如發生中斷),nRTS=1,停止發送,防止丟失數據。

CTS流控

圖13. CTS流控過程 圖13. CTS流控過程

圖13所示為CTS流控過程示意圖。使能CTS后,發送器在發送下一幀前會檢查nCTS輸入端口的電平。如果nCTS有效(低電平)且TXE=0(TDR非空),則下一幀被發送;反之,則不會進行發送。如果nCTS在數據發送期間失效(變為了高電平),當前幀傳輸完成后會停止發送。如圖13中所示,Data2發送期間CTS失效,Data3雖已被移入TDR,但Data2發送后會停止發送,等待CTS=0再開始發送Data3。從圖13還可以看到,在Stop bit后,Data2被移入移位寄存器,TDR中有個短暫的empty期,即TXE=0的間隙。

使能CTS后,只要nCTS電平發生躍變,硬件就會自動將SR寄存器中的CTS狀態位置1。如果設置了CR3寄存器的CTSIE位,則會產生中斷。

6.3 USART模式配置與中斷6.3.1 模式配置

STM32F103ZET6共有3個USART和2個UART。3個USART支持所有的模式,但2個UART只支持部分模式,而且兩個UART支持的模式也存在差別。具體配置如圖14所示。

圖14. USART模式配置

6.3.2 事件與中斷

圖15. USART相關中斷

圖15所示為USART相關中斷事件和標志位。共有11個中斷標志和8個相關中斷,其中前3個為發送器相關中斷,其余為接收器相關中斷。通過設置相關的控制位使能中斷。USART的所有中斷都連接到同一個中斷向量。

6.4 USART寄存器

STM32F103ZET6中與USART相關的寄存器共有7個,地址映射與復位值表如圖16所示。可以看出,這些寄存器雖然都是32bit寄存器,但功能位沒有超過16bit的。所以這些寄存器允許按半字或全字訪問。

圖16. 寄存器地址映射與復位值

6.4.1 USART_SR 狀態寄存器

USART_SR為狀態寄存器(Status Register),用以管理USART相關的狀態標志。

位置

名稱

功能說明

9

CTS

CTS flag

nCTS引腳輸入電平跳變(上升/下降)時,硬件將此位置1。軟件寫入0清除。若CR3寄存器中的CTSIE=1,會觸發中斷。USART4&5無此功能。

8

LBD

LIN break detection flag

LIN模式下檢測到斷開幀時,硬件將此位置1。軟件寫入0清除。若CR2寄存器中的LBDIE=1,會觸發中斷

7

TXE

TDR empty

TDR寄存器中的數據被移入移位寄存器后,硬件將此位置1。向TDR寫入數據會清0。若CR1寄存器中的TXEIE=1,會觸發中斷

TXE=1,說明TDR已空,數據已轉讓發送移位寄存器,可緩存下一個待發送數據了。

注意:此位在單緩存發生時可用。不適用于DMA。

6

TC

Transmission complete

數據幀傳輸完畢且TXE=1時,硬件將此位置1。軟件序列清零。也可以直接向TC寫入0來清除(僅DMA模式推薦)。若CR1寄存器中的TCIE=1,會觸發中斷

5

RXNE

RDR not empty

當發送移位寄存器中的數據被轉入RDR時,硬件將此位置1。讀取RDR或向此位寫入0可清除(只寫法僅DMA模式推薦)。若CR1寄存器中的RXNEIE=1,會觸發中斷

RXNE=1,說明RDR非空,接收移位寄存器中的數據被移出,可接收下一個數據了。

4

IDLE

IDLE line detected

當檢測到空閑幀時,硬件將此位置1。軟件序列清零。若CR1寄存器中的IDLEIE=1,會觸發中斷

3

ORE

Overrun error

接收移位寄存器已滿但RXNE=1(RDR非空)時,硬件將此位置1。軟件序列清零:先讀USART_SR,接著寫入USART_DR。若CR1寄存器中的RXNEIE=1,會觸發中斷

注意:RDR中的內容無恙,但移位寄存器中的數據被覆蓋。多緩存通信時若EIE=1,會觸發中斷。

2

NE

Noise error

接收到的幀中檢測到噪聲時,硬件將此位置1。軟件序列清除。

注意:NE不會產生中斷,因為它與RXNE同時出現,RXNE自己會產生中斷。多緩存通信時若EIE=1,NE發生會觸發中斷。

1

FE

Framing error

當檢測到同步錯誤、噪聲過多或端口字符時,硬件將此位置1。軟件序列清除。

注意:FE不會產生中斷,因為它與RXNE同時出現,RXNE自己會產生中斷。若FE和ORE同時發生,引發錯誤的幀仍會被傳輸,只有ORE位被設置。多緩存通信時若EIE=1,FE發生會觸發中斷。

0

PE

Parity error

當接收端出現奇偶校驗錯誤時,硬件將此位置1。軟件序列清除。清零前必須等待RXNE被置1(有新數據緩存如RDR)。若CR1寄存器中的PEIE=1,會觸發中斷

注:軟件序列清零是指,軟件先讀USART_SR,接著寫入USART_DR。

6.4.2 USART_DR 數據寄存器

USART_DR為數據寄存器(Data Register),用以容納接收或發送的數據。該寄存器由兩個寄存器構成:TDR和RDR。二者均為9位,共用地址(軟件讀取時用RDR、寫入時用TDR),與配套的寄存器間并行通信。若開啟了奇偶校驗,MSB位會被校驗位取代。

6.4.3 USART_BRR 波特率寄存器

USART_BRR為波特率寄存器(Baud Rate Register),用以配置分數波特率發生器的分頻系數USARTDIV。該寄存器共占用16位,分為兩個功能區:

DIV_Mantissa[15:4]:配置USARTDIV整數部分;

DIV_Fraction[3:0]:配置USARTDIV分數部分。

6.4.4 USART_CR1 控制寄存器1

USART_CR1為控制寄存器(Control Register)。USART共有3個控制寄存器,CR1主要用來設置收/發過程相關的參數,包括字長、校驗位設置、喚醒方式、收/發器使能、靜默模式、及收/發過程相關的5個中斷。

位置

名稱

功能說明

13

UE

USART enable

0: USART分頻器和輸出關閉; 1: USART開啟 。

12

M

Word length

0: 停止位1,數據位 8,,停止位n (n=0.5,1,1.5,2)

1: 停止位1,數據位 9,停止位n 注意:傳輸過程中不要修改

11

WAKE

Wakeup method

0: 空閑幀喚醒; 1: 地址標記喚醒

10

PCE

Parity control enable

0: 關閉奇偶校驗; 1: 開啟奇偶校驗

9

PS

Parity selection

0: 偶校驗; 1: 奇校驗

8

PEIE

PE interrupt enable

0: 禁用PE(奇偶校驗錯誤)中斷; 1: 開啟PE中斷

7

TXEIR

TXE interrupt enable

0: 禁用TXE(TDR空)中斷; 1: 開啟TXE中斷

6

TCIE

TC interrupt enable

0: 禁用TC(傳輸完成)斷; 1: 開啟TC中斷

5

RXNEIE

RXNE interrupt enable

0: 禁用RXNE(RDR非空)中斷 1: 開啟RXNE中斷

4

IDLEIE

IDLE interrupt enable

0: 禁用IDLE(空閑幀)中斷 1: 開啟IDLEL中斷

3

TE

Transmitter enable

0: 關閉發送器;1: 使能發送器

注意:除了智能卡模式,若在傳輸過程中TE位上有0脈沖,會在當前幀傳輸結束發送一個前導符(空閑幀);TE設1后要延遲1個bit才開始傳輸

2

RE

Receiver enable

0: 關閉接收器;1: 使能接收器,并開始查找起始位

1

RWU

Receiver wakeup

0: 退出靜默模式;1: 進入靜默模式

0

SBK

Send break

該位寫入1會發生一個斷開符。

6.4.5 USART_CR2 控制寄存器2

CR2主要用來設置CK引腳的同步時鐘、LIN模式、停止位以及USART地址。

位置

名稱

功能說明

14

LINEN

LIN mode enable

0: 關閉LIN模式; 1: 開啟LIN模式

13:12

STOP

STOP bits

00: 1; 01: 0.5; 10: 2; 11: 1.5; UART4 & 5 不支持0.5和1.5個停止位

11

CLKEN

Clock enable

0: 停止CK時鐘輸出; 1: 使能CK時鐘輸出

10

CPOL

Clock pority

0: 閑時低電平; 1: 閑時高電平 UART4 & 5 不支持

9

CPHA

Clock phase

0: 第1個始終沿捕獲數據; 1:第2個時鐘沿捕獲數據 UART4 & 5 不支持

8

LBCL

Last bit clock pulse

0: Last bit不輸出時鐘脈沖; 1:輸出 UART4 & 5 不支持

6

LBDIE

LIN break detection interrupt enable

0: 禁止LIN斷開幀中的; 1: 開啟

5

LBDL

LIN break detection length

0: 10bit斷開符檢測; 1:11位斷開符檢測

3:0

ADD

USART address

為USART分配地址。此位在多處理器通信時用于通過地址標記定向喚醒。

注意:CPOL,CPHA,LBCL在傳輸過程中禁止修改。

6.4.6 USART_CR3 控制寄存器3

CR3主要用來設置硬件流控制、DMA收發、智能卡和IrDA模式,以及FE/ORE/NE錯誤中斷。

位置

名稱

功能說明

10

CTSIE

CTS interrupt enable

1: 使能CTS中斷; UART4 & 5 不支持

9

CTSE

CTS enable

1: 使能CTS硬件流控制; UART4 & 5 不支持

8

RTSE

RTS enable

1: 使能RTS硬件流控制; UART4 & 5 不支持

7

DMAT

DMA enable transmitter

1: 使能DMA模式發送; UART4 & 5 不支持

6

DMAR

DMA enable receiver

1: 使能DMA模式接收; UART4 & 5 不支持

5

SCEN

Smartcard mode enable

1: 使能智能卡模式; UART4 & 5 不支持

4

NACK

Smartcard NACK enable

1: 出現奇偶校驗錯誤時使能NACK; UART4 & 5 不支持

3

HDSEL

Half-duplex selection

1: 選擇半雙工模式

2

IRLP

IrDA low-power

0: 正常模式;1: 低功耗模式

1

IREN

IrDA mode enable

1: 使能IrDA紅外模式

0

EIE

Error interrupt enable

1: 多緩沖區模式下,使能FE、ORE、NE中斷

6.4.7 USART_GTPR保護時間和預分頻寄存器

USART_GTPR為保護時間和預分頻寄存器(Guard Time and Prescaler Register)。該寄存器共占16位,分為兩個功能區:

GT[15:8]:用于設置智能卡模式下的保護時間,單位為波特率時鐘個數,保護時間過后才會設置TC標志位。

PSC[7:0]:用于設置智能卡和IrDA低功耗模式下的波特率預分頻系數。IrDA低功耗模式下,

6.5 USART功能設置

初始化USART的基本步驟如下:

使能時鐘。查閱芯片手冊,USART1相關引腳為:PA8-CK、PA9-TX、PA10-RX、PA11-CTS、PA12-RTS。所以應該使能GPIOA的時鐘和USART1的時鐘。二者均在RCC_APB2ENR寄存器中設置。配置引腳模式:TX-輸出復用推挽;RX-輸入浮空。配置USART參數:波特率、字長、停止位、奇偶校驗、硬件流控制、收/發模式、.....配置USART中斷:選擇通道、優先級配置、開啟所需中斷。使能USART1。編寫收發代碼和中斷響應函數。6.5.1 寄存器操作

為了便于寄存器操作,頭文件stm32f10x.h中定義了與USART寄存器相關的宏,對地址進行了映射。以USART1為例,相關宏定義和地址映射如下:

#define PERIPH_BASE ((uint32_t)0x40000000)#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)#define ADC3_BASE (APB2PERIPH_BASE + 0x3C00)#define USART1 (USART_TypeDef *) USART1_BASE)typedef struct{ __IO uint16_t SR; uint16_t RESERVED0; __IO uint16_t DR; uint16_t RESERVED1; __IO uint16_t BRR; uint16_t RESERVED2; __IO uint16_t CR1; uint16_t RESERVED3; __IO uint16_t CR2; uint16_t RESERVED4; __IO uint16_t CR3; uint16_t RESERVED5; __IO uint16_t GTPR; uint16_t RESERVED6;} USART_TypeDef;

通過上述宏名稱,可以對USART相關寄存器中的功能位進行設置。

//波特率115200,數據位8,停止位1,RX+TX,無奇偶校驗,無硬件流控usart1_int(void){uint32_t temp/* 1 使能時鐘 */RCC->APB2EN |= 0x00004004;//使能GPIOA和USART1的時鐘/* 2 配置引腳 */temp = GPIOA->CRH;temp &= 0xFFFFF00F; //resettemp |= 0x000004B0; //PA9:50MHz,復用推挽;PA10:浮空輸入GPIOA->CRH = temp;/* 3 配置USART參數 */USART1->BRR = 0x2701; //72MHz,115200 =>39.0625temp = USART1->CR1;temp &= 0xFFFFE9F3;//Clear M/PCE/PS/TE/REtemp |= 0x000C;//數據位8、無奇偶校驗、收發均開啟USART1->CR1 = temp;USART1->CR2 &= 0xFFFFCFFF;//停止位1USART1->CR2 &= 0xFFFFCFFF;//硬件流控制nCTS,nRTS均不開啟/* 4 配置USART中斷 */ 待補充2021.9.7/* 5 使能USART */USART1->CR1 |= 0x01<<13; }6.5.2 標準庫相關函數

標準庫中USART相關的庫函數共29個,在stm32f10x_usart.h中聲明,stm32f10x_usart.c中定義。按函數功能大體分類,簡述如下:

1. 初始化函數

USART_DeInit(); 復位USART外設總線時鐘。該函數實際訪問的是RCC_APBxRSTR寄存器,先ENABLE接著DISABLE(為何要多此一舉?)。USART_StructInit(); USART_Init( ); 這個兩個函數用來初始化USART參數。可以先用USART_StructInit()用默認參數初始化一個USART_InitTypeDef結構體。默認參數為:波特率9600,字長8bit,停止位1,奇偶校驗none,模式RX+TX,硬件流控None。執行此函數后,修改必要參數,再調用USART_Init()完成初始化。不用USART_StructInit(),需要逐字段輸入。typedef struct{ uint32_t USART_BaudRate; uint16_t USART_WordLength; uint16_t USART_StopBits; uint16_t USART_Parity; uint16_t USART_Mode; uint16_t USART_HardwareFlowControl;} USART_InitTypeDef;USART_StructInit(){ /* USART_InitStruct members default value */ USART_InitStruct->USART_BaudRate = 9600; USART_InitStruct->USART_WordLength = USART_WordLength_8b; USART_InitStruct->USART_StopBits = USART_StopBits_1; USART_InitStruct->USART_Parity = USART_Parity_No ; USART_InitStruct->USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStruct->USART_HardwareFlowControl = USART_HardwareFlowControl_None; }

USART_Init()中設置的是CR1-3和BRR寄存器。波特率設置時,總線時鐘是根據時鐘系統設置進行計算,進而計算和設置BRR的整數和分數功能區的值。

USART_ClockStructInit(); USART_ClockInit(); 與前述兩個函數類似。這兩個函數用來初始化CK引腳的時鐘。可先調用USART_ClockStructInit(),生成一個用默認參數初始化的USART_ClockInitTypeDef結構體,進行必要修改后傳個USART_ClockInit()完成初始化。默認參數為:CK時鐘關閉,極性low,相位第1邊沿,最后bit無時鐘脈沖。typedef struct{ uint16_t USART_Clock; uint16_t USART_CPOL; uint16_t USART_CPHA; uint16_t USART_LastBit;} USART_ClockInitTypeDef;USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct){ /* USART_ClockInitStruct members default value */ USART_ClockInitStruct->USART_Clock = USART_Clock_Disable; USART_ClockInitStruct->USART_CPOL = USART_CPOL_Low; USART_ClockInitStruct->USART_CPHA = USART_CPHA_1Edge; USART_ClockInitStruct->USART_LastBit = USART_LastBit_Disable;}

2. 功能管理

USART_Cmd(); 使能/禁用USART。設置CR1寄存器的UE位。USART_SetAddress(); 為USART分配地址。設置CR2寄存器的ADD[3:0]位。USART_WakeUpConfig(); 設置USART喚醒模式。設置CR1寄存器的WAKE位。USART_ReceiverWakeUpCmd(); 使能/禁用靜默模式。設置CR1寄存器的RWU位。USART_DMACmd(); 使能/禁用DMA接收/發送。設置CR3寄存器的DMAR或DMAT位。USART_HalfDuplexCmd(); 使能/禁用半雙工模式。設置CR3的HDSEL位。USART_OverSampling8Cmd(); 接收器一般都是16倍過采樣。只有STM32F100xx系列支持8倍過采樣,因為該系列最高頻率只有24MHz,降低過采樣可以提高波特率。USART_OneBitMethodCmd(); 只有低端芯片才支持的功能。

3. 接收和發送函數

USART_SendData(); 發送數據,即將數據寫入DR寄存器。雖然輸入的Data為16位,但只有低9位有效。這個函數核心代碼只有一行,這也是寄存器操作發送數據的典型代碼:USARTx->DR = (Data & (uint16_t)0x01FF); //取低9位USART_ReceiveData(); 接收數據,即將數據從DR寄存器返回。與SendData函數類似,該函數只取DR的低9位。return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);

4. 中斷管理函數

USART_ITConfig(); 配置USART中斷。設置寄存器中與中斷相關的8個位(前8個)。// 所有11個中斷別名#define USART_IT_PE ((uint16_t)0x0028)#define USART_IT_TXE ((uint16_t)0x0727)#define USART_IT_TC ((uint16_t)0x0626)#define USART_IT_RXNE ((uint16_t)0x0525)#define USART_IT_IDLE ((uint16_t)0x0424)#define USART_IT_LBD ((uint16_t)0x0846)#define USART_IT_CTS ((uint16_t)0x096A)#define USART_IT_ERR ((uint16_t)0x0060)#define USART_IT_ORE ((uint16_t)0x0360)#define USART_IT_NE ((uint16_t)0x0260)#define USART_IT_FE ((uint16_t)0x0160)USART_GetITStatus(); 可分別查詢10個中斷(除了ERR)相關位的值,借以判別中斷狀態。USART_ClearITPendingBit(); 該函數用于清除CTS/LBD/TC/RXNE中斷的中斷狀態位。其他中斷狀態位的清除方法:TXEIE - 讀DR寄存器可清除。PEIE/FE/NE/ORE/IDLEIE中斷狀態位需要軟件序列清除:先用USART_GetITStatus()讀SR寄存器,接著用USART_ReceiveData()讀DR寄存器。TC中斷狀態位需要軟件序列清除:先用USART_GetITStatus()讀SR寄存器,接著用USART_SendData()寫DR寄存器。USART_GetFlagStatus(); 功能同USART_GetITStatus。USART_ClearFlag(); 功能同USART_ClearITPendingBit。

5. LIN模式相關函數

USART_LINCmd(); 使能/禁用LIN模式。設置CR2寄存器的LINEN位。USART_LINBreakDetectLengthConfig(); 配置LIN模式下斷開符檢測時的幀長度,10或11bit。設置CR2寄存器的LBDL位。USART_SendBreak(); 向USARTx發送一個斷開符。設置CR1寄存器的SBK位。

6. SmartCard模式相關函數

USART_SmartCardCmd(); 使能或禁用智能卡模式。設置CR3寄存器的SCEN位。USART_SetGuardTime(); 設置智能卡保護時間,GTPR寄存器的高8位GT[15:8]。USART_SetPrescaler(); 設置智能卡分頻系數,GTPR寄存器的低8位PSC[7:0]。USART_SmartCardNACKCmd(); 使能/禁用NACK傳輸。設置CR3寄存器的NACK位。

7. IrDA紅外模式相關函數

USART_IrDAConfig(); 配置紅外模式。設置CR3寄存器的IRLP位。USART_IrDACmd(); 使能/退出紅外模式。設置CR3寄存器的IREN位。6.5.3 HAL庫相關函數

HAL庫中USART相關的常規庫函數有40多個,還有多個宏函數,在stm32f1xx_hal_usart.h中聲明,stm32f1xx_hal_usart.c中定義。只是比STD庫多了些函數,換了個名稱,功能分的更細一些而已。歸根結底,也是設置的各個寄存器。僅將函數名稱羅列如下,大多可以從名稱看出功能。

/* 宏函數 _HANDLE_是外設參數對應的結構體,HAL庫中稱為外設句柄 */__HAL_UART_RESET_HANDLE_STATE()__HAL_UART_FLUSH_DRREGISTER()__HAL_UART_GET_FLAG()__HAL_UART_CLEAR_FLAG()__HAL_UART_CLEAR_PEFLAG()__HAL_UART_CLEAR_FEFLAG()__HAL_UART_CLEAR_NEFLAG()__HAL_UART_CLEAR_OREFLAG()__HAL_UART_CLEAR_IDLEFLAG()__HAL_UART_ENABLE_IT()__HAL_UART_DISABLE_IT()__HAL_UART_GET_IT_SOURCE()__HAL_UART_HWCONTROL_CTS_ENABLE()__HAL_UART_HWCONTROL_CTS_DISABLE()__HAL_UART_HWCONTROL_RTS_ENABLE()__HAL_UART_HWCONTROL_RTS_DISABLE()__HAL_UART_ENABLE()__HAL_UART_DISABLE()/* Initialization/de-initialization functions **/HAL_UART_Init();HAL_HalfDuplex_Init();HAL_LIN_Init();HAL_MultiProcessor_Init();HAL_UART_DeInit();HAL_UART_MspInit();HAL_UART_MspDeInit();/* IO operation functions **/HAL_UART_Transmit();HAL_UART_Receive();HAL_UART_Transmit_IT();HAL_UART_Receive_IT();HAL_UART_Transmit_DMA();HAL_UART_Receive_DMA();HAL_UART_DMAPause();HAL_UART_DMAResume();HAL_UART_DMAStop();HAL_UARTEx_ReceiveToIdle();HAL_UARTEx_ReceiveToIdle_IT();HAL_UARTEx_ReceiveToIdle_DMA();/* Transfer Abort functions */HAL_UART_Abort();HAL_UART_AbortTransmit();HAL_UART_AbortReceive();HAL_UART_Abort_IT();HAL_UART_AbortTransmit_IT();HAL_UART_AbortReceive_IT();/* 中斷與回調函數 */HAL_UART_IRQHandler();HAL_UART_TxCpltCallback();HAL_UART_TxHalfCpltCallback();HAL_UART_RxCpltCallback();HAL_UART_RxHalfCpltCallback();HAL_UART_ErrorCallback();HAL_UART_AbortCpltCallback();HAL_UART_AbortTransmitCpltCallback();HAL_UART_AbortReceiveCpltCallback();HAL_UARTEx_RxEventCallback();/* Peripheral Control functions **/HAL_LIN_SendBreak();HAL_MultiProcessor_EnterMuteMode();HAL_MultiProcessor_ExitMuteMode();HAL_HalfDuplex_EnableTransmitter();HAL_HalfDuplex_EnableReceiver();/* Peripheral State functions **/HAL_UART_GetState();HAL_UART_GetError();

typedef enum{ HAL_OK = 0x00U, HAL_ERROR = 0x01U, HAL_BUSY = 0x02U, HAL_TIMEOUT = 0x03U} HAL_StatusTypeDef;

HAL庫中將外設所有的參數和回調函數整合到一個結構體之中,稱為外設的句柄,命名規則PPPP_HandleTypeDef。具體到USART,UART_HandleTypeDef的定義如下:

/* UART handle Structure definition */typedef struct __UART_HandleTypeDef{ USART_TypeDef *Instance; /*!< UART registers base address */ UART_InitTypeDef Init; /*!< UART communication parameters */ uint8_t *pTxBuffPtr; /*!< Pointer to UART Tx transfer Buffer */ uint16_t TxXferSize; /*!< UART Tx Transfer size */ __IO uint16_t TxXferCount; /*!< UART Tx Transfer Counter */ uint8_t *pRxBuffPtr; /*!< Pointer to UART Rx transfer Buffer */ uint16_t RxXferSize; /*!< UART Rx Transfer size */ __IO uint16_t RxXferCount; /*!< UART Rx Transfer Counter */ __IO HAL_UART_RxTypeTypeDef ReceptionType; /*!< Type of ongoing reception */ DMA_HandleTypeDef *hdmatx; /*!< UART Tx DMA Handle parameters */ DMA_HandleTypeDef *hdmarx; /*!< UART Rx DMA Handle parameters */ HAL_LockTypeDef Lock; /*!< Locking object */ __IO HAL_UART_StateTypeDef gState; /*!< UART state information related to global Handle management and also related to Tx operations. This parameter can be a value of @ref HAL_UART_StateTypeDef */ __IO HAL_UART_StateTypeDef RxState; /*!< UART state information related to Rx operations. This parameter can be a value of @ref HAL_UART_StateTypeDef */ __IO uint32_t ErrorCode; /*!< UART Error code */#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) (* TxHalfCpltCallback)(struct __); /*!< UART Tx Half Complete Callback */ (* TxCpltCallback)(struct __); /*!< UART Tx Complete Callback */ (* RxHalfCpltCallback)(struct __); /*!< UART Rx Half Complete Callback */ (* RxCpltCallback)(struct __); /*!< UART Rx Complete Callback */ (* ErrorCallback)(struct __); /*!< UART Error Callback */ (* AbortCpltCallback)(struct __); /*!< UART Abort Complete Callback */ (* AbortTransmitCpltCallback)(struct __); /*!< UART Abort Transmit Complete Callback */ (* AbortReceiveCpltCallback)(struct __); /*!< UART Abort Receive Complete Callback */ (* WakeupCallback)(struct __); /*!< UART Wakeup Callback */ (* RxEventCallback)(struct __, uint16_t Pos); /*!< UART Reception Event Callback */ (* MspInitCallback)(struct __); /*!< UART Msp Init callback */ (* MspDeInitCallback)(struct __); /*!< UART Msp DeInit callback */#endif /* USE_HAL_UART_REGISTER_CALLBACKS */} UART_HandleTypeDef;

有些屬性本身有是一個結構體。句柄的概念與MATLAB中的handle非常像。通過一個句柄可以管理外設對象的所有屬性。

USART在STM32CubeIDE中的配置過程如下面幾幅圖所示

TODO:LIN模式、智能卡模式、IrDA模式暫時不深究,用到時再學習;USART利用DMA連續通信,留待學習DMA時一并學習。

拓展知識:

主站蜘蛛池模板: 亚洲成a人片在线观看日本| 亚洲欧美不卡视频在线播放| 亚洲欧美套图一区| 狠狠躁夜夜躁人人爽天天不卡软件 | 国产精品成人3p一区二区三区| 亚洲一区十八禁| 久久婷婷五月综合色奶水99啪| 欧美又大粗又爽又黄大片视频| 亚洲xxxx做受欧美| 亚洲精品suv精品一区二区| 久久无码国产日本欧美| 日韩欧美亚洲一区在线播放| 亚洲国产精品一区二区三区性色| 午夜福利视频| 国产色婷婷五月精品综合在线| 亚洲欧美日韩精品一区二区在线观看| 五十路熟女一区二区三区| 亚洲视频国产一区| 99re久久精品国产| 亚洲午夜一区二区三区在线观看| 日本熟妇hdsex视频| 精品999久久久久久中文字幕| 国产欧美精品一区二区三区四区 | 国产成人小视频| 日本www一道久久久免费| 欧美日韩蜜臀一区精品人妻视频| 亚洲日韩精品无码专区加勒比海| 日本美女一区二区电影| 淑女一区二区精品视频免费| 国产成人无码午夜视频在线观看| 韩国一区二区三区黄色| 人人妻人人妻人人片av| 一二三四免费观看在线视频中文版 | 日本免费一区二区六区| 日本中文字幕有码在线视频| 这个少妇太骚一区二区69x| 精品人妻系列无码专区久久| 中文字幕无线乱码人妻| 中国女人内谢69xxxxxa片| 国产精品a成v人在线播放| www婷婷av久久久影片|