晟辉智能制造

STM32蓝牙技术如何快速上手实现通信?

核心概念:STM32 + 蓝牙

就是将蓝牙模块(负责无线通信)与 STM32 微控制器(负责数据处理和逻辑控制)连接起来,让基于 STM32 的设备具备无线数据收发的能力。

STM32蓝牙技术如何快速上手实现通信?-图1
(图片来源网络,侵删)
  • STM32: 大脑,负责运行应用程序逻辑,处理传感器数据,控制执行器(如电机、LED等),并通过串口(UART)与蓝牙模块通信。
  • 蓝牙模块: 嘴巴和耳朵,负责将 STM32 发来的串口数据转换成蓝牙信号并发送出去,同时也接收蓝牙信号并将其转换成串口数据交给 STM32。

主流蓝牙技术类型

在项目中,你需要根据需求选择合适的蓝牙技术,目前主要有以下三种:

蓝牙 (Classic / BR/EDR)

  • 特点: 也被称为“经典蓝牙”,主要用于点对点的音频传输(如A2DP,蓝牙耳机)和串口模拟
  • 应用场景: 无线鼠标、键盘、耳机、串口数据透传。
  • 与STM32结合: 这是最简单、最常见的方式,蓝牙模块在出厂时就被配置为SPP (Serial Port Profile) 模式,STM32 通过 UART 与模块连接,收发数据就像和另一个串口设备通信一样,非常方便。
  • 代表模块: HC-05, HC-06,这是初学者入门的绝对首选,价格便宜,资料丰富。

蓝牙低功耗

  • 特点: 核心是低功耗,它不是为了高速传输,而是为了用极少的电量维持长时间的连接,非常适合电池供电的设备。
  • 应用场景: 可穿戴设备(手环、手表)、智能家居传感器(温湿度、门窗传感器)、医疗设备(心率监测器)。
  • 与STM32结合:
    1. 集成方案: 一些高性能的 STM32 型号(如 STM32L4, STM32WB 系列)内部集成了蓝牙BLE控制器,这意味着你不需要外接蓝牙模块,直接在 STM32 上开发即可,这是最集成、成本和功耗最优的方案,但开发复杂度较高。
    2. 外挂模块方案: 如果你的主控是普通 STM32(如 F1, F4),你可以选择外接一个 BLE 模块,如 nRF51, nRF52 系列(Nordic Semiconductor),或者国产的 JDY-31, BLE-CC41 等,连接方式和 SPP 模块类似,通常也通过 UART,但通信协议和 AT 指令不同。

蓝牙 5.0+

  • 特点: 是 BLE 的一个增强版本,带来了多项改进,如更快的速度、更远的距离、更大的广播包容量等。
  • 应用场景: 在 BLE 的基础上,增加了更多可能性,如信标Mesh组网等。
  • 与STM32结合: 通常通过集成方案(如 STM32WB 系列)来实现,STM32WB 是一颗“双核”芯片,一颗 M0+ 核负责处理 BLE 协议栈,另一颗 M4 核负责运行你的应用程序,两者通过内部通信,性能强大。

硬件连接方案

无论是哪种蓝牙技术,最常见的硬件连接方式都是 UART 串口

外挂蓝牙模块(最通用)

这是最灵活、最常用的方案,适用于几乎所有 STM32 型号。

所需硬件:

STM32蓝牙技术如何快速上手实现通信?-图2
(图片来源网络,侵删)
  • STM32 开发板(如 Nucleo, Black Pill)
  • 蓝牙模块(如 HC-05 for Classic, JDY-31 for BLE)
  • 杜邦线

连接方式: | 蓝牙模块引脚 | STM32 引脚 (示例) | 功能说明 | | :--- | :--- | :--- | | VCC | 3.3V | 注意: 大多数蓝牙模块都是 3.3V 供电,不要接 5V! | | GND | GND | 地线 | | TXD (发送) | RXD (接收) | 蓝牙模块的发送端连接到 STM32 的接收端 | | RXD (接收) | TXD (发送) | 蓝牙模块的接收端连接到 STM32 的发送端 | | EN/STATE | (可选) | 使能引脚或状态指示引脚,可用于软件控制或状态监测 |

重要提示: 交叉连接!蓝牙模块的 TX 要接到 STM32 的 RX,反之亦然。

集成蓝牙(STM32WB 系列)

这是更高级的方案,无需外接模块。

  • 硬件: 你只需要一块基于 STM32WB55 或类似芯片的开发板(如 Nucleo-WB55, B-WL5A)。
  • 连接: 蓝牙天线已经集成在 PCB 板上,你只需要通过软件配置即可,天线的设计和布局对信号质量影响很大,开发板已经帮你做好了。

软件开发流程

环境搭建

  • IDE: 推荐使用 STM32CubeIDE,它集成了代码生成和调试功能。
  • 核心工具: STM32CubeMX,这是一个图形化配置工具,可以帮你:
    • 配置时钟树。
    • 配置所需的外设,如 UART
    • 生成初始化代码。

外挂模块的软件流程

步骤 1: 配置 STM32CubeMX

STM32蓝牙技术如何快速上手实现通信?-图3
(图片来源网络,侵删)
  1. 新建一个项目,选择你的 STM32 型号。
  2. ConnectivityConnectivity 类别下,选择一个 USART (或 UART) 实例。
  3. 设置 ModeAsynchronous
  4. 配置 Baud Rate(波特率)。这个波特率必须和蓝牙模块设置的波特率一致! 常见的有 9600, 115200。
  5. 配置 NVIC Settings,开启 UART 的接收中断。
  6. 生成代码。

