跳到主要内容

STM32 UART 配置

介绍

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)是一种常见的串行通信协议,广泛应用于嵌入式系统中。它允许两个设备通过简单的两条线(TX 和 RX)进行全双工通信。STM32 微控制器内置了多个 UART 外设,能够轻松实现串行通信。

在本教程中,我们将学习如何在 STM32 上配置 UART,并通过代码示例展示如何发送和接收数据。

UART 的基本概念

UART 通信基于以下参数:

  • 波特率(Baud Rate):通信速度,单位为比特每秒(bps)。
  • 数据位(Data Bits):每个数据帧的位数,通常为 8 位。
  • 停止位(Stop Bits):表示数据帧结束的位数,通常为 1 位。
  • 校验位(Parity Bit):用于错误检测的位,可以是无校验、奇校验或偶校验。

STM32 UART 配置步骤

1. 启用 UART 外设时钟

在 STM32 中,首先需要启用 UART 外设的时钟。假设我们使用 UART2,可以通过以下代码启用时钟:

c
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

2. 配置 GPIO 引脚

UART 通信需要配置 TX 和 RX 引脚。以 USART2 为例,TX 引脚通常为 PA2,RX 引脚为 PA3。配置代码如下:

c
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStruct);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);

3. 配置 UART 参数

接下来,我们需要配置 UART 的波特率、数据位、停止位和校验位。以下是一个典型的配置:

c
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate = 9600;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART2, &USART_InitStruct);

USART_Cmd(USART2, ENABLE);

4. 发送和接收数据

配置完成后,我们可以通过 UART 发送和接收数据。以下是一个简单的发送和接收示例:

c
// 发送数据
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data) {
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
USART_SendData(USARTx, Data);
}

// 接收数据
uint16_t USART_ReceiveData(USART_TypeDef* USARTx) {
while (USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == RESET);
return USART_ReceiveData(USARTx);
}

5. 中断配置(可选)

为了提高效率,可以使用中断来处理 UART 数据接收。以下是一个简单的中断配置示例:

c
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);

在中断服务程序中处理接收到的数据:

c
void USART2_IRQHandler(void) {
if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) {
uint16_t data = USART_ReceiveData(USART2);
// 处理接收到的数据
}
}

实际应用场景

1. 与 PC 通信

UART 常用于 STM32 与 PC 之间的通信。通过 USB 转串口模块,可以将 STM32 的 UART 信号转换为 USB 信号,连接到 PC 上进行调试和数据传输。

2. 与传感器通信

许多传感器(如 GPS 模块、温度传感器等)通过 UART 与主控芯片通信。通过配置 UART,STM32 可以轻松读取传感器数据。

总结

在本教程中,我们学习了如何在 STM32 上配置 UART 串行通信。我们从基础概念开始,逐步讲解了 UART 的配置步骤,并提供了代码示例和实际应用场景。通过掌握这些知识,您可以在自己的项目中轻松实现串行通信。

附加资源与练习

  • 练习 1:尝试修改波特率,观察通信效果的变化。
  • 练习 2:使用中断方式实现 UART 数据接收,并处理接收到的数据。
  • 资源:参考 STM32 官方参考手册,了解更多关于 UART 的高级配置和功能。
提示

在调试 UART 通信时,可以使用串口调试助手(如 PuTTY 或 Tera Term)来查看发送和接收的数据。