STM32之UART、RS232、RS485通讯
一、USART解釋
? USART是一個全雙工通用同步/異步串行收發模塊,該接口是一個高度靈活的串行通信設備,相互獨立的接收數據和發送數據;任何USART雙向通信至少需要兩個腳:接收數據輸入(RX)和發送數據輸出(TX)。為什么三種通訊方式一起學習呢?因為單片機最后都是要用到UASRT這個功能與外界通訊的。由于UART規定只是規定了數據(信號的時序)的格式,并沒有規定接口的電氣特性,這樣導致了他們在物理層無法實現互聯。
? ?UART通訊時一般直接用處理器自己的TTL電平,(高電平表示1,低電平代表0)STM32自己的TTL電平是3.3V? 51單片機的TTL電平是5V的 所以不能互連。RS232電平規定:邏輯“1”的電平是-5V~ -15V之間,邏輯“0”的電平是+5v~+15V之間,這么高的電壓當然需要芯片轉換后才能通訊了。232通訊程序和UART通訊程序都是一樣的。
STM32F103LQFP48集成有3個UASRT控制器:編號及引腳定義如下:
| 名稱 | 引腳 |
| USART1 | PA9(30腳_TX) ?PA10(31腳_RX)可復用給42 43腳 |
| USART2 | PA1(11腳_RTS) ?PA2(12腳_TX) |
| USART3 | PA1(21腳_TX) ?PA2(22腳_RX) |
數據線端口是高電平狀態①(紅色線表示),如果開始發送數據了,那么總線將高電平拉低成低電平,然后開始發送數據,發送數據的順序是先發數據的低位,然后發送到高位。一般是8位數據位(也可以是7位),然后是校驗位(校驗位可有可無),最后一位是停止位(停止位是必須有的)停止位可以是1位,1.5位,2位。
?發送方這樣不停的發送數據,接收方怎么知道發送的的0還是1呢?如果要發送0x00,和0xFF數據,這樣總線是不是一直在高電平或者低電平,我們約定一個節拍(如:波特率9600指的是每秒可以傳輸9600個二進制位,傳送一個位需要1/9600秒)雙方共同遵守,這個節拍持續的時間長短,來換算成發送了多少個0或者多少個1了。盡管設置了相同的波特率,設備雙方的時鐘基準可能不太一樣,為了防止累計誤差出現,每次發完一個字節后又重新開始發送下一個字節,時間重新開始計時。
控制器內部結構圖如下
?初始化端口庫函數
void USART1_Init(u32 bound){ //串口1初始化并啟動//GPIO端口設置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA時鐘//USART1_TX PA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出GPIO_Init(GPIOA, &GPIO_InitStructure); //USART1_RX PA.10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入GPIO_Init(GPIOA, &GPIO_InitStructure); //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優先級3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優先級3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器 //USART 初始化設置USART_InitStructure.USART_BaudRate = bound;//一般設置為9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數據格式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); //初始化串口USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啟ENABLE/關閉DISABLE中斷USART_Cmd(USART1, ENABLE); //使能串口 } /* USART1專用的printf函數 當同時開啟2個以上串口時,printf函數只能用于其中之一,其他串口要自創獨立的printf函數 調用方法:USART1_printf("123"); //向USART2發送字符123 */ void USART1_printf (char *fmt, ...){ char buffer[USART1_REC_LEN+1]; // 數據長度u8 i = 0; va_list arg_ptr;va_start(arg_ptr, fmt); vsnprintf(buffer, USART1_REC_LEN+1, fmt, arg_ptr);while ((i < USART1_REC_LEN) && (i < strlen(buffer))){USART_SendData(USART1, (u8) buffer[i++]);while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); }va_end(arg_ptr); }RS485總線標準規定采用差分信號進行數據傳輸,兩根線電壓差+2V~+6V 表示邏輯1;兩根線電壓差-2V~-6V 表示邏輯0;使用差分信號能有效的減少工模干擾,2根線之間沒有地。RS485的通訊距離可以達到1500m。電壓低了也不會損壞電路接口。485采用總線式拓撲結構,數據的發送和接收要占用2根線,所以發送時候就不能接收,接收時候不能發,所以只能采用半雙工的發送和接收數據,在軟件編程時候注意區分。
雖然處理器集成了UART控制器,產生的一般是TTL電平,該電平并不符合RS485標準,所以一般我們還要外加電路將TTL信號轉換為差分的485信號。常用的芯片有(MAX485、SN75LBC184、SP3485) 磁隔離的高速芯片有AD公司的 ADM2582E/ADM2587E,光隔離的芯片有國產的金升陽公司的TD301D485H 不同的芯片要看廠家的推薦參考電路和最大速度以及使用環境。
典型電路如下
一起學習交流群:QQ群號碼:255864236
總結
以上是生活随笔為你收集整理的STM32之UART、RS232、RS485通讯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言社交网络,【C++】设计并实现一种
- 下一篇: d-s证据理论 matlab代码2