通用同步異步收發器(USART) 提供了一個靈活方便的串行數據交換接口,數據幀可以通過全雙工或半雙工,同步或異步的方式進行傳輸。 USART提供了可編程的波特率發生器,能對UCLK(PCLK1或PCLK2) 進行分頻產生USART發送和接收所需的特定頻率。
USART不僅支持標準的異步收發模式,還實現了一些其他類型的串行數據交換模式,如紅外編碼規范, SIR,智能卡協議, LIN, 半雙工以及同步模式。它還支持多處理器通信和Modem流控操作(CTS/RTS)。數據幀支持從LSB或者MSB開始傳輸。數據位的極性和TX/RX引腳都可以靈活配置。部分USART支持DMA功能,以實現高速率的數據通信,支持情況根據不同芯片型號而定。
10.1.USART 基礎知識
通信方式的分類:并行通信、串行通信
- 并行通信:是指數據的各位同時在多根數據線上發送或接收,如圖所示。

并行通信的特點:控制簡單,傳輸速度快;由于傳輸線多,適用于距離近傳輸。
- 串行通信:是數據的各位在同一根數據線上依次逐位發送或接收,如圖所示

串行通信的特點:控制復雜,傳輸速度較慢;只需要一根線,適用于遠距離傳輸。
串行通信方式的分類
在串行通信中,根據對數據流的分界、定時及同步方法不同,可以分為同步串行通信方式和異步串行通信方式。

同步通信:發送端和接收端必須使用統一時鐘,它是一種連續傳送數據的通信方式,一次通信傳送多個字符數據,稱為一幀信息。幀格式如圖所示:

同步串行通信幀:是將許多字符組成一個信息幀,這樣字符可以一個接一個的傳輸,但是,在每幀信息的開始要加上同步字符,在沒有信息要傳輸時,要填上空字符,因為同步傳輸不允許有間 隙。
同步串行通信特點:必須有同步時鐘,傳輸信息量大,傳輸速率高,但是傳輸設備復雜,技術要求高。
- 異步串行通訊方式:是指通訊雙方以一個字符(包括特定附加位)作為數據傳輸單位且發送方傳送字符的間隔時間不一定,具有不規則數據段傳送特性的串行數據傳輸。異步串行通信如圖所示:

異步通信:是指發送和接收端使用各自的時鐘,并且它是一種不連續傳輸的通信方式,一次通信只傳一個字符數據,稱為字符幀。字符幀之間的間隙可以是任意間隙。它的幀格式如圖所示:

異步串行通信幀:是將一個字節數據加上起始位、校驗位、停止位,構成的字符幀。由于異步通信沒有同步時鐘,所以接收端要時刻處于接收狀態。
起始位:在沒有數據傳送時即空閑狀態,此時通信線上為邏輯“1”狀態。當發送端要發送1個字符數據時,首先發送一個邏輯“0”信號,這個低電平就是幀格式的起始位。其作用就是告訴接收端開始發送一幀數據。接收端檢測到這個低電平后,就準備接收數據信號。
數據位:在起始位之后,發送端發出的就是數據位,數據位的位數沒有嚴格限制5~9位都行。低位在前,高位在后,由低位到高位逐位傳送。USART一般是8位。
校驗位:數據位發送完成之后,可發送一位用來檢驗數據在傳送過程中是否出錯的奇偶校驗位。奇偶校驗是收發雙方預先約定好的有限差錯檢驗方式之一。有時也可以無校驗。
停止位:字符幀格式的最后部分是停止位,邏輯“1”電平有效,它可占1/2位、1位、1.5位或2位。停止位表示傳送一幀信息的結束,也為發送下一幀信息做好準備。
異步串行通信特點:不需要時鐘同步,通信實現簡單,設備開銷小。但是傳輸速率不高。
串行通信數據傳送方向
根據串行數據的傳輸方向,我們可以將通信分為單工、半雙工、全雙工。
單工:是指數據傳輸僅能沿一個方向,不能實現反向傳輸。
半雙工:是指數據傳輸可以沿兩個方向,但需要分時進行傳輸。
全雙工:是指數據可以同時進行雙向傳輸。
串行通信數據的傳輸方向

10.2.GD32 USART 外設原理簡介
GD32芯片具有多個USART外設用于串口通訊,它是 Universal Synchronous Asynchronous Receiver and Transmitter的縮寫,即通用同步異步收發器可以靈活地與外部設備進行全雙工數據 交換。有別于USART,它還有具有UART外設(Universal Asynchronous Receiver and Transmitter),它是在USART基礎上裁剪掉了同步通信功能,只有異步通信。簡單區分同步和異步就是看通信時需不需要對外提供時鐘輸出。
因篇幅有限,本文無法詳細介紹GD32所有系列USART外設接口,下面以GD32F30x為列,著重介紹下GD32F30x的USART外設簡介和結構框圖,后介紹下各個系列的差異。
GD32 USART 主要特性
? NRZ標準格式(Mark/Space)。
? 全雙工異步通信。
? 可編程的波特率產生器:
– 由外設時鐘分頻產生,其中USART0由PCLK2分頻得到,USART1/2和UART3/4由PCLK1分頻得到;
– 16倍過采樣;
– 當時鐘頻率為120M,過采樣為16,最高速度可到7.5MBits/s。
? 完全可編程的串口特性:
– 偶校驗位,奇校驗位,無校驗位的生成/檢測;
– 數據位(8或9位);
– 產生0.5,1,1.5或者2個停止位。
? 發送器和接收器可分別使能。
? 支持硬件Modem流控操作(CTS/RTS)。
? DMA訪問數據緩沖區。
? LIN斷開幀的產生和檢測。
? 支持紅外數據協議(IrDA)。
? 同步傳輸模式以及為同步傳輸輸出發送時鐘。
? 支持兼容ISO7816-3的智能卡接口:
– 字節模式(T=0);
– 塊模式(T=1);
– 直接和反向轉換。
? 多處理器通信:
– 如果地址不匹配,則進入靜默模式;
– 通過線路空閑檢測或者地址掩碼檢測從靜默模式喚醒。
? 多種狀態標志:
– 傳輸檢測標志:接收緩沖區不為空(RBNE),發送緩沖區為空(TBE),傳輸完成(TC),忙(BSY);
– 錯誤檢測標志:過載錯誤(ORERR),噪聲錯誤(NERR),幀格式錯誤(FERR),奇偶校驗錯誤(PERR);
– 硬件流控操作標志:CTS變化(CTSF);
– LIN模式標志:LIN斷開檢測(LBDF);
– 多處理器通信模式標志:IDLE幀檢測(IDLEF);
– 智能卡模式標志:塊結束(EBF)和接收超時(RTF);
– 若相應的中斷使能,這些事件發生將會觸發中斷。
USART0/1/2完全實現上述功能,但是UART3/4只實現了上面所介紹的部分功能,下面這些功能在UART3/4中沒有實現:
? 智能卡模式;
? 同步模式;
? 硬件流操作(CTS/RTS);
? 設置數據極性。
USART 結構框圖

USART 功能引腳:
TX:發送數據輸出引腳
SW_RX:數據接收引腳,只用于單線和智能卡模式,屬于內部腳,沒有具體的外部引腳。
RX:接收數據輸入引腳
nRTS:請求以發送(Request To Send),n表示低電平有效。如果使能RTS流控制,當USART接收器準備好接收新數據時就會將nRTS變成低電平;當接收寄存器已滿時,nRTS將被設置為高電平。該引腳只適用于硬件流控制。
nCTS:清除以發送(Clear To Send),n表示低電平有效。如果使能CTS流控制,發送器在發送下一幀數據之前會檢測nCTS引腳,如果為低電平,表示可以發送數據,如果為高電平則在發送完當前數據幀之后停止發送。該引腳只適用于硬件流控制。
CK:發送器時鐘輸出引腳。這個引腳僅適用于同步模式。具體各系列USART引腳對應,可見相應的Datasheet。
波特率發生器:如圖 0-36 USART結構框圖的②所示,波特率分頻系數是一個16位的數字,包含12位整數部分和4位小數部分。波特率發生器使用這兩部分組合所得的數值來確定波特率。由于具有小數部分的波特率分頻系數,將使USART能夠產生所有標準波特率。
波特率分頻系數(USARTDIV) 與系統時鐘具有如下關系:

