跳到主要内容

STM32 UART 中断

介绍

UART(通用异步收发传输器)是一种常见的串行通信协议,广泛应用于嵌入式系统中。STM32 微控制器支持 UART 通信,并且可以通过中断机制来处理数据的接收和发送。使用中断可以避免轮询(polling)带来的资源浪费,使程序更加高效。

本文将详细介绍如何在 STM32 中使用 UART 中断,包括配置、代码实现和实际应用场景。

UART 中断的基本概念

在 UART 通信中,中断是一种事件驱动的机制。当 UART 接收到数据或发送完成时,会触发中断,CPU 会暂停当前任务,转而执行中断服务程序(ISR)。通过这种方式,程序可以及时处理 UART 数据,而不需要不断地检查 UART 状态。

常见的中断类型

  1. 接收中断(RXNE):当 UART 接收到新数据时触发。
  2. 发送完成中断(TC):当 UART 发送完数据时触发。
  3. 空闲中断(IDLE):当 UART 接收线路空闲时触发。

配置 UART 中断

在 STM32 中,配置 UART 中断通常包括以下步骤:

  1. 初始化 UART 外设:设置波特率、数据位、停止位等参数。
  2. 使能 UART 中断:选择需要的中断类型(如接收中断、发送完成中断等)。
  3. 配置 NVIC(嵌套向量中断控制器):设置中断优先级并启用中断。
  4. 编写中断服务程序(ISR):处理 UART 中断事件。

代码示例

以下是一个简单的 UART 中断配置示例,使用 STM32 HAL 库:

c
#include "stm32f4xx_hal.h"

UART_HandleTypeDef huart2;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);

int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();

// 使能接收中断
__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);

while (1)
{
// 主循环
}
}

void MX_USART2_UART_Init(void)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart2);
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART2)
{
// 处理接收到的数据
uint8_t received_data = huart2.Instance->DR;
// 例如,将数据发送回串口
HAL_UART_Transmit(&huart2, &received_data, 1, HAL_MAX_DELAY);
}
}

void SysTick_Handler(void)
{
HAL_IncTick();
}
备注

HAL_UART_RxCpltCallback 函数中,您可以处理接收到的数据。此函数会在每次接收到新数据时自动调用。

实际应用场景

1. 串口通信的回显功能

在上述代码示例中,我们实现了一个简单的回显功能。当 UART 接收到数据时,程序会将数据原样发送回去。这种功能常用于调试和测试串口通信。

2. 数据采集与传输

在物联网设备中,UART 中断常用于数据采集。例如,传感器通过 UART 发送数据到 STM32,STM32 通过中断接收数据并进行处理,然后将处理后的数据发送到云端或其他设备。

总结

UART 中断是 STM32 中处理串行通信的高效方式。通过中断机制,程序可以及时响应 UART 事件,而不需要不断地轮询状态寄存器。本文介绍了 UART 中断的基本概念、配置步骤和实际应用场景,并提供了一个简单的代码示例。

附加资源与练习

提示

如果您对 UART 中断还有疑问,建议阅读 STM32 参考手册中的 UART 章节,或者尝试在开发板上运行代码示例。