USART
高度靈活的串列通信設備
USART:(Universal Synchronous/Asynchronous Receiver/Transmitter)
通用同步/非同步串列接收/發送器
USART是一個全雙工通用同步/非同步串列收發模塊,該介面是一個高度靈活的串列通信設備。
. 雙操(互獨收據送據);
. 步操,鍾步,鍾步;
. 獨精波率器,占/計器;
4. 支持5、6、7、8和9位數據位,1或2位停止位的串列數據楨結構;
5. 由硬體支持的奇偶校驗位發生和檢驗;
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--);}
void USART_Configuration(void) {
USART_InitTypeDef USART_InitStructure; //定義串口初始化結構體
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); //延時
usart圖庫