USART:(Universal Synchronous/Asynchronous Receiver/Transmitter) 通用同步/異步串行接收/發送器
USART是一個全雙工通用同步/異步串行收發模塊,該接口是一個高度靈活的串行通信設備。
特點:
全雙工操作(相互獨立的接收數據和發送數據);
2. 同步操作時,可主機時鐘同步,也可從機時鐘同步;
3. 獨立的高精度波特率發生器,不占用定時/計數器;
4. 支持5、6、7、8和9位數據位,1或2位停止位的串行數據楨結構;
5. 由硬件支持的奇偶校驗位發生和檢驗;
6. 數據溢出檢測;
7. 幀錯誤檢測;
8. 包括錯誤起始位的檢測噪聲濾波器和數字低通濾波器;
9. 三個完全獨立的中斷,TX發送完成、TX發送數據寄存器空、RX接收完成;
10.支持多機通信模式;
11.支持倍速異步通信模式。
組成:
USART收發模塊一般分為三大部分:時鐘發生器、數據發送器和接收器。控制寄存器為所有的模塊共享。
時鐘發生器由同步邏輯電路(在同步從模式下由外部時鐘輸入驅動)和波特率發生器組成。發送時鐘引腳XCK僅用于同步發送模式下,
發送器部分由一個單獨的寫入緩沖器(發送UDR)、一個串行移位寄存器、校驗位發生器和用于處理不同幀結構的控制邏輯電路構成。使用寫入緩沖器,實現了連續發送多幀數據無延時的通信。
接收器是USART模塊最復雜的部分,最主要的是時鐘和數據接收單元。數據接收單元用作異步數據的接收。除了接收單元,接收器還包括校驗位校驗器、控制邏輯、移位寄存器和兩級接收緩沖器(接收UDR)。接收器支持與發送器相同的幀結構,同時支持幀錯誤、數據溢出和校驗錯誤的檢測。
舉例:
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 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);?//延時
嵌入式 單片機
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。