8.7 串口接收项目2:中断方式控制LED灯

# 8.7 串口接收项目2:中断方式控制LED灯

实验目标与8.6节串口接收项目1不变,通过串口调试助手发送“R”“G”“B”“O”指令控制LED三色灯,但采用中断机制实现更高效的接收响应。对比轮询方式差异:中断响应实时性高,数据到达时触发接收处理并控制RGB LED状态,释放CPU资源。

# 下载源码 点击查看PDF文档

# 8.7.1 STM32CubeMx配置

在实验二的STM32CubeMX配置基础上,需额外启用USART1接收中断功能。 NVIC配置配置步骤 ① 点击“Pinout & Configuration”标签页;
② 在左侧导航栏中点击“System Core”;
③ 双击“NVIC”进行配置;
④ 在“NVIC Settings”中勾选“USART1 global interrupt”,启用全局中断。

启用USART1接收中断

# 8.7.2 串口接收项目2软件设计

# 1. 全局变量声明

在“/* USER CODE BEGIN PV /”与“/ USER CODE END PV */”注释快之间添加全局变量声明,用于存储接收到的字符。

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

# 2. 启动中断接收

在“/* USER CODE BEGIN 2 /”与“/ USER CODE END 2 */”注释快之间添加启动中断接收函数,每次接收1字节。

/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, &rx_char, 1);  // 启动中断接收(每次1字节)
/* USER CODE END 2 */
1
2
3

# 3. 中断回调函数

在“/* USER CODE BEGIN 4 /”与“/ USER CODE END 4 */”注释快之间添加启动中断回调函数,用于实现数据的接收和解析以及对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

# 4. 生成代码

勾选生成单独外设文件,保存生成工程代码。


# 8.7.3 串口接收项目2下载验证

实验验证与8.6节串口接收项目1的方法相同。 采用中断方式接收数据的实验现象与采用轮询方式接收数据的实验现象一样,发送单字符指令时,对应LED立即点亮,其他LED关闭;发送“O”时所有LED熄灭。