8.8 串口接收项目3:蓝牙通信控制LED灯

# 8.8 串口接收项目3:蓝牙通信控制LED灯

本实验将8.7节的串口接收项目2的USB串口通信扩展为蓝牙无线通信,通过蓝牙模块接收指令控制三色LED灯亮灭。实验采用USART3与蓝牙模块连接,对比串口接收项目2的主要变化如下,串口接收项目2通过USB转串口实现有线通信,本实验通过蓝牙模块JDY-31实现无线通信,适用移动端或远程控制场景。

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

# 8.8.1 蓝牙硬件电路设计

# 1.JDY-31蓝牙模块

蓝牙模块通过UART接口与STM32直接交互,无需复杂的外围电路,即可实现手机端与嵌入式设备的双向数据传输。

JDY-31蓝牙模块

# 2.硬件电路连接

JDY-31蓝牙模块的硬件接口精简,仅需连接VCC(3.3V~6V)、GND、TXD(模块发送端)与RXD(模块接收端),配合STM32的PB10(USART3_TX)与PB11(USART3_RX)即可完成物理层对接。

蓝牙模块电路图

# 8.8.2 STM32CubeMx配置

在8.7节串口接收项目2配置的基础上,需新增USART3配置用于替换USART1配置,并调整引脚复用。

# 1. 配置USART3

① 点击进入“Pinout & Configuration”标签页;
② 点击左侧导航栏中选择“Connectivity”;
③ 双击选中“USART3”;
④ 设置工作模式为“Asynchronous”,启用USART3。

启用USART3

配置USART3的工作参数如下:

  • Baud Rate:9600
  • Word Length:8 bits
  • Parity:None
  • Stop Bits:1
  • Over Sampling:16 Samples。 配置USART参数

# 2. 启动USART3中断

① 点击进入“Pinout & Connectivity”标签页;
② 在左侧导航栏点击“System Core”;
③ 双击“NVIC”;
④ 在“NVIC Settings”中勾选“USART3 global interrupt”,启用USART3全局中断。

启用USART3中断

# 8.8.3 串口接收项目3软件设置

8.7节串口接收项目2的代码逻辑包括中断回调和LED控制可直接在此复用,需修改以下内容:将USART1(huart1)替换为USART3(huart3)。调整全局变量与函数调用的关联关系。

# 1. 启动中断接收

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

/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart3, &rx_char, 1);  // 启动USART3中断接收
/* USER CODE END 2 */
1
2
3

# 2. 中断回调函数

在“/* USER CODE BEGIN 4 /”与“/ USER CODE END 4 */”注释快之间添加启动USART3中断回调函数,用于实现数据的接收和解析以及对LED灯的控制。

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
  if (huart->Instance == USART3) {
    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 '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(&huart3, &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

# 3. 生成代码

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


# 8.8.4 串口接收项目3下载验证

# 1.下载步骤

ST-LINK下载器连接嵌入式学习板的烧录接口和电脑端,点击STM32CubeIDE软件开发界面中的“Run”按钮,一键完成代码程序的编译下载。

# 2.验证步骤

在手机端通过手机蓝牙功能扫描附近设备,搜索到名为“JDY-31-SPP”的默认设备,若未修改AT指令配置。点击配对并输入初始密码“1234”,成功连接后,蓝牙模块的绿色LED立即转为常亮状态,表示无线链路已建立。

手机连接蓝牙

在手机端下载并打开“蓝牙调试助手”APP,点击已连接的“JDY-31-SPP”。

调试助手主界面

点击“输入调试”,进入到调试界面。 调试界面

为验证系统功能,依次发送以下指令:发送“R”指令、发送“G”指令、发送“B”指令,红色LED灯、绿色LED灯、蓝色LED灯依次被点亮,切换过程无闪烁、抖动。发送“O”指令,所有LED同步熄灭