STM32串口通讯(RS232、RS485、TTL)详解

您所在的位置:网站首页 stm32高速串口 STM32串口通讯(RS232、RS485、TTL)详解

STM32串口通讯(RS232、RS485、TTL)详解

2024-07-13 10:29| 来源: 网络整理| 查看: 265

前言

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在工业上面用的比较多,因为比较稳定不易受干扰。

2.TTL电平

TTL全称为Transistor-Transistor Logic,即晶体管-晶体管逻辑电平。逻辑“1”通常对应的电压范围在2.4V到5V之间,而逻辑“0”对应的电压范围在0V到0.8V之间。我们一般会用到USB TO TTL这种小模块,来连接单片机的UART口来打印调试信息。

二、串口通讯协议 1.连接方式

典型的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位数据位,然后根据配置发送奇偶校验位,最后拉高电平,停止数据传输,数据传输的速率是根据波特率得出的,如果发送和接收两端使用了不同的波特率,那么得到的就会是一堆乱码。

三、应用程序 1.初始化串口 //bound:波特率 void uart_init() { //UART 初始化设置 UART1_Handler.Instance=USART1; //USART1 UART1_Handler.Init.BaudRate=115200; //波特率 UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式 UART1_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位 UART1_Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位 UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控 UART1_Handler.Init.Mode=UART_MODE_TX_RX; //收发模式 HAL_UART_Init(&UART1_Handler); //HAL_UART_Init()会使能UART1 //HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量(使用回调函数处理中断需要调用该函数) }

由上面代码得知,我们配置了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