USART0的系統時鐘為PCLK2,USART1/2和UART3/4的系統時鐘為PCLK1。在使能USART之前,必須在時鐘控制單元使能系統時鐘。
控制器:如USART結構框圖所示,USART有專門控制發送的發送器、控制接收的接收器,還有喚醒單元、中斷控制等等。使用USART之前需要向USART_CTL0寄存器的UEN位置1使能USART。發送或者接收數據字長可選8位或9位,由USART_CTL0的WL位控制。
數據寄存器:如USART結構框圖所示,USART數據寄存器(USART_DATA)只有低9位有效,并且第9位數據是否有效要取決于USART控制寄存器1(USART_CTL0)的WL位設置,當WL位為0時表示8位數據字長,當WL位為1表示9位數據字長,我們一般使用8位數據字長。USART_DATA包含了已發送的數據或者接收到的數據。USART_DATA實際是包含了兩個寄存器,一個專門用于發送的可寫TDATA,一個專門用于接收的可讀RDATA。當進行發送操作時,往USART_DATA寫入數據會自動存儲在TDATA內;當進行讀取操作時,向USART_DATA讀取數據會自動提取RDATA數據。
TDATA和RDATA都是介于系統總線和移位寄存器之間。串行通信是一個位一個位傳輸的,發送時把TDATA內容轉移到發送移位寄存器,然后把移位寄存器數據每一位發送出去,接收時把接收到的每一位順序保存在接收移位寄存器內然后才轉移到RDATA。
USART支持DMA傳輸,可以實現高速數據傳輸。
校驗控制:GD32系列控制器USART支持奇偶校驗。當使用校驗位時,串口傳輸的長度將是8位的數據幀加上1位的校驗位總共9位,此時USART_CTL0寄存器的WL位需要設置為1,即9數據位。將USART_CTL0寄存器的PCEN位置1就可以啟動奇偶校驗控制,奇偶校驗由硬件自動完成。啟動了奇偶校驗控制之后,在發送數據幀時會自動添加校驗位,接收數據時自動驗證校驗位。接收數據時如果出現奇偶校驗位驗證失敗,會見USART_STAT0寄存器的PERR位置1,并可以產生奇偶校驗中斷。
使能了奇偶校驗控制后,每個字符幀的格式將變成:起始位+數據幀+校驗位+停止位。
中斷控制:USART有多個中斷請求事件,具體可見所示。
各系列 USART 功能差異 GD32系列MCU有關USART外設各系列功能差異如GD32各系列MCU USART外設功能差異表所示。
GD32 各系列 MCU USART 外設功能差異表

10.3.硬件連接說明
為利用USART實現開發板與電腦通信,需要用到一個USB轉USART的IC,我們選擇CH340G芯片來實現這個功能,CH340G是一個USB總線的轉接芯片,實現USB轉USART、USB轉IrDA紅外或者USB轉打印機接口,我們使用其USB轉USART功能。具體電路設計見下圖USB轉串口硬件設計。
我們將CH340G的TXD引腳與USART的RX引腳連接,CH340G的RXD引腳與USART的TX引腳連接。

