複製鏈接
請複製以下鏈接發送給好友

USART

鎖定
USART:(Universal Synchronous/Asynchronous Receiver/Transmitter)
通用同步/異步串行接收/發送器
USART是一個全雙工通用同步/異步串行收發模塊,該接口是一個高度靈活的串行通信設備。
中文名
USART
外文名
Universal Synchronous/Asynchronous Receiver/Transmitter
主要特點
支持同步和異步操作
結構組成
時鐘發生器、數據發送器和接收器
三大部分
時鐘發生器、數據發送器和接收器

USART主要特點

1. 全雙工操作(相互獨立的接收數據和發送數據);
2. 同步操作時,可主機時鐘同步,也可從機時鐘同步;
3. 獨立的高精度波特率發生器,不佔用定時/計數器;
4. 支持5、6、7、8和9位數據位,1或2位停止位的串行數據幀結構;
5. 由硬件支持的奇偶校驗位發生和檢驗;
6. 數據溢出檢測;
7. 幀錯誤檢測;
8. 包括錯誤起始位的檢測噪聲濾波器和數字低通濾波器;
9. 三個完全獨立的中斷,TX發送完成、TX發送數據寄存器空、RX接收完成;
10.支持多機通信模式;
11.支持倍速異步通信模式。

USART結構組成

USART收發模塊一般分為三大部分:時鐘發生器、數據發送器和接收器。控制寄存器為所有的模塊共享。
時鐘發生器由同步邏輯電路(在同步從模式下由外部時鐘輸入驅動)和波特率發生器組成。發送時鐘引腳XCK僅用於同步發送模式下,
發送器部分由一個單獨的寫入緩衝器(發送UDR)、一個串行移位寄存器、校驗位發生器和用於處理不同幀結構的控制邏輯電路構成。使用寫入緩衝器,實現了連續發送多幀數據無延時的通信。
接收器是USART模塊最複雜的部分,最主要的是時鐘和數據接收單元。數據接收單元用作異步數據的接收。除了接收單元,接收器還包括校驗位校驗器、控制邏輯、移位寄存器和兩級接收緩衝器(接收UDR)。接收器支持與發送器相同的幀結構,同時支持幀錯誤、數據溢出和校驗錯誤的檢測。
與UART兼容性
AVR USART 和AVR UART 兼容性 USART 在如下方面與AVR UART 完全兼容:
· 所有USART 寄存器的位定義。
· 發送器操作。
· 發送緩衝器的功能。
· 接收器操作。
然而,接收器緩衝器有兩個方面的改進,在某些特殊情況下會影響兼容性:
· 增加了一個緩衝器。兩個緩衝器的操作好象是一個循環的FIFO。因此對於每個接收到的數據只能讀一次!更重要的是錯誤標誌FE 和DOR,以及第9 個數據位RXB8與數據一起存放於接收緩衝器。因此必須在讀取UDR 寄存器之前訪問狀態標誌位。否則將丟失錯誤狀態。
· 接收移位寄存器可以作為第三級緩衝。在兩個緩衝器都沒有空的時候,數據可以保存於串行移位寄存器之中( 參見 Figure 61),直到檢測到新的起始位。從而增強了 USART 抵抗數據過速(DOR) 的能力。
下面的控制位的名稱做了改動,但其功能和在寄存器中的位置並沒有改變:
· CHR9改為UCSZ2。
· OR改為DOR。
時鐘產生時鐘產生邏輯為發送器和接收器產生基礎時鐘。USART 支持4 種模式的時鐘: 正常的異步模式,倍速的異步模式,主機同步模式,以及從機同步模式。USART 控制位UMSEL和狀態寄存器C (UCSRC) 用於選擇異步模式和同步模式。倍速模式( 只適用於異步模式) 受控於UCSRA 寄存器的U2X。使用同步模式 (UMSEL = 1) 時,XCK 的數據方向寄存器 (DDR_XCK)決定時鐘源是由內部產生(主機模式)還是由外部生產(從機模式)。僅在同步模式下XCK 有效。
片內時鐘產生-波特率發生器內部時鐘用於異步模式與同步主機模式。
USART 的波特率寄存器UBRR 和降序計數器相連接,一起構成可編程的預分頻器或波特率發生器。降序計數器對系統時鐘計數,當其計數到零或UBRRL 寄存器被寫時,會自動裝入UBRR 寄存器的值。當計數到零時產生一個時鐘,該時鐘作為波特率發生器的輸出時鐘,輸出時鐘的頻率為fosc/(UBRR+1)。發生器對波特率發生器的輸出時鐘進行2、8或16 的分頻,具體情況取決於工作模式。波特率發生器的輸出被直接用於接收器與數據恢復單元。數據恢復單元使用了一個有2、8或16個狀態的狀態機,具體狀態數由UMSEL、U2X 與 DDR_XCK 位設定的工作模式決定。

