USART介紹
通用同步異步收發(fā)器(USART)提供了一種靈活的方法與使用工業(yè)標(biāo)準(zhǔn)NRZ異步串行數(shù)據(jù)格式的外部設(shè)備之間進行全雙工數(shù)據(jù)交換。USART利用分數(shù)波特率發(fā)生器提供寬范圍的波特率選擇。它支持同步單向通信和半雙工單線通信,也支持LIN(局部互連網(wǎng)),智能卡協(xié)議和IrDA(紅外數(shù)據(jù)組織)SIRENDEC規(guī)范,以及調(diào)制解調(diào)器(CTS/RTS)操作。它還允許多處理器通信。使用多緩沖器配置的DMA方式,可以實現(xiàn)高速數(shù)據(jù)通信。
USART主要特性
全雙工的,異步通信
NRZ標(biāo)準(zhǔn)格式
分數(shù)波特率發(fā)生器系統(tǒng)
—發(fā)送和接收共用的可編程波特率,最高達4.5Mbits/s
可編程數(shù)據(jù)字長度(8位或9位)
可配置的停止位-支持1或2個停止位
LIN主發(fā)送同步斷開符的能力以及LIN從檢測斷開符的能力
—當(dāng)USART硬件配置成LIN時,生成13位斷開符;檢測10/11位斷開符
發(fā)送方為同步傳輸提供時鐘
IRDA SIR編碼器解碼器
—在正常模式下支持3/16位的持續(xù)時間
模擬智能卡功能
—智能卡接口支持ISO7816-3標(biāo)準(zhǔn)里定義的異步智能卡協(xié)議
—智能卡用到的0.5和1.5個停止位
單線半雙工通信
可配置的使用DMA的多緩沖器通信
—在SRAM里利用集中式DMA緩沖接收/發(fā)送字節(jié)
單獨的發(fā)送器和接收器使能位
檢測標(biāo)志
—接收緩沖器滿
—發(fā)送緩沖器空
—傳輸結(jié)束標(biāo)志
校驗控制
—發(fā)送校驗位
—對接收數(shù)據(jù)進行校驗
四個錯誤檢測標(biāo)
—溢出錯誤
—噪音錯誤
—幀錯誤
—校驗錯誤
10個帶標(biāo)志的中斷源
—CTS改變
—LIN斷開符檢測
—發(fā)送數(shù)據(jù)寄存器空
—發(fā)送完成
—接收數(shù)據(jù)寄存器滿
—檢測到總線為空閑
—溢出錯誤
—幀錯誤
—噪音錯誤
—校驗錯誤
多處理器通信--如果地址不匹配,則進入靜默模式
從靜默模式中喚醒(通過空閑總線檢測或地址標(biāo)志檢測)
兩種喚醒接收器的方式:地址位(MSB,第9位),總線空閑
USART功能概述
任何USART雙向通信至少需要兩個腳:接收數(shù)據(jù)輸入(RX)和發(fā)送數(shù)據(jù)輸出(TX)。RX:接收數(shù)據(jù)串行輸。通過過采樣技術(shù)來區(qū)別數(shù)據(jù)和噪音,從而恢復(fù)數(shù)據(jù)。
TX:發(fā)送數(shù)據(jù)輸出。當(dāng)發(fā)送器被禁止時,輸出引腳恢復(fù)到它的I/O端口配置。當(dāng)發(fā)送器被激活,并且不發(fā)送數(shù)據(jù)時,TX引腳處于高電平。
1、字符發(fā)送
在USART發(fā)送期間,在TX引腳上首先移出數(shù)據(jù)的最低有效位。在此模式里,USART_DR寄存器包含了一個內(nèi)部總線和發(fā)送移位寄存器之間的緩沖器。
每個字符之前都有一個低電平的起始位;之后跟著的停止位,其數(shù)目可配置。USART支持多種停止位的配置:0.5、1、1.5和2個停止位。
配置步驟:
通過在USART_CR1寄存器上置位UE位來激活USART
編程USART_CR1的M位來定義字長。
在USART_CR2中編程停止位的位數(shù)。
如果采用多緩沖器通信,配置USART_CR3中的DMA使能位(DMAT)。按多緩沖器通信中的描述配置DMA寄存器。
利用USART_BRR寄存器選擇要求的波特率。
設(shè)置USART_CR1中的TE位,發(fā)送一個空閑幀作為第一次數(shù)據(jù)發(fā)送。
把要發(fā)送的數(shù)據(jù)寫進USART_DR寄存器(此動作清除TXE位)。在只有一個緩沖器的情況下,對每個待發(fā)送的數(shù)據(jù)重復(fù)步驟7。
在USART_DR寄存器中寫入最后一個數(shù)據(jù)字后,要等待TC=1,它表示最后一個數(shù)據(jù)幀的傳輸結(jié)束。當(dāng)需要關(guān)閉USART或需要進入停機模式之前,需要確認傳輸結(jié)束,避免破壞最后一次傳輸。
2、字符接收
在USART接收期間,數(shù)據(jù)的最低有效位首先從RX腳移進。在此模式里,USART_DR寄存器包含的緩沖器位于內(nèi)部總線和接收移位寄存器之間。
配置步驟:
將USART_CR1寄存器的UE置1來激活USART。
編程USART_CR1的M位定義字長
在USART_CR2中編寫停止位的個數(shù)
如果需多緩沖器通信,選擇USART_CR3中的DMA使能位(DMAR)。按多緩沖器通信所要求的配置DMA寄存器。
利用波特率寄存器USART_BRR選擇希望的波特率。
設(shè)置USART_CR1的RE位。激活接收器,使它開始尋找起始位。
當(dāng)一字符被接收到時
RXNE位被置位。它表明移位寄存器的內(nèi)容被轉(zhuǎn)移到RDR。換句話說,數(shù)據(jù)已經(jīng)被接收并且可以被讀出(包括與之有關(guān)的錯誤標(biāo)志);
如果RXNEIE位被設(shè)置,產(chǎn)生中斷;
在接收期間如果檢測到幀錯誤,噪音或溢出錯誤,錯誤標(biāo)志將被置起;
在多緩沖器通信時,RXNE在每個字節(jié)接收后被置起,并由DMA對數(shù)據(jù)寄存器的讀操作而清零;
在單緩沖器模式里,由軟件讀USART_DR寄存器完成對RXNE位清除。RXNE標(biāo)志也可以通過對它寫0來清除。RXNE位必須在下一字符接收結(jié)束前被清零,以避免溢出錯誤。
USART程序編寫
開啟GPIO、USART1時鐘;
對USART引腳進行配置,PA9映射TX,PA10映射RX;
對USART參數(shù)進行配置、開啟USART的RXNE中斷;
對中斷參數(shù)進行配置;
/*******************************************************************************
* Function Name : USART_Configuration
* Description : Configure USART1
* Input : None
* Output : None
* Return : None
* Attention : None
*******************************************************************************/
void CKS_USART_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);
/*USART1_TX -> PA9 , USART1_RX -> PA10*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* USART configuration ------------------------------------------------------*/
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
/* Enable USART RXNE interrupt */
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_Cmd(USART1, ENABLE);
/* NVIC configuration ------------------------------------------------------*/
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
5. 編寫USART1_IRQHandler函數(shù);
我們利用USART的IDLE狀態(tài)位進行不定長度數(shù)據(jù)接收,當(dāng)USART被RXNE中斷觸發(fā)后,程序?qū)⒃谠撝袛嗪瘮?shù)中輪詢,直至串口空閑后IDLE狀態(tài)位被置位。
/*******************************************************************************
* Function Name : USART1_IRQHandler
* Description : This function handles USART1 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void USART1_IRQHandler(void)
{
uint8_t i = 0;
uint8_t j = 0;
if(USART_GetFlagStatus(USART1, USART_IT_RXNE) != RESET)
{
/* get usart data until IDLE flag is set */
while(!USART_GetFlagStatus(USART1, USART_FLAG_IDLE))
{
if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
{
CKS_Uart_Buff[i++] = USART_ReceiveData(USART1);
}
}
/* clear uart IDLE flag */
j = USART1->SR;
j = USART1->DR;
/* clear uart RXNE flag */
USART_ClearFlag(USART1, USART_IT_RXNE);
}
}
-
收發(fā)器
+關(guān)注
關(guān)注
10文章
3534瀏覽量
106750 -
異步通信
+關(guān)注
關(guān)注
1文章
58瀏覽量
10248 -
USART
+關(guān)注
關(guān)注
1文章
198瀏覽量
31342 -
發(fā)送器
+關(guān)注
關(guān)注
1文章
261瀏覽量
27014
原文標(biāo)題:MCU微課堂|CKS32F107xx USART(一)
文章出處:【微信號:中科芯MCU,微信公眾號:中科芯MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
基于CKS32F4xx系列的MCU互補PWM方案

利用CKS32F107xx系列RTC的鬧鐘實驗
CKS32F4xx系列產(chǎn)品串口DMA傳輸
CKS32F4xx系列RNG功能設(shè)置

CKS32F4xx系列FSMC功能簡介

CKS32F107xx系列時鐘系統(tǒng)具體配置方法講解

CKS32F107xx系列MCU中ADC介紹
CKS32F107xx系列MCU的GPIO內(nèi)部硬件結(jié)構(gòu)和工作模式

詳解CKS32F107xx系列的定時器同步功能

評論