STM32之UART、RS232、RS485通讯
一、USART解釋
? USART是一個(gè)全雙工通用同步/異步串行收發(fā)模塊,該接口是一個(gè)高度靈活的串行通信設(shè)備,相互獨(dú)立的接收數(shù)據(jù)和發(fā)送數(shù)據(jù);任何USART雙向通信至少需要兩個(gè)腳:接收數(shù)據(jù)輸入(RX)和發(fā)送數(shù)據(jù)輸出(TX)。為什么三種通訊方式一起學(xué)習(xí)呢?因?yàn)閱纹瑱C(jī)最后都是要用到UASRT這個(gè)功能與外界通訊的。由于UART規(guī)定只是規(guī)定了數(shù)據(jù)(信號(hào)的時(shí)序)的格式,并沒(méi)有規(guī)定接口的電氣特性,這樣導(dǎo)致了他們?cè)谖锢韺訜o(wú)法實(shí)現(xiàn)互聯(lián)。
? ?UART通訊時(shí)一般直接用處理器自己的TTL電平,(高電平表示1,低電平代表0)STM32自己的TTL電平是3.3V? 51單片機(jī)的TTL電平是5V的 所以不能互連。RS232電平規(guī)定:邏輯“1”的電平是-5V~ -15V之間,邏輯“0”的電平是+5v~+15V之間,這么高的電壓當(dāng)然需要芯片轉(zhuǎn)換后才能通訊了。232通訊程序和UART通訊程序都是一樣的。
STM32F103LQFP48集成有3個(gè)UASRT控制器:編號(hào)及引腳定義如下:
| 名稱(chēng) | 引腳 |
| USART1 | PA9(30腳_TX) ?PA10(31腳_RX)可復(fù)用給42 43腳 |
| USART2 | PA1(11腳_RTS) ?PA2(12腳_TX) |
| USART3 | PA1(21腳_TX) ?PA2(22腳_RX) |
數(shù)據(jù)線端口是高電平狀態(tài)①(紅色線表示),如果開(kāi)始發(fā)送數(shù)據(jù)了,那么總線將高電平拉低成低電平,然后開(kāi)始發(fā)送數(shù)據(jù),發(fā)送數(shù)據(jù)的順序是先發(fā)數(shù)據(jù)的低位,然后發(fā)送到高位。一般是8位數(shù)據(jù)位(也可以是7位),然后是校驗(yàn)位(校驗(yàn)位可有可無(wú)),最后一位是停止位(停止位是必須有的)停止位可以是1位,1.5位,2位。
?發(fā)送方這樣不停的發(fā)送數(shù)據(jù),接收方怎么知道發(fā)送的的0還是1呢?如果要發(fā)送0x00,和0xFF數(shù)據(jù),這樣總線是不是一直在高電平或者低電平,我們約定一個(gè)節(jié)拍(如:波特率9600指的是每秒可以傳輸9600個(gè)二進(jìn)制位,傳送一個(gè)位需要1/9600秒)雙方共同遵守,這個(gè)節(jié)拍持續(xù)的時(shí)間長(zhǎng)短,來(lái)?yè)Q算成發(fā)送了多少個(gè)0或者多少個(gè)1了。盡管設(shè)置了相同的波特率,設(shè)備雙方的時(shí)鐘基準(zhǔn)可能不太一樣,為了防止累計(jì)誤差出現(xiàn),每次發(fā)完一個(gè)字節(jié)后又重新開(kāi)始發(fā)送下一個(gè)字節(jié),時(shí)間重新開(kāi)始計(jì)時(shí)。
控制器內(nèi)部結(jié)構(gòu)圖如下
?初始化端口庫(kù)函數(shù)
void USART1_Init(u32 bound){ //串口1初始化并啟動(dòng)//GPIO端口設(shè)置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA時(shí)鐘//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; //復(fù)用推挽輸出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 ;//搶占優(yōu)先級(jí)3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優(yōu)先級(jí)3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根據(jù)指定的參數(shù)初始化VIC寄存器 //USART 初始化設(shè)置USART_InitStructure.USART_BaudRate = bound;//一般設(shè)置為9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長(zhǎng)為8位數(shù)據(jù)格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個(gè)停止位USART_InitStructure.USART_Parity = USART_Parity_No;//無(wú)奇偶校驗(yàn)位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無(wú)硬件數(shù)據(jù)流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發(fā)模式USART_Init(USART1, &USART_InitStructure); //初始化串口USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開(kāi)啟ENABLE/關(guān)閉DISABLE中斷USART_Cmd(USART1, ENABLE); //使能串口 } /* USART1專(zhuān)用的printf函數(shù) 當(dāng)同時(shí)開(kāi)啟2個(gè)以上串口時(shí),printf函數(shù)只能用于其中之一,其他串口要自創(chuàng)獨(dú)立的printf函數(shù) 調(diào)用方法:USART1_printf("123"); //向USART2發(fā)送字符123 */ void USART1_printf (char *fmt, ...){ char buffer[USART1_REC_LEN+1]; // 數(shù)據(jù)長(zhǎng)度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總線標(biāo)準(zhǔn)規(guī)定采用差分信號(hào)進(jìn)行數(shù)據(jù)傳輸,兩根線電壓差+2V~+6V 表示邏輯1;兩根線電壓差-2V~-6V 表示邏輯0;使用差分信號(hào)能有效的減少工模干擾,2根線之間沒(méi)有地。RS485的通訊距離可以達(dá)到1500m。電壓低了也不會(huì)損壞電路接口。485采用總線式拓?fù)浣Y(jié)構(gòu),數(shù)據(jù)的發(fā)送和接收要占用2根線,所以發(fā)送時(shí)候就不能接收,接收時(shí)候不能發(fā),所以只能采用半雙工的發(fā)送和接收數(shù)據(jù),在軟件編程時(shí)候注意區(qū)分。
雖然處理器集成了UART控制器,產(chǎn)生的一般是TTL電平,該電平并不符合RS485標(biāo)準(zhǔn),所以一般我們還要外加電路將TTL信號(hào)轉(zhuǎn)換為差分的485信號(hào)。常用的芯片有(MAX485、SN75LBC184、SP3485) 磁隔離的高速芯片有AD公司的 ADM2582E/ADM2587E,光隔離的芯片有國(guó)產(chǎn)的金升陽(yáng)公司的TD301D485H 不同的芯片要看廠家的推薦參考電路和最大速度以及使用環(huán)境。
典型電路如下
一起學(xué)習(xí)交流群:QQ群號(hào)碼:255864236
總結(jié)
以上是生活随笔為你收集整理的STM32之UART、RS232、RS485通讯的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c语言社交网络,【C++】设计并实现一种
- 下一篇: 基于Token实现开放API接口签名验证