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

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

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

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

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

異步通信:是指發(fā)送和接收端使用各自的時鐘,并且它是一種不連續(xù)傳輸?shù)耐ㄐ欧绞剑淮瓮ㄐ胖粋饕粋€字符數(shù)據(jù),稱為字符幀。字符幀之間的間隙可以是任意間隙。它的幀格式如圖所示:

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

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

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

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

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

5.10.4.軟件配置說明
本小節(jié)講解USART_Example歷程中USART模塊的配置說明,主要包括外設(shè)時鐘配置、GPIO引腳 配置、USART外設(shè)配置、主函數(shù)介紹以及運(yùn)行結(jié)果。本例程主要介紹GD32 MCU各系列USART 模塊的輪詢發(fā)送中斷接收,有關(guān)USART其他功能例程可參考各系列固件庫歷程。 USART 外設(shè)配置
USART外設(shè)配置如代碼清單USART例程USART外設(shè)配置所示。首先是對各項外設(shè)時鐘初始化,接著初始化GPIO:GD32F10X、GD32F30X、GD32F20X、GD32E10X系列GPIO配置相同,PA9配置為復(fù)用推挽輸出;PA10需配置為浮空輸入。GD32F1X0、GD32F4XX、GD32F3X0、GD32E23X系列GPIO配置基本相同,不同在于PA9/PA10引腳的AF復(fù)用功能配置不同,在GD32F1X0、GD32F3X0和GD32E23X上,需要配置為AF1模式,在GD32F4XX上需要配置為AF7模式。然后配置USART接收中斷優(yōu)先級分組。最后配置USART初始化:GD32全系列MCU中USART外設(shè)配置基本相同,在本例程中,USART既可以發(fā)送可以接收,GD32標(biāo)準(zhǔn)庫提供了USART各項初始化的函數(shù)接口,其初始化函數(shù)接口說明如USART函數(shù)說明列表所示。因USART使用了C函數(shù)的printf函數(shù),所以重定向了printf到USART,還得在KEIL的魔術(shù)棒Target配置下打開” Use MicroLIB”。
代碼清單 USART 例程 USART 外設(shè)配置
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 函數(shù)說明列表

中斷函數(shù)
中斷函數(shù)如代碼清單 USART 中斷函數(shù)所示,GD32 所有函數(shù)中斷接收函數(shù)相同:先檢測 USART_INT_FLAG_RBNE 置 1 時,執(zhí)行數(shù)據(jù)接收,當(dāng)數(shù)據(jù)接收到設(shè)定的位數(shù)后,關(guān)閉 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); } } }
主函數(shù)說明 主函數(shù)如代碼清單USART例程主函數(shù)所示,該主函數(shù)主要分成三個部分,USART初始化、USART 輪詢發(fā)送 buffer 、 開啟中斷接收 buffer 當(dāng) 數(shù) 據(jù) 接 收 完 成 時 執(zhí) 行 printf 打 印函數(shù):printf("\n\rUSART receive successfully!\n\r");。
int main(void) { usart_init(); printf("GD32 WELCOME"); while(txcount
運(yùn)行結(jié)果 將USART_Example例程按照對應(yīng)的芯片工程編譯完成后,下載到對應(yīng)芯片中,采用USB轉(zhuǎn)USART連接電腦,使用串口助手,可查看MCU發(fā)送的結(jié)果,電腦發(fā)送數(shù)據(jù)MCU返回的結(jié)果。
具體可如下圖USART運(yùn)行結(jié)果所示。

10.5.USART 使用注意事項
(1) 使用 USART,收發(fā)都是 DMA 方式,由于接受數(shù)據(jù)幀長度不固定,可以采用 USART Receive timeout 標(biāo)志作為 USART DMA 接收完成標(biāo)志,采用 TC 作為 USART DMA 發(fā)送完成標(biāo)志。
(2) USART 只要發(fā)送寄存器為空,就會一直有中斷,因此,要是不發(fā)送數(shù)據(jù)時,在 USART中斷處理函數(shù)中把發(fā)送中斷關(guān)閉,只在開始發(fā)送時才打開;接收同理
本教程由GD32 MCU方案商聚沃科技原創(chuàng)發(fā)布,了解更多GD32 MCU教程,關(guān)注聚沃科技官網(wǎng)
-
單片機(jī)
+關(guān)注
關(guān)注
6043文章
44622瀏覽量
638533 -
mcu
+關(guān)注
關(guān)注
146文章
17317瀏覽量
352640 -
嵌入式
+關(guān)注
關(guān)注
5092文章
19177瀏覽量
307663 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5121瀏覽量
98194 -
USART
+關(guān)注
關(guān)注
1文章
195瀏覽量
30968
發(fā)布評論請先 登錄
相關(guān)推薦
GD32 MCU 入門教程】GD32 MCU 常見外設(shè)介紹(12)FMC 模塊介紹

GD32的MCU介紹
《GD32 MCU原理及固件庫開發(fā)指南》 + 初讀感悟
《GD32 MCU原理及固件庫開發(fā)指南》+讀后感
兆易創(chuàng)新GD32 MCU選型手冊,適用于GD32全系列MCU
不同型號的GD32 MCU如何區(qū)分?

【GD32 MCU 入門教程】一、GD32 MCU 開發(fā)環(huán)境搭建(1)使用Keil開發(fā)GD32

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

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

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

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

【GD32 MCU入門教程】GD32 MCU GPIO 結(jié)構(gòu)與使用注意事項

評論