通用同步異步收發(fā)器(USART) 提供了一個靈活方便的串行數(shù)據(jù)交換接口,數(shù)據(jù)幀可以通過全雙工或半雙工,同步或異步的方式進行傳輸。 USART提供了可編程的波特率發(fā)生器,能對UCLK(PCLK1或PCLK2) 進行分頻產(chǎn)生USART發(fā)送和接收所需的特定頻率。
USART不僅支持標準的異步收發(fā)模式,還實現(xiàn)了一些其他類型的串行數(shù)據(jù)交換模式,如紅外編碼規(guī)范, SIR,智能卡協(xié)議, LIN, 半雙工以及同步模式。它還支持多處理器通信和Modem流控操作(CTS/RTS)。數(shù)據(jù)幀支持從LSB或者MSB開始傳輸。數(shù)據(jù)位的極性和TX/RX引腳都可以靈活配置。部分USART支持DMA功能,以實現(xiàn)高速率的數(shù)據(jù)通信,支持情況根據(jù)不同芯片型號而定。
10.1.USART 基礎知識
通信方式的分類:并行通信、串行通信
- 并行通信:是指數(shù)據(jù)的各位同時在多根數(shù)據(jù)線上發(fā)送或接收,如圖所示。
并行通信的特點:控制簡單,傳輸速度快;由于傳輸線多,適用于距離近傳輸。
- 串行通信:是數(shù)據(jù)的各位在同一根數(shù)據(jù)線上依次逐位發(fā)送或接收,如圖所示
串行通信的特點:控制復雜,傳輸速度較慢;只需要一根線,適用于遠距離傳輸。
串行通信方式的分類
在串行通信中,根據(jù)對數(shù)據(jù)流的分界、定時及同步方法不同,可以分為同步串行通信方式和異步串行通信方式。
同步通信:發(fā)送端和接收端必須使用統(tǒng)一時鐘,它是一種連續(xù)傳送數(shù)據(jù)的通信方式,一次通信傳送多個字符數(shù)據(jù),稱為一幀信息。幀格式如圖所示:
同步串行通信幀:是將許多字符組成一個信息幀,這樣字符可以一個接一個的傳輸,但是,在每幀信息的開始要加上同步字符,在沒有信息要傳輸時,要填上空字符,因為同步傳輸不允許有間 隙。
同步串行通信特點:必須有同步時鐘,傳輸信息量大,傳輸速率高,但是傳輸設備復雜,技術(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)。當發(fā)送端要發(fā)送1個字符數(shù)據(jù)時,首先發(fā)送一個邏輯“0”信號,這個低電平就是幀格式的起始位。其作用就是告訴接收端開始發(fā)送一幀數(shù)據(jù)。接收端檢測到這個低電平后,就準備接收數(shù)據(jù)信號。
數(shù)據(jù)位:在起始位之后,發(fā)送端發(fā)出的就是數(shù)據(jù)位,數(shù)據(jù)位的位數(shù)沒有嚴格限制5~9位都行。低位在前,高位在后,由低位到高位逐位傳送。USART一般是8位。
校驗位:數(shù)據(jù)位發(fā)送完成之后,可發(fā)送一位用來檢驗數(shù)據(jù)在傳送過程中是否出錯的奇偶校驗位。奇偶校驗是收發(fā)雙方預先約定好的有限差錯檢驗方式之一。有時也可以無校驗。
停止位:字符幀格式的最后部分是停止位,邏輯“1”電平有效,它可占1/2位、1位、1.5位或2位。停止位表示傳送一幀信息的結(jié)束,也為發(fā)送下一幀信息做好準備。
異步串行通信特點:不需要時鐘同步,通信實現(xiàn)簡單,設備開銷小。但是傳輸速率不高。
串行通信數(shù)據(jù)傳送方向
根據(jù)串行數(shù)據(jù)的傳輸方向,我們可以將通信分為單工、半雙工、全雙工。
單工:是指數(shù)據(jù)傳輸僅能沿一個方向,不能實現(xiàn)反向傳輸。
半雙工:是指數(shù)據(jù)傳輸可以沿兩個方向,但需要分時進行傳輸。
全雙工:是指數(shù)據(jù)可以同時進行雙向傳輸。
串行通信數(shù)據(jù)的傳輸方向
10.2.GD32 USART 外設原理簡介
GD32芯片具有多個USART外設用于串口通訊,它是 Universal Synchronous Asynchronous Receiver and Transmitter的縮寫,即通用同步異步收發(fā)器可以靈活地與外部設備進行全雙工數(shù)據(jù) 交換。有別于USART,它還有具有UART外設(Universal Asynchronous Receiver and Transmitter),它是在USART基礎上裁剪掉了同步通信功能,只有異步通信。簡單區(qū)分同步和異步就是看通信時需不需要對外提供時鐘輸出。
因篇幅有限,本文無法詳細介紹GD32所有系列USART外設接口,下面以GD32F30x為列,著重介紹下GD32F30x的USART外設簡介和結(jié)構(gòu)框圖,后介紹下各個系列的差異。
GD32 USART 主要特性
? NRZ標準格式(Mark/Space)。
? 全雙工異步通信。
? 可編程的波特率產(chǎn)生器:
– 由外設時鐘分頻產(chǎn)生,其中USART0由PCLK2分頻得到,USART1/2和UART3/4由PCLK1分頻得到;
– 16倍過采樣;
– 當時鐘頻率為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)換。
? 多處理器通信:
– 如果地址不匹配,則進入靜默模式;
– 通過線路空閑檢測或者地址掩碼檢測從靜默模式喚醒。
? 多種狀態(tài)標志:
– 傳輸檢測標志:接收緩沖區(qū)不為空(RBNE),發(fā)送緩沖區(qū)為空(TBE),傳輸完成(TC),忙(BSY);
– 錯誤檢測標志:過載錯誤(ORERR),噪聲錯誤(NERR),幀格式錯誤(FERR),奇偶校驗錯誤(PERR);
– 硬件流控操作標志:CTS變化(CTSF);
– LIN模式標志:LIN斷開檢測(LBDF);
– 多處理器通信模式標志:IDLE幀檢測(IDLEF);
– 智能卡模式標志:塊結(jié)束(EBF)和接收超時(RTF);
– 若相應的中斷使能,這些事件發(fā)生將會觸發(fā)中斷。
USART0/1/2完全實現(xiàn)上述功能,但是UART3/4只實現(xiàn)了上面所介紹的部分功能,下面這些功能在UART3/4中沒有實現(xiàn):
? 智能卡模式;
? 同步模式;
? 硬件流操作(CTS/RTS);
? 設置數(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流控制,當USART接收器準備好接收新數(shù)據(jù)時就會將nRTS變成低電平;當接收寄存器已滿時,nRTS將被設置為高電平。該引腳只適用于硬件流控制。
nCTS:清除以發(fā)送(Clear To Send),n表示低電平有效。如果使能CTS流控制,發(fā)送器在發(fā)送下一幀數(shù)據(jù)之前會檢測nCTS引腳,如果為低電平,表示可以發(fā)送數(shù)據(jù),如果為高電平則在發(fā)送完當前數(shù)據(jù)幀之后停止發(fā)送。該引腳只適用于硬件流控制。
CK:發(fā)送器時鐘輸出引腳。這個引腳僅適用于同步模式。具體各系列USART引腳對應,可見相應的Datasheet。
波特率發(fā)生器:如圖 0-36 USART結(jié)構(gòu)框圖的②所示,波特率分頻系數(shù)是一個16位的數(shù)字,包含12位整數(shù)部分和4位小數(shù)部分。波特率發(fā)生器使用這兩部分組合所得的數(shù)值來確定波特率。由于具有小數(shù)部分的波特率分頻系數(shù),將使USART能夠產(chǎ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位設置,當WL位為0時表示8位數(shù)據(jù)字長,當WL位為1表示9位數(shù)據(jù)字長,我們一般使用8位數(shù)據(jù)字長。USART_DATA包含了已發(fā)送的數(shù)據(jù)或者接收到的數(shù)據(jù)。USART_DATA實際是包含了兩個寄存器,一個專門用于發(fā)送的可寫TDATA,一個專門用于接收的可讀RDATA。當進行發(fā)送操作時,往USART_DATA寫入數(shù)據(jù)會自動存儲在TDATA內(nèi);當進行讀取操作時,向USART_DATA讀取數(shù)據(jù)會自動提取RDATA數(shù)據(jù)。
TDATA和RDATA都是介于系統(tǒng)總線和移位寄存器之間。串行通信是一個位一個位傳輸?shù)?,發(fā)送時把TDATA內(nèi)容轉(zhuǎn)移到發(fā)送移位寄存器,然后把移位寄存器數(shù)據(jù)每一位發(fā)送出去,接收時把接收到的每一位順序保存在接收移位寄存器內(nèi)然后才轉(zhuǎn)移到RDATA。
USART支持DMA傳輸,可以實現(xiàn)高速數(shù)據(jù)傳輸。
校驗控制:GD32系列控制器USART支持奇偶校驗。當使用校驗位時,串口傳輸?shù)拈L度將是8位的數(shù)據(jù)幀加上1位的校驗位總共9位,此時USART_CTL0寄存器的WL位需要設置為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外設各系列功能差異如GD32各系列MCU USART外設功能差異表所示。
GD32 各系列 MCU USART 外設功能差異表
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)打印機接口,我們使用其USB轉(zhuǎn)USART功能。具體電路設計見下圖USB轉(zhuǎn)串口硬件設計。
我們將CH340G的TXD引腳與USART的RX引腳連接,CH340G的RXD引腳與USART的TX引腳連接。
5.10.4.軟件配置說明
本小節(jié)講解USART_Example歷程中USART模塊的配置說明,主要包括外設時鐘配置、GPIO引腳 配置、USART外設配置、主函數(shù)介紹以及運行結(jié)果。本例程主要介紹GD32 MCU各系列USART 模塊的輪詢發(fā)送中斷接收,有關(guān)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接收中斷優(yōu)先級分組。最后配置USART初始化:GD32全系列MCU中USART外設配置基本相同,在本例程中,USART既可以發(fā)送可以接收,GD32標準庫提供了USART各項初始化的函數(shù)接口,其初始化函數(shù)接口說明如USART函數(shù)說明列表所示。因USART使用了C函數(shù)的printf函數(shù),所以重定向了printf到USART,還得在KEIL的魔術(shù)棒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 函數(shù)說明列表
中斷函數(shù)
中斷函數(shù)如代碼清單 USART 中斷函數(shù)所示,GD32 所有函數(shù)中斷接收函數(shù)相同:先檢測 USART_INT_FLAG_RBNE 置 1 時,執(zhí)行數(shù)據(jù)接收,當數(shù)據(jù)接收到設定的位數(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 當 數(shù) 據(jù) 接 收 完 成 時 執(zhí) 行 printf 打 印函數(shù):printf("\n\rUSART receive successfully!\n\r");。
int main(void) { usart_init(); printf("GD32 WELCOME"); while(txcount
運行結(jié)果 將USART_Example例程按照對應的芯片工程編譯完成后,下載到對應芯片中,采用USB轉(zhuǎn)USART連接電腦,使用串口助手,可查看MCU發(fā)送的結(jié)果,電腦發(fā)送數(shù)據(jù)MCU返回的結(jié)果。
具體可如下圖USART運行結(jié)果所示。
10.5.USART 使用注意事項
(1) 使用 USART,收發(fā)都是 DMA 方式,由于接受數(shù)據(jù)幀長度不固定,可以采用 USART Receive timeout 標志作為 USART DMA 接收完成標志,采用 TC 作為 USART DMA 發(fā)送完成標志。
(2) USART 只要發(fā)送寄存器為空,就會一直有中斷,因此,要是不發(fā)送數(shù)據(jù)時,在 USART中斷處理函數(shù)中把發(fā)送中斷關(guān)閉,只在開始發(fā)送時才打開;接收同理
本教程由GD32 MCU方案商聚沃科技原創(chuàng)發(fā)布,了解更多GD32 MCU教程,關(guān)注聚沃科技官網(wǎng)
-
單片機
+關(guān)注
關(guān)注
6030文章
44491瀏覽量
632005 -
mcu
+關(guān)注
關(guān)注
146文章
16894瀏覽量
349932 -
嵌入式
+關(guān)注
關(guān)注
5059文章
18975瀏覽量
302072 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
4898瀏覽量
97064 -
USART
+關(guān)注
關(guān)注
1文章
195瀏覽量
30763
發(fā)布評論請先 登錄
相關(guān)推薦
評論