步骤 2: 编写应用程序代码

  1. 初始化蓝牙模块: 上电后,通常需要通过 AT 指令配置蓝牙模块的名称、配对密码、波特率等,这需要你先通过 STM32 向蓝牙模块发送特定的字符串(如 AT+NAME=MyDevice)。
  2. 数据发送: 在主循环或某个事件中,调用 HAL_UART_Transmit() 函数,将你想发送的数据通过 UART 发送给蓝牙模块。
  3. 数据接收: 这是最关键的一步,在 main.c 中找到 HAL_UART_RxCpltCallback() 这个回调函数,这是 UART 接收中断的回调。
    • 在回调函数中,将接收到的数据存入一个缓冲区。
    • 处理数据(解析命令、控制 LED 等)。
    • 再次调用 HAL_UART_Receive_IT() 来开启下一次中断接收,形成一个循环。

示例代码框架:

// main.c
// 全局变量
uint8_t rxBuffer[1]; // 每次接收1个字节
uint8_t commandBuffer[64]; // 存放完整命令的缓冲区
uint8_t cmdIndex = 0;
int main(void) {
  // ... HAL_Init(), SystemClock_Config(), MX_USART1_UART_Init() ...
  // 启动第一次接收中断
  HAL_UART_Receive_IT(&huart1, rxBuffer, 1);
  while (1) {
    // 主循环中可以处理其他任务,或者处理 commandBuffer 中的数据
    if (/* 检测到 commandBuffer 中有完整命令 */) {
      // 解析并执行命令
      // ...
      // 清空 commandBuffer
      cmdIndex = 0;
    }
  }
}
// UART 接收中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
  if (huart->Instance == USART1) {
    // 将接收到的字节存入命令缓冲区
    commandBuffer[cmdIndex++] = rxBuffer[0];
    // 再次启动接收,等待下一个字节
    HAL_UART_Receive_IT(&huart1, rxBuffer, 1);
  }
}

集成模块(STM32WB)的软件流程

这个流程要复杂得多,因为它涉及到蓝牙协议栈的开发。

  1. 安装 BLE 协议栈: 需要从 ST 官网下载 X-CUBE-BLE5 软件包,并导入到 STM32CubeIDE 中。
  2. 使用 STM32CubeMX 配置:
    • 除了配置 UART(如果需要),还需要通过 CubeMX 的 "Middleware" 选项卡来配置 BLE 的角色(Peripheral/中央设备/观察者)、服务、特征等。
    • CubeMX 会自动生成 BLE 协议栈的底层初始化代码。
  3. 编写应用程序逻辑:
    • 你需要基于 ST 提供的 BLE 协议栈 API 来编写代码。
    • 定义你的自定义服务,"Environmental Sensing Service"。
    • 定义服务下的特征,"Temperature Characteristic"。
    • 在主循环或回调函数中,将 STM32 采集到的温度数据,通过 p_BLE_Update_Char_Value() 这样的函数更新到特征的值中,手机 App 就可以读取到这个变化。

开发流程总结

步骤 外挂蓝牙模块 集成蓝牙模块
硬件选型 选择合适的 STM32 和蓝牙模块 选择集成了 BLE 的 STM32 (如 WB 系列)
硬件连接 按照交叉连接方式,将模块与 STM32 的 UART 引脚相连 检查天线设计,无需额外连接
软件环境 STM32CubeIDE + STM32CubeMX STM32CubeIDE + STM32CubeMX + X-CUBE-BLE5 软件包
外设配置 在 CubeMX 中配置 UART(波特率、中断) 在 CubeMX 中配置 BLE 服务、特征,并启用相关时钟
应用开发 - 通过 UART 发送 AT 指令配置模块
- 通过 UART 收发数据
- 编写中断回调函数
- 使用 BLE 协议栈 API
- 定义服务和特征
- 在回调中更新特征值
调试 - 使用串口助手调试 AT 指令
- 使用手机蓝牙调试助手测试数据收发
- 使用 ST 提供的 BLE 调试工具(如 ST BLE Sensor)
- 使用 nRF Connect 等手机 App

实用案例

  1. 蓝牙温湿度计:

    • 硬件: STM32 + DHT11/DHT22 传感器 + BLE 模块 (如 JDY-31)。
    • 流程: STM32 读取温湿度数据 -> 通过 UART 发送给 BLE 模块 -> BLE 模块广播数据 -> 手机 App 接收并显示。
  2. 蓝牙遥控小车:

    • 硬件: STM32 + 电机驱动模块 + HC-05 (经典蓝牙)。
    • 流程: 手机 App 发送 'F', 'B', 'L', 'R' 等指令 -> HC-05 接收 -> 通过 UART 传给 STM32 -> STM32 解析指令并控制电机转动。
  3. 智能家居开关:

    • 硬件: STM32 + 继电器 + STM32WB 开发板。
    • 流程: 手机 App 连接设备 -> 发送开/关指令 -> STM32WB 接收到数据 -> 触发中断 -> STM32 控制 GPIO 输出高低电平 -> 继电器吸合/断开 -> 控制灯的亮灭。

希望这份详细的指南能帮助你顺利地在 STM32 项目中应用蓝牙技术!

分享:
扫描分享到社交APP
上一篇
下一篇