STM32串口通讯(RS232、RS485、TTL)详解 |
您所在的位置:网站首页 › stm32高速串口 › STM32串口通讯(RS232、RS485、TTL)详解 |
前言
STM32串口(Serial Communication Interface)是STM32微控制器中用于串行通信的接口,通常指的是USART(通用同步异步收发器)或UART(通用异步收发传输器)。这些接口允许STM32微控制器与其他设备(如计算机、其他微控制器、传感器等)进行串行数据交换。 串行通信一般是以帧格式传输数据,数据一帧一帧的被传输,每帧包含有起始信号、数据信息、校验信息、停止信号。 一、物理层 1.RS232和RS485的区别我们常用RS232和RS485这两种串行通信接口标准,它们各自具有不同的特点和适用场景。 通信接口电平信号传输距离受干扰传输单位RS232“1”为-3V至-15V,“0”为+3V至+15V一般10米以内容易一主一从RS485“1”以两线间的电压差+2V至+6V表示 “0”以两线间的电压差-6V至-2V表示 最多可达3000米不易一主多从通过上面的表格可以看出两种通信接口的不同,单片机上的UART/USART口都是TTL电平信号,想要通过RS485或者RS232传输数据,需要在它们之间电平转换芯片,我们一般用RS232作打印日常的调试信息,RS485在工业上面用的比较多,因为比较稳定不易受干扰。 TTL全称为Transistor-Transistor Logic,即晶体管-晶体管逻辑电平。逻辑“1”通常对应的电压范围在2.4V到5V之间,而逻辑“0”对应的电压范围在0V到0.8V之间。我们一般会用到USB TO TTL这种小模块,来连接单片机的UART口来打印调试信息。 典型的UART/USART通信使用3根线完成,分别是发送线(TX)、接收线(RX)和地线(GND)。在通信时,必须将双方的TX和RX交叉连接,并将GND相连才可正常通信。 2.协议构成(1)起始位(Start Bit): 起始位始终是一个逻辑0(低电平),它标志着数据开始传输。对于接收方,当检测到从高到低的跳变时,就知道新的数据字符即将开始。 (2)数据位(Data Bits): 数据位是实际要传输的信息。STM32 UART支持5至9位的数据位,但最常用的配置是8位数据位。数据位是从最低位(LSB)到最高位(MSB)依次传输的 (3)校验位(Parity Bit): 校验位是可选的,用于增加数据传输的可靠性。STM32 UART支持奇校验、偶校验和无校验模式。 奇校验:数据中1的个数加上校验位中1的个数应为奇数。偶校验:数据中1的个数加上校验位中1的个数应为偶数。无校验:没有校验位。(4)停止位(Stop Bit): 停止位标志着数据字符的结束。STM32 UART支持1位、1.5位或2位的停止位。停止位始终是高电平。停止位的作用是允许接收器有足够的时间来处理数据,并准备接收下一个字符。 (5)波特率(Baud Rate): 波特率定义了每秒传输的位数。例如,9600波特意味着每秒传输9600个位。STM32 UART可以配置为支持广泛的波特率范围。 3.工作原理在闲置状态下,UART的引脚一直被拉高,引脚如果被拉低,它标志着数据开始传输,然后开始依次传输数据位,一般我们都用8位数据位,然后根据配置发送奇偶校验位,最后拉高电平,停止数据传输,数据传输的速率是根据波特率得出的,如果发送和接收两端使用了不同的波特率,那么得到的就会是一堆乱码。 由上面代码得知,我们配置了USART1,波特率为115200,数据位为8,一个停止位,没有奇偶校验,可以同时收发。 2.使能GPIO口 void HAL_UART_MspInit(UART_HandleTypeDef *huart) { //GPIO端口设置 GPIO_InitTypeDef GPIO_Initure; if(huart->Instance==USART1)//如果是串口1,进行串口1 MSP初始化 { __HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟 __HAL_RCC_USART1_CLK_ENABLE(); //使能USART1时钟 GPIO_Initure.Pin=GPIO_PIN_9; //PA9 GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出 GPIO_Initure.Pull=GPIO_PULLUP; //上拉 GPIO_Initure.Speed=GPIO_SPEED_FAST; //高速 GPIO_Initure.Alternate=GPIO_AF7_USART1; //复用为USART1 HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA9 GPIO_Initure.Pin=GPIO_PIN_10; //PA10 HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA10 __HAL_UART_DISABLE_IT(huart,UART_IT_TC); #if EN_USART1_RX __HAL_UART_ENABLE_IT(huart,UART_IT_RXNE); //开启接收中断 HAL_NVIC_EnableIRQ(USART1_IRQn); //使能USART1中断通道 HAL_NVIC_SetPriority(USART1_IRQn,3,3); //抢占优先级3,子优先级3 #endif } }第一段代码调用Hal库的HAL_UART_Init(&UART1_Handler)函数以后,我们需要在HAL_UART_MspInit将对应的TX和RX两个口使能才能使串口正常使用。 3.串口发送数据 HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_RX_BUF,len,1000);用HAL_UART_Transmit这个函数可以通过UART1发出信息,USART_RX_BUF是我们要发出的内容,len是内容数组的大小。 4.串口接收数据 //串口1中断服务程序 void USART1_IRQHandler(void) { u8 Res; #if SYSTEM_SUPPORT_OS //使用OS OSIntEnter(); #endif if((__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_RXNE)!=RESET)) { HAL_UART_Receive(&UART1_Handler,&Res,1,1000); if(USART_RX_CNT |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |