您现在的位置是:首页 >技术教程 >深入探索STM32串口通信:从原理到实战网站首页技术教程

深入探索STM32串口通信:从原理到实战

2401_87067267 2025-08-23 00:01:05
简介深入探索STM32串口通信:从原理到实战


一、引言
 
在嵌入式系统开发中,串口通信是一种基本且常用的通信方式。STM32系列微控制器凭借其丰富的资源和强大的性能,在串口通信应用方面表现出色。本文将深入探讨STM32串口通信的原理、配置以及实际应用,帮助你快速掌握这一关键技术。
 
二、STM32串口通信原理
 
串口通信,即串行通信,是指数据一位一位地顺序传输。STM32的串口通信接口支持全双工、半双工、同步等多种通信模式,其中最常用的是全双工异步通信。
 
在异步通信中,数据以帧的形式传输,每一帧包含起始位、数据位、校验位和停止位。起始位为逻辑0,用于表示数据帧的开始;数据位通常为5 - 8位,是真正传输的数据;校验位用于数据校验,保证数据的准确性;停止位为逻辑1,标志着一帧数据的结束。STM32的串口通过波特率发生器来设定数据传输的速率,常见的波特率有9600、115200等。
 
三、STM32串口配置步骤
 
(一)使能串口时钟
 
使用RCC(Reset and Clock Control)寄存器使能相应串口的时钟。例如,对于USART1,可通过以下代码使能时钟:
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
 
 
(二)配置GPIO口
 
将与串口对应的GPIO口配置为复用功能。以USART1的TX(PA9)和RX(PA10)为例:
 
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 
// 配置PA9为复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置PA10为浮空输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure); 
 
 
(三)配置串口参数
 
设置串口的波特率、数据位、停止位、校验位等参数。
 
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200; // 波特率设置为115200
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_Cmd(USART1, ENABLE); 
 
 
四、串口数据收发
 
(一)发送数据
 
使用 USART_SendData 函数发送数据。例如,发送一个字符:
 
void USART_SendChar(USART_TypeDef* USARTx, uint8_t ch) {
    while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
    USART_SendData(USARTx, ch);
}
 
 
(二)接收数据
 
通过 USART_ReceiveData 函数接收数据,并利用接收中断来实现实时数据接收。首先,使能接收中断:
 
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
 
 
然后,在中断服务函数中处理接收到的数据:
 
void USART1_IRQHandler(void) {
    if (USART_GetITStatus(USART1, USART_IT_RXNE)!= RESET) {
        uint8_t receivedChar = USART_ReceiveData(USART1);
        // 处理接收到的数据
    }
}
 
 
五、应用实例
 
假设我们要实现一个简单的串口通信程序,将开发板接收到的数据原样返回。通过上述配置和数据收发函数,即可轻松实现:
 
int main(void) {
    // 串口配置
    //...

    while (1) {
        // 主循环可处理其他任务
    }
}
 
 
在中断服务函数中,将接收到的数据发送回去:
 
void USART1_IRQHandler(void) {
    if (USART_GetITStatus(USART1, USART_IT_RXNE)!= RESET) {
        uint8_t receivedChar = USART_ReceiveData(USART1);
        USART_SendChar(USART1, receivedChar);
    }
}
 
 
六、总结
 
通过本文,我们深入了解了STM32串口通信的原理、配置步骤以及数据收发方法,并通过实际应用实例掌握了串口通信的基本开发流程。串口通信作为STM32开发中的基础技能,为更复杂的通信协议和应用场景奠定了基础。在实际开发中,可根据具体需求进一步优化串口通信的性能和稳定性。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。