1.STM32CubeMX配置
STM32配置可见上文,本文不再配置。
2.编写STM32F1xx HAL库配置文件(stm32f1xx_hal_conf.h)
3.编写中断头文件(stm32f1xx_it.h)
4.编写中断服务函数(stm32f1xx_it.c)
5.编写头文件(main.h)
6.编写主函数(main.c)
7.编译并运行,测试运行结果
编译成功:
8.上板测试验证
测试成功:
详细说明
1. 中断方式 vs HAL回调方式
之前的HAL回调方式:
使用HAL_UART_Receive_IT()启动接收
在HAL_UART_RxCpltCallback()回调函数中处理数据
HAL库自动管理中断使能和标志清除
当前的中断方式:
直接操作寄存器使能USART接收中断
在USART1_IRQHandler()中手动处理中断
手动读取数据寄存器和清除中断标志
2. 中断处理流程
- 中断使能:
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
- 中断服务函数:
检查RXNE(接收寄存器非空)标志
读取数据寄存器(DR)获取接收到的字节
清除中断标志
设置接收完成标志供主循环处理 - 主循环处理:
检查uart_rx_flag标志
处理接收到的数据
根据字符控制发送状态
关键代码解析
中断使能
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
这行代码使能USART1的RXNE(接收寄存器非空)中断,当接收到数据时会触发中断。
中断服务函数
void USART1_IRQHandler(void)
{
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
{
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE);
uart_rx_buffer = (uint8_t)(huart1.Instance->DR & 0xFF);
uart_rx_flag = 1;
}
}
UART_FLAG_RXNE:接收寄存器非空标志
读取DR寄存器会自动清除RXNE标志
设置标志位通知主循环有新数据需要处理
硬件连接
STM32F103C8T6 ↔ USB转串口模块
PA9 (USART1_TX) → RXD of USB-to-Serial
PA10 (USART1_RX) → TXD of USB-to-Serial
GND → GND
串口助手设置
在Windows 11的串口助手中需要设置:
波特率: 115200
数据位: 8位
停止位: 1位
校验位: 无
流控制: 无
功能特点
- 实时响应:中断方式确保及时响应上位机命令
- 高效处理:中断服务函数尽量简短,只做必要的标志设置
- 主从分离:数据处理在主循环中完成,不阻塞中断
- 错误处理:包含溢出错误处理,提高稳定性