8.7 串口项目3:中断方式接收数据控制LED灯亮灭

# 8.7 串口项目3:中断方式接收数据控制LED灯亮灭

本实验在8.6节实验二(轮询方式)基础上,改用串口中断方式接收数据控制LED。中断与轮询方式对比:

  • 轮询:CPU需持续查询数据,响应延迟高,占用资源多,适用于简单场景。
  • 中断:数据到达时触发即时处理,实时性强,释放CPU资源,适合多任务场景。

实验目标不变:通过串口发送"R""G""B""O"指令控制三色LED,但采用中断机制提升效率。


# 8.7.1 STM32CubeMx配置

在实验二配置基础上,需启用USART1接收中断

  1. 进入Pinout & Connectivity标签页。
  2. 导航至System CoreNVIC
  3. 勾选USART1 global interrupt启用全局中断。
启用USART1接收中断

# 8.7.2 串口项目3软件设计

# 1. 全局变量声明

在指定位置添加全局变量:

/* USER CODE BEGIN PV */
uint8_t rx_char;  // 存储接收到的字符
/* USER CODE END PV */
1
2
3

# 2. 启动中断接收

在主程序初始化阶段启动中断接收:

/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, &rx_char, 1);  // 启动中断接收(每次1字节)
/* USER CODE END 2 */
1
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

# 8.7.3 串口项目3下载验证

实验现象与轮询方式一致:

  • 发送R/G/B时对应LED立即点亮,其他关闭。
  • 发送O时所有LED熄灭。