通用異步收發(fā)器(Universal Asynchronous Receiver/Transmitter:UART),是一種通用串行數(shù)據(jù)總線,常用于系統(tǒng)內(nèi)各子模塊間的數(shù)據(jù)交換。
以CW32L083為例,CW32L083 內(nèi)部集成 6 個(gè)通用異步收發(fā)器 (UART),支持異步全雙工、同步半雙工和單線半雙工模式,支持硬件數(shù)據(jù)流控和多機(jī)通信;可編程數(shù)據(jù)幀結(jié)構(gòu),可以通過(guò)小數(shù)波特率發(fā)生器提供寬范圍的波特率選擇。UART 控制器工作在雙時(shí)鐘域下,允許在深度休眠模式下進(jìn)行數(shù)據(jù)的接收,接收完成中斷可以喚醒 MCU 回到運(yùn)行模式。
一、主要功能
? 支持雙時(shí)鐘域驅(qū)動(dòng):配置時(shí)鐘 PCLK;傳輸時(shí)鐘 UCLK。
? 可編程數(shù)據(jù)幀結(jié)構(gòu):數(shù)據(jù)字長(zhǎng):8、9 位,LSB 在前;校驗(yàn)位:無(wú)校驗(yàn)、奇校驗(yàn)、偶校驗(yàn);停止位長(zhǎng)度:1、1.5、2 位 。
? 16 位整數(shù)、4 位小數(shù)波特率發(fā)生器 。
? 支持異步全雙工、同步半雙工、單線半雙工 。
? 支持硬件流控 RTS、CTS。
? 支持直接內(nèi)存訪問(wèn) (DMA) 。
? 支持多機(jī)通信,自動(dòng)地址識(shí)別 。
? 6 個(gè)帶中斷標(biāo)志的中斷源 。
? 錯(cuò)誤檢測(cè):奇偶校驗(yàn)錯(cuò)誤、幀結(jié)構(gòu)錯(cuò)誤 。
? 低功耗模式下收發(fā)數(shù)據(jù),中斷喚醒 MCU。
1.功能框圖
UART 控制器掛載到 APB 總線上,配置時(shí)鐘域 PCLK,固定為 APB 總線時(shí)鐘 PCLK,用于寄存器配置邏輯工作;傳輸時(shí)鐘域 UCLK,用于數(shù)據(jù)收發(fā)邏輯工作,其來(lái)源可選擇 PCLK 時(shí)鐘、外部低速時(shí)鐘(LSE)以及內(nèi)部低速時(shí)鐘 (LSI)。雙時(shí)鐘域的設(shè)計(jì)更便于波特率的設(shè)置,支持從深度休眠模式下喚醒控制器。
2.UART中斷
UART 控制器支持 6 個(gè)中斷源,當(dāng) UART 中斷觸發(fā)事件發(fā)生時(shí),中斷標(biāo)志位會(huì)被硬件置位,如果設(shè)置了對(duì)應(yīng)的中斷使能控制位,將產(chǎn)生中斷請(qǐng)求。CW32L083 的一個(gè) UART 模塊使用一個(gè)系統(tǒng) UART 中斷,UART 中斷是否產(chǎn)生中斷跳轉(zhuǎn)由嵌套向量中斷控 制器 (NVIC) 的中斷使能設(shè)置寄存器 NVIC_ISER 的相應(yīng)位控制。系統(tǒng) UART 中斷示意圖如下圖所示:
在用戶 UART 中斷服務(wù)程序中,應(yīng)查詢相關(guān) UART 中斷標(biāo)志位,以進(jìn)行相應(yīng)的處理,在退出中斷服務(wù)程序之前, 要清除該中斷標(biāo)志位,避免重復(fù)進(jìn)入中斷程序。各 UART 中斷源的標(biāo)志位、中斷使能位、中斷標(biāo)志清除位或清除方法,如下表所示:
3.CH340介紹
CH340是一個(gè)USB總線的轉(zhuǎn)接芯片,實(shí)現(xiàn)USB協(xié)議和UART協(xié)議的自動(dòng)轉(zhuǎn)換。
RTS#:MODEM聯(lián)絡(luò)輸出信號(hào),請(qǐng)求發(fā)送
UD+:直接連接USB總線的D+數(shù)據(jù)線
UD-:直接連接USB總線的D-數(shù)據(jù)線
V3:在3.3V電源電壓時(shí)鏈接VCC輸入外部電源,在5V電源電壓時(shí)外接容量為100nF的退耦電容。
VCC:正電源輸入端,需要接100nF電源退耦電容
TXD:串行電路輸出
RXD:串行數(shù)據(jù)輸入,內(nèi)置可控上拉和下拉電阻
CH340內(nèi)置了獨(dú)立的收發(fā)緩沖區(qū),支持單工、半雙工或者全雙工異步串行通訊。串行數(shù)據(jù)包括1個(gè)低電平起始位、5、6、7或8個(gè)數(shù)據(jù)位、1個(gè)或2個(gè)高電平停止位,支持奇校驗(yàn)/偶校驗(yàn)/標(biāo)志校驗(yàn)/空白校驗(yàn)。CH340支持常用通訊波特率:50、75、100、110、134.5、150、300、600、900、1200、1800、2400、3600、4800、9600、14400、19200、28800、33600、38400、56000、57600、76800、115200、128000、153600、230400、460800、921600、1500000、2000000等。串口發(fā)送信號(hào)的波特率誤差小于0.3%,串口接收信號(hào)的允許波特率誤差不小于2%。
二、實(shí)例演示
本實(shí)例采用CW32L083V8T6的StartKit單板,MCU的串口引腳(PA08/ PA09)和CH340對(duì)接,CH340通過(guò)USB接口和PC機(jī)對(duì)接,實(shí)現(xiàn)PC機(jī)軟件和MCU通過(guò)UART雙向通信功能。
單板啟動(dòng)后,處于等待數(shù)據(jù)接收狀態(tài),當(dāng)有數(shù)據(jù)接收到后,產(chǎn)生UART接收中斷,在中斷中讀取接收到的數(shù)據(jù),然后將數(shù)據(jù)通過(guò)UART再發(fā)送回來(lái),并清除中斷標(biāo)志位,然后等待接收下一個(gè)數(shù)據(jù)。
1.配置RCC系統(tǒng)時(shí)鐘
voidRCC_Configuration(void) { //SYSCLK=HSI=8MHz=HCLK=PCLK RCC_HSI_Enable(RCC_HSIOSC_DIV6); //外設(shè)時(shí)鐘使能 RCC_AHBPeriphClk_Enable(DEBUG_UART_GPIO_CLK,ENABLE); DEBUG_UART_APBClkENx(DEBUG_UART_CLK,ENABLE); }
2.GPIO配置
voidGPIO_Configuration(void) { GPIO_InitTypeDefGPIO_InitStructure={0}; //UARTTXRX復(fù)用 DEBUG_UART_AFTX; DEBUG_UART_AFRX; GPIO_InitStructure.Pins=DEBUG_UART_TX_GPIO_PIN; GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP; GPIO_Init(DEBUG_UART_TX_GPIO_PORT, GPIO_InitStructure); GPIO_InitStructure.Pins=DEBUG_UART_RX_GPIO_PIN; GPIO_InitStructure.Mode=GPIO_MODE_INPUT_PULLUP; GPIO_Init(DEBUG_UART_RX_GPIO_PORT, GPIO_InitStructure); }
3.UART配置
voidUART_Configuration(void) { UART_InitTypeDefUART_InitStructure={0}; UART_InitStructure.UART_BaudRate=DEBUG_UART_BaudRate; UART_InitStructure.UART_Over=UART_Over_16; UART_InitStructure.UART_Source=UART_Source_PCLK; UART_InitStructure.UART_UclkFreq=DEBUG_UART_UclkFreq; UART_InitStructure.UART_StartBit=UART_StartBit_FE; UART_InitStructure.UART_StopBits=UART_StopBits_1; UART_InitStructure.UART_Parity=UART_Parity_No; UART_InitStructure.UART_HardwareFlowControl=UART_HardwareFlowControl_None; UART_InitStructure.UART_Mode=UART_Mode_Rx|UART_Mode_Tx; UART_Init(DEBUG_UARTx, UART_InitStructure); }
4.配置NVIC
voidNVIC_Configuration(void) { //優(yōu)先級(jí),無(wú)優(yōu)先級(jí)分組 NVIC_SetPriority(DEBUG_UART_IRQ,0); //UARTx中斷使能 NVIC_EnableIRQ(DEBUG_UART_IRQ); }
5.中斷函數(shù)處理UART2/UART5
voidUART2_UART5_IRQHandler(void) { /*USERCODEBEGIN*/ uint8_tTxRxBuffer; if(UART_GetITStatus(CW_UART5UART_IT_RC)!=RESET)//獲取UARTx中斷標(biāo)志位 { TxRxBuffer=UART_ReceiveData_8bit(CW_UART5;//通過(guò)UARTx接收一個(gè)數(shù)據(jù)(8bit) UART_SendData_8bit(CW_UART5TxRxBuffer);//通過(guò)UARTx發(fā)送一個(gè)數(shù)據(jù)(8bit) UART_ClearITPendingBit(CW_UART5UART_IT_RC);//清除UARTx中斷標(biāo)志位 } /*USERCODEEND*/ }
6.定義常量define
//UARTx #defineDEBUG_UARTxCW_UART5 #defineDEBUG_UART_CLKRCC_APB1_PERIPH_UART5 #defineDEBUG_UART_APBClkENxRCC_APBPeriphClk_Enable1 #defineDEBUG_UART_BaudRate9600 #defineDEBUG_UART_UclkFreq8000000 //UARTxGPIO #defineDEBUG_UART_GPIO_CLKRCC_AHB_PERIPH_GPIOB #defineDEBUG_UART_TX_GPIO_PORTCW_GPIOB #defineDEBUG_UART_TX_GPIO_PINGPIO_PIN_8 #defineDEBUG_UART_RX_GPIO_PORTCW_GPIOB #defineDEBUG_UART_RX_GPIO_PINGPIO_PIN_9 //GPIOAF #defineDEBUG_UART_AFTXPB08_AFx_UART5TXD() #defineDEBUG_UART_AFRXPB09_AFx_UART5RXD() //中斷 #defineDEBUG_UART_IRQUART2_UART5_IRQn
7.UART中斷方式接收數(shù)據(jù)
int32_tmain(void) { //配置RCC RCC_Configuration(); //配置GPIO GPIO_Configuration(); //配置UART UART_Configuration(); //配置NVIC NVIC_Configuration(); //使能UARTxRC中斷 UART_ITConfig(DEBUG_UARTx,UART_IT_RC,ENABLE); UART_SendString(DEBUG_UARTx,"rnCW32L083UARTInterruptrn"); while(1) { //中斷收發(fā) } }
8、測(cè)試結(jié)果如下:當(dāng)MCU收到上位機(jī)發(fā)送的數(shù)據(jù)后,再回傳到上位機(jī),UART功能正常。
來(lái)源:武漢芯源半導(dǎo)體
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問(wèn)題,請(qǐng)聯(lián)系小編進(jìn)行處理
審核編輯 黃宇
-
單片機(jī)
+關(guān)注
關(guān)注
6037文章
44558瀏覽量
635309 -
總線
+關(guān)注
關(guān)注
10文章
2881瀏覽量
88085 -
uart
+關(guān)注
關(guān)注
22文章
1235瀏覽量
101395 -
數(shù)據(jù)收發(fā)
+關(guān)注
關(guān)注
0文章
8瀏覽量
7764
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論