5.10.4.軟件配置說明
本小節講解USART_Example歷程中USART模塊的配置說明,主要包括外設時鐘配置、GPIO引腳 配置、USART外設配置、主函數介紹以及運行結果。本例程主要介紹GD32 MCU各系列USART 模塊的輪詢發送中斷接收,有關USART其他功能例程可參考各系列固件庫歷程。 USART 外設配置
USART外設配置如代碼清單USART例程USART外設配置所示。首先是對各項外設時鐘初始化,接著初始化GPIO:GD32F10X、GD32F30X、GD32F20X、GD32E10X系列GPIO配置相同,PA9配置為復用推挽輸出;PA10需配置為浮空輸入。GD32F1X0、GD32F4XX、GD32F3X0、GD32E23X系列GPIO配置基本相同,不同在于PA9/PA10引腳的AF復用功能配置不同,在GD32F1X0、GD32F3X0和GD32E23X上,需要配置為AF1模式,在GD32F4XX上需要配置為AF7模式。然后配置USART接收中斷優先級分組。最后配置USART初始化:GD32全系列MCU中USART外設配置基本相同,在本例程中,USART既可以發送可以接收,GD32標準庫提供了USART各項初始化的函數接口,其初始化函數接口說明如USART函數說明列表所示。因USART使用了C函數的printf函數,所以重定向了printf到USART,還得在KEIL的魔術棒Target配置下打開” Use MicroLIB”。
代碼清單 USART 例程 USART 外設配置
void usart_init(void) { rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_USART0); #if defined GD32F10X_HD || GD32F30X_HD || GD32F20X_CL || GD32E10X rcu_periph_clock_enable(RCU_AF); /* connect port to USARTx_Tx */ gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); /* connect port to USARTx_Rx */ gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10); nvic_irq_enable(USART0_IRQn, 2U, 0U); #elif defined GD32F1X0 || GD32F4XX || GD32F3X0 || GD32E230 #if defined GD32F1X0 || GD32F3X0 || GD32E230 /* connect port to USARTx_Tx USARTx_Rx*/ gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9 | GPIO_PIN_10 ); #elif defined GD32F4XX gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_9 | GPIO_PIN_10 ); #endif #if defined GD32F1X0 || GD32F3X0 || GD32F4XX nvic_irq_enable(USART0_IRQn, 2U, 0U); #elif defined GD32E230 nvic_irq_enable(USART0_IRQn, 2U); #endif /* configure USART Tx as alternate function push-pull */ gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); /* configure USART Rx as alternate function push-pull */ gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10); #endif /* USART configure */ usart_deinit(USART0); usart_baudrate_set(USART0, 115200U); usart_word_length_set(USART0, USART_WL_8BIT); usart_stop_bit_set(USART0, USART_STB_1BIT); usart_parity_config(USART0, USART_PM_NONE); usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE); usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE); usart_receive_config(USART0, USART_RECEIVE_ENABLE); usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); usart_enable(USART0); } /* retarget the C library printf function to the USART */ int fputc(int ch, FILE *f) { usart_data_transmit(USART0, (uint8_t)ch); while (RESET == usart_flag_get(USART0, USART_FLAG_TBE)); return ch; }
USART 函數說明列表

中斷函數
中斷函數如代碼清單 USART 中斷函數所示,GD32 所有函數中斷接收函數相同:先檢測 USART_INT_FLAG_RBNE 置 1 時,執行數據接收,當數據接收到設定的位數后,關閉 USART 接收中斷。
void USART0_IRQHandler(void) { if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){ /* receive data */ rxbuffer[rxcount++] = usart_data_receive(USART0); if(rxcount == rx_size){ usart_interrupt_disable(USART0, USART_INT_RBNE); } } }
主函數說明 主函數如代碼清單USART例程主函數所示,該主函數主要分成三個部分,USART初始化、USART 輪詢發送 buffer 、 開啟中斷接收 buffer 當 數 據 接 收 完 成 時 執 行 printf 打 印函數:printf("\n\rUSART receive successfully!\n\r");。
int main(void) { usart_init(); printf("GD32 WELCOME"); while(txcount
運行結果 將USART_Example例程按照對應的芯片工程編譯完成后,下載到對應芯片中,采用USB轉USART連接電腦,使用串口助手,可查看MCU發送的結果,電腦發送數據MCU返回的結果。
具體可如下圖USART運行結果所示。

10.5.USART 使用注意事項
(1) 使用 USART,收發都是 DMA 方式,由于接受數據幀長度不固定,可以采用 USART Receive timeout 標志作為 USART DMA 接收完成標志,采用 TC 作為 USART DMA 發送完成標志。
(2) USART 只要發送寄存器為空,就會一直有中斷,因此,要是不發送數據時,在 USART中斷處理函數中把發送中斷關閉,只在開始發送時才打開;接收同理
-
單片機
+關注
關注
6061文章
44866瀏覽量
645972 -
mcu
+關注
關注
146文章
17802瀏覽量
359524 -
嵌入式
+關注
關注
5133文章
19500瀏覽量
314183 -
開發板
+關注
關注
25文章
5471瀏覽量
101695 -
USART
+關注
關注
1文章
198瀏覽量
31573
發布評論請先 登錄
GD32 MCU 入門教程】GD32 MCU 常見外設介紹(12)FMC 模塊介紹

《GD32 MCU原理及固件庫開發指南》 + 初讀感悟
兆易創新GD32 MCU選型手冊,適用于GD32全系列MCU
【GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(1)使用Keil開發GD32

【GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(2)使用 IAR 開發 GD32

【GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(3)使用 Embedded Builder 開發 GD32

【GD32 MCU 入門教程】二、GD32 MCU 燒錄說明(1)ISP 燒錄

【GD32 MCU 入門教程】GD32 MCU 常見外設介紹(14)RTC 模塊介紹

【GD32 MCU入門教程】GD32 MCU GPIO 結構與使用注意事項

評論