USART使用

STM32 USART的使用(基於庫函數版本)

USART步驟説明

對中斷需要用到的的默認的兩個管腳PA9和PA10的模式進行設置.
* 注意:不要忘記RCC的設置!STM32的結構決定了用任何一個外設 * 就必須設置相應的使能時鐘。USART1的使能時鐘位是在APB2中的 * 本例中對應函數UART1_GPIO_Configuration()
* 2: 對USART的數據格式進行設置,即發送數據的數據位、校驗位等.
* 本例對應函數為UART1_GPIO_Configuration()
* 注:對於數據是以上升沿還是下降沿有效,可以設置也可以不設 * 置,如果不設置,則系統採用默認值。本例中將其屏蔽。 * 3: 在主函數中調用以上兩個函數,然後用庫函數USART_SendData()
* 發送數據,用USART_GetFlagStatus(USART1, USART_FLAG_TXE) * 查詢中斷即可。

USART程序如下

#include
void delay(u32 x) //延時函數,u32是庫函數中定義好的宏,意為無符號32位整數 {
while(x--);}
/********************************************************************** * Name : UART1_GPIO_Configuration * Deion : Configures the uart1 GPIO ports. * Input : None * Output : None * Return : None
void UART1_GPIO_Configuration(void) //注意:不是庫函數,而是自己定義的GPIO初始化函數,
{
GPIO_InitTypeDef GPIO_InitSturcture;
//定義GPIO管腳初始化結構體
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//本函數(使能時鐘)參數中,RCC_APB2Periph_USART1是必不可少的,有人會問,對於串口用到的PA9和
//PA10不用使能時鐘嗎?其實由於USART1默認的就是PA9和PA10,所以這一個就行了,當然你要是加上 //這個|RCC_APB2Periph_GPIOA也是不報錯的,只是重複了。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
//選中串口默認輸出管腳
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//定義輸出最大速率
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //定義管腳9的模式
GPIO_Init(GPIOA, &GPIO_InitStructure); //調用函數,把結構體參數輸入進行初始化
// Configure USART1_Rx as input floating
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //同上
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//設置上浮模式
GPIO_Init(GPIOA, &GPIO_InitStructure);
//同上
* Name : UART1_Configuration * Deion : Configures the uart1 * Input : None * Output : None * Return : None
*******************************************************************************/ void USART_Configuration(void) {
USART_InitTypeDef USART_InitStructure; //定義串口初始化結構體
/*USART_ClockInitTypeDef USART_ClockInitStructure;//定義串口模式初始化結構體
USART_ClockInitStructure.USART_Clock = USART_Clock_Enable;// USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; USART_ClockInit(USART1,&USART_ClockInitStructure); */
USART_InitStructure.USART_BaudRate = 9600; //設置串口通信時的波特率9600
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//設置數據位的長度8個位 USART_InitStructure.USART_StopBits = USART_StopBits_1; //設置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);
//將以上賦完值的結構體帶入庫函數USART_Init進行初始化
USART_Cmd(USART1, ENABLE);//開啓USART1,注意與上面RCC_APB2PeriphClockCmd()設置的區別
}
int main(void)
UART1_GPIO_Configuration(); //調用GPIO初始化函數 USART_Configuration(); //調用USART配置函數 while(1)
//大循環
{
USART_SendData(USART1, 'A'); //發送一位數據
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //判斷是否發送完畢 delay(0XFFFFF); //延時