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

- STM32: 大脑,负责运行应用程序逻辑,处理传感器数据,控制执行器(如电机、LED等),并通过串口(UART)与蓝牙模块通信。
- 蓝牙模块: 嘴巴和耳朵,负责将 STM32 发来的串口数据转换成蓝牙信号并发送出去,同时也接收蓝牙信号并将其转换成串口数据交给 STM32。
主流蓝牙技术类型
在项目中,你需要根据需求选择合适的蓝牙技术,目前主要有以下三种:
蓝牙 (Classic / BR/EDR)
- 特点: 也被称为“经典蓝牙”,主要用于点对点的音频传输(如A2DP,蓝牙耳机)和串口模拟。
- 应用场景: 无线鼠标、键盘、耳机、串口数据透传。
- 与STM32结合: 这是最简单、最常见的方式,蓝牙模块在出厂时就被配置为SPP (Serial Port Profile) 模式,STM32 通过 UART 与模块连接,收发数据就像和另一个串口设备通信一样,非常方便。
- 代表模块: HC-05, HC-06,这是初学者入门的绝对首选,价格便宜,资料丰富。
蓝牙低功耗
- 特点: 核心是低功耗,它不是为了高速传输,而是为了用极少的电量维持长时间的连接,非常适合电池供电的设备。
- 应用场景: 可穿戴设备(手环、手表)、智能家居传感器(温湿度、门窗传感器)、医疗设备(心率监测器)。
- 与STM32结合:
- 集成方案: 一些高性能的 STM32 型号(如 STM32L4, STM32WB 系列)内部集成了蓝牙BLE控制器,这意味着你不需要外接蓝牙模块,直接在 STM32 上开发即可,这是最集成、成本和功耗最优的方案,但开发复杂度较高。
- 外挂模块方案: 如果你的主控是普通 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 开发板(如 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 型号。
- 在
Connectivity或Connectivity类别下,选择一个USART(或UART) 实例。 - 设置
Mode为Asynchronous。 - 配置
Baud Rate(波特率)。这个波特率必须和蓝牙模块设置的波特率一致! 常见的有 9600, 115200。 - 配置
NVIC Settings,开启 UART 的接收中断。 - 生成代码。
步骤 2: 编写应用程序代码
- 初始化蓝牙模块: 上电后,通常需要通过 AT 指令配置蓝牙模块的名称、配对密码、波特率等,这需要你先通过 STM32 向蓝牙模块发送特定的字符串(如
AT+NAME=MyDevice)。 - 数据发送: 在主循环或某个事件中,调用
HAL_UART_Transmit()函数,将你想发送的数据通过 UART 发送给蓝牙模块。 - 数据接收: 这是最关键的一步,在
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)的软件流程
这个流程要复杂得多,因为它涉及到蓝牙协议栈的开发。
- 安装 BLE 协议栈: 需要从 ST 官网下载 X-CUBE-BLE5 软件包,并导入到 STM32CubeIDE 中。
- 使用 STM32CubeMX 配置:
- 除了配置 UART(如果需要),还需要通过 CubeMX 的 "Middleware" 选项卡来配置 BLE 的角色(Peripheral/中央设备/观察者)、服务、特征等。
- CubeMX 会自动生成 BLE 协议栈的底层初始化代码。
- 编写应用程序逻辑:
- 你需要基于 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 |
实用案例
-
蓝牙温湿度计:
- 硬件: STM32 + DHT11/DHT22 传感器 + BLE 模块 (如 JDY-31)。
- 流程: STM32 读取温湿度数据 -> 通过 UART 发送给 BLE 模块 -> BLE 模块广播数据 -> 手机 App 接收并显示。
-
蓝牙遥控小车:
- 硬件: STM32 + 电机驱动模块 + HC-05 (经典蓝牙)。
- 流程: 手机 App 发送 'F', 'B', 'L', 'R' 等指令 -> HC-05 接收 -> 通过 UART 传给 STM32 -> STM32 解析指令并控制电机转动。
-
智能家居开关:
- 硬件: STM32 + 继电器 + STM32WB 开发板。
- 流程: 手机 App 连接设备 -> 发送开/关指令 -> STM32WB 接收到数据 -> 触发中断 -> STM32 控制 GPIO 输出高低电平 -> 继电器吸合/断开 -> 控制灯的亮灭。
希望这份详细的指南能帮助你顺利地在 STM32 项目中应用蓝牙技术!
