8.7 串口项目3:中断方式接收数据控制LED灯亮灭
# 8.7 串口项目3:中断方式接收数据控制LED灯亮灭
本实验在8.6节实验二(轮询方式)基础上,改用串口中断方式接收数据控制LED。中断与轮询方式对比:
- 轮询:CPU需持续查询数据,响应延迟高,占用资源多,适用于简单场景。
- 中断:数据到达时触发即时处理,实时性强,释放CPU资源,适合多任务场景。
实验目标不变:通过串口发送"R""G""B""O"指令控制三色LED,但采用中断机制提升效率。
# 8.7.1 STM32CubeMx配置
在实验二配置基础上,需启用USART1接收中断:
- 进入
Pinout & Connectivity
标签页。 - 导航至
System Core
→NVIC
。 - 勾选
USART1 global interrupt
启用全局中断。

# 8.7.2 串口项目3软件设计
# 1. 全局变量声明
在指定位置添加全局变量:
/* USER CODE BEGIN PV */
uint8_t rx_char; // 存储接收到的字符
/* USER CODE END PV */
1
2
3
2
3
# 2. 启动中断接收
在主程序初始化阶段启动中断接收:
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, &rx_char, 1); // 启动中断接收(每次1字节)
/* USER CODE END 2 */
1
2
3
2
3
# 3. 中断回调函数
接收完成后触发回调函数,解析指令并控制LED。处理完成后需重新启动中断:
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) {
switch (rx_char) {
case 'R': // 红色LED亮
HAL_GPIO_WritePin(LED_R_GPIO_Port,LED_R_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_G_GPIO_Port,LED_G_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_B_GPIO_Port,LED_B_Pin,GPIO_PIN_RESET);
break;
case 'G': // 绿色LED亮
HAL_GPIO_WritePin(LED_G_GPIO_Port,LED_G_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_R_GPIO_Port,LED_R_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_B_GPIO_Port,LED_B_Pin,GPIO_PIN_RESET);
break;
case 'B': // 蓝色LED亮
HAL_GPIO_WritePin(LED_B_GPIO_Port,LED_B_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_R_GPIO_Port,LED_R_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_G_GPIO_Port,LED_G_Pin,GPIO_PIN_RESET);
break;
case 'O': // 关闭所有LED
HAL_GPIO_WritePin(LED_R_GPIO_Port,LED_R_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_G_GPIO_Port,LED_G_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_B_GPIO_Port,LED_B_Pin,GPIO_PIN_RESET);
break;
default: break;
}
HAL_UART_Receive_IT(&huart1, &rx_char, 1); // 重新启动中断
}
}
/* USER CODE END 4 */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 8.7.3 串口项目3下载验证
实验现象与轮询方式一致:
- 发送
R/G/B
时对应LED立即点亮,其他关闭。 - 发送
O
时所有LED熄灭。