STM32 UART 中断
介绍
UART(通用异步收发传输器)是一种常见的串行通信协议,广泛应用于嵌入式系统中。STM32 微控制器支持 UART 通信,并且可以通过中断机制来处理数据的接收和发送。使用中断可以避免轮询(polling)带来的资源浪费,使程序更加高效。
本文将详细介绍如何在 STM32 中使用 UART 中断,包括配置、代码实现和实际应用场景。
UART 中断的基本概念
在 UART 通信中,中断是一种事件驱动的机制。当 UART 接收到数据或发送完成时,会触发中断,CPU 会暂停当前任务,转而执行中断服务程序(ISR)。通过这种方式,程序可以及时处理 UART 数据,而不需要不断地检查 UART 状态。
常见的中断类型
- 接收中断(RXNE):当 UART 接收到新数据时触发。
- 发送完成中断(TC):当 UART 发送完数据时触发。
- 空闲中断(IDLE):当 UART 接收线路空闲时触发。
配置 UART 中断
在 STM32 中,配置 UART 中断通常包括以下步骤:
- 初始化 UART 外设:设置波特率、数据位、停止位等参数。
- 使能 UART 中断:选择需要的中断类型(如接收中断、发送完成中断等)。
- 配置 NVIC(嵌套向量中断控制器):设置中断优先级并启用中断。
- 编写中断服务程序(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 中断的基本概念、配置步骤和实际应用场景,并提供了一个简单的代码示例。
附加资源与练习
- 练习 1:修改代码示例,使其在接收到特定字符(如
'A'
)时点亮 LED。 - 练习 2:尝试使用空闲中断(IDLE)来检测一帧数据的结束。
- 参考文档:
提示
如果您对 UART 中断还有疑问,建议阅读 STM32 参考手册中的 UART 章节,或者尝试在开发板上运行代码示例。