主要特點
1. 全雙工操作(相互獨立的接收數據和傳送數據);
2. 同步操作時,可主機
時鐘同步,也可從機時鐘同步;
4. 支持5、6、7、8和9位
數據位,1或2位停止位的串列數據楨結構;
6. 數據溢出檢測;
7. 幀錯誤檢測;
8. 包括錯誤起始位的檢測噪聲濾波器和數字低通濾波器;
9. 三個完全獨立的中斷,TX傳送完成、TX傳送
數據暫存器空、RX接收完成;
10.支持多機通信模式;
11.支持倍速異步通信模式。
結構組成
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 位設定的工作模式決定。
使用
STM32 USART的使用(基於庫函式版本)
步驟說明
對中斷需要用到的的默認的兩個管腳PA9和PA10的模式進行設定.
* 注意:不要忘記RCC的設定!STM32的結構決定了用任何一個外設 * 就必須設定相應的使能時鐘。USART1的使能時鐘位是在APB2中的 * 本例中對應函式UART1_GPIO_Configuration()
* 2: 對USART的數據格式進行設定,即傳送數據的數據位、校驗位等.
* 本例對應函式為UART1_GPIO_Configuration()
* 註:對於數據是以上升沿還是下降沿有效,可以設定也可以不設 * 置,如果不設定,則系統採用默認值。本例中將其禁止。 * 3: 在主函式中調用以上兩個函式,然後用庫函式USART_SendData()
* 傳送數據,用USART_GetFlagStatus(USART1, USART_FLAG_TXE) * 查詢中斷即可。
程式如下
#include<stm32f10x_lib.h>
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_InitStructure;
//定義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); //延時