USART介紹
通用同步異步收發器(USART)提供了一種靈活的方法與使用工業標準NRZ異步串行數據格式的外部設備之間進行全雙工數據交換。USART利用分數波特率發生器提供寬范圍的波特率選擇。它支持同步單向通信和半雙工單線通信,也支持LIN(局部互連網),智能卡協議和IrDA(紅外數據組織)SIRENDEC規范,以及調制解調器(CTS/RTS)操作。它還允許多處理器通信。使用多緩沖器配置的DMA方式,可以實現高速數據通信。
USART主要特性
全雙工的,異步通信
NRZ標準格式
分數波特率發生器系統
—發送和接收共用的可編程波特率,最高達4.5Mbits/s
可編程數據字長度(8位或9位)
可配置的停止位-支持1或2個停止位
LIN主發送同步斷開符的能力以及LIN從檢測斷開符的能力
—當USART硬件配置成LIN時,生成13位斷開符;檢測10/11位斷開符
發送方為同步傳輸提供時鐘
IRDA SIR編碼器解碼器
—在正常模式下支持3/16位的持續時間
模擬智能卡功能
—智能卡接口支持ISO7816-3標準里定義的異步智能卡協議
—智能卡用到的0.5和1.5個停止位
單線半雙工通信
可配置的使用DMA的多緩沖器通信
—在SRAM里利用集中式DMA緩沖接收/發送字節
單獨的發送器和接收器使能位
檢測標志
—接收緩沖器滿
—發送緩沖器空
—傳輸結束標志
校驗控制
—發送校驗位
—對接收數據進行校驗
四個錯誤檢測標
—溢出錯誤
—噪音錯誤
—幀錯誤
—校驗錯誤
10個帶標志的中斷源
—CTS改變
—LIN斷開符檢測
—發送數據寄存器空
—發送完成
—接收數據寄存器滿
—檢測到總線為空閑
—溢出錯誤
—幀錯誤
—噪音錯誤
—校驗錯誤
多處理器通信--如果地址不匹配,則進入靜默模式
從靜默模式中喚醒(通過空閑總線檢測或地址標志檢測)
兩種喚醒接收器的方式:地址位(MSB,第9位),總線空閑
USART功能概述
任何USART雙向通信至少需要兩個腳:接收數據輸入(RX)和發送數據輸出(TX)。RX:接收數據串行輸。通過過采樣技術來區別數據和噪音,從而恢復數據。
TX:發送數據輸出。當發送器被禁止時,輸出引腳恢復到它的I/O端口配置。當發送器被激活,并且不發送數據時,TX引腳處于高電平。
1、字符發送
在USART發送期間,在TX引腳上首先移出數據的最低有效位。在此模式里,USART_DR寄存器包含了一個內部總線和發送移位寄存器之間的緩沖器。
每個字符之前都有一個低電平的起始位;之后跟著的停止位,其數目可配置。USART支持多種停止位的配置:0.5、1、1.5和2個停止位。
配置步驟:
通過在USART_CR1寄存器上置位UE位來激活USART
編程USART_CR1的M位來定義字長。
在USART_CR2中編程停止位的位數。
如果采用多緩沖器通信,配置USART_CR3中的DMA使能位(DMAT)。按多緩沖器通信中的描述配置DMA寄存器。
利用USART_BRR寄存器選擇要求的波特率。
設置USART_CR1中的TE位,發送一個空閑幀作為第一次數據發送。
把要發送的數據寫進USART_DR寄存器(此動作清除TXE位)。在只有一個緩沖器的情況下,對每個待發送的數據重復步驟7。
在USART_DR寄存器中寫入最后一個數據字后,要等待TC=1,它表示最后一個數據幀的傳輸結束。當需要關閉USART或需要進入停機模式之前,需要確認傳輸結束,避免破壞最后一次傳輸。
2、字符接收
在USART接收期間,數據的最低有效位首先從RX腳移進。在此模式里,USART_DR寄存器包含的緩沖器位于內部總線和接收移位寄存器之間。
配置步驟:
將USART_CR1寄存器的UE置1來激活USART。
編程USART_CR1的M位定義字長
在USART_CR2中編寫停止位的個數
如果需多緩沖器通信,選擇USART_CR3中的DMA使能位(DMAR)。按多緩沖器通信所要求的配置DMA寄存器。
利用波特率寄存器USART_BRR選擇希望的波特率。
設置USART_CR1的RE位。激活接收器,使它開始尋找起始位。
當一字符被接收到時
RXNE位被置位。它表明移位寄存器的內容被轉移到RDR。換句話說,數據已經被接收并且可以被讀出(包括與之有關的錯誤標志);
如果RXNEIE位被設置,產生中斷;
在接收期間如果檢測到幀錯誤,噪音或溢出錯誤,錯誤標志將被置起;
在多緩沖器通信時,RXNE在每個字節接收后被置起,并由DMA對數據寄存器的讀操作而清零;
在單緩沖器模式里,由軟件讀USART_DR寄存器完成對RXNE位清除。RXNE標志也可以通過對它寫0來清除。RXNE位必須在下一字符接收結束前被清零,以避免溢出錯誤。
USART程序編寫
開啟GPIO、USART1時鐘;
對USART引腳進行配置,PA9映射TX,PA10映射RX;
對USART參數進行配置、開啟USART的RXNE中斷;
對中斷參數進行配置;
/*******************************************************************************
* 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函數;
我們利用USART的IDLE狀態位進行不定長度數據接收,當USART被RXNE中斷觸發后,程序將在該中斷函數中輪詢,直至串口空閑后IDLE狀態位被置位。
/*******************************************************************************
* 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);
}
}
-
收發器
+關注
關注
10文章
3624瀏覽量
107356 -
異步通信
+關注
關注
1文章
58瀏覽量
10298 -
USART
+關注
關注
1文章
200瀏覽量
31610 -
發送器
+關注
關注
1文章
261瀏覽量
27134
原文標題:MCU微課堂|CKS32F107xx USART(一)
文章出處:【微信號:中科芯MCU,微信公眾號:中科芯MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
基于CKS32F4xx系列的MCU互補PWM方案

利用CKS32F107xx系列RTC的鬧鐘實驗
CKS32F4xx系列產品串口DMA傳輸
CKS32F4xx系列RNG功能設置

CKS32F4xx系列FSMC功能簡介

CKS32F107xx系列MCU中ADC介紹
CKS32F107xx系列MCU的GPIO內部硬件結構和工作模式

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

評論