前言
实现蓝牙控制LED的核心目的是深入理解蓝牙MCU的工作原理,具体包括:
1. 数据交互机制:学习蓝牙模块如何接收、解析外部数据;
2. 硬件控制逻辑:掌握MCU根据接收到的指令控制GPIO电平变化(高/低电平)的实现方式;
3. 协议栈应用:通过CH582F芯片的蓝牙功能,实践BLE协议栈的数据收发流程。
对于熟悉STM32或51单片机的开发者而言,基础的点灯操作(LED控制)已属于常规技能。本项目的重点在于拓展无线通信能力,将传统硬件控制与蓝牙无线通信相结合,从而:
理解蓝牙数据帧的组成与解析
实现无线指令到硬件动作的完整链路
掌握低功耗蓝牙(BLE)的通信模式
通过这一实践,可系统性地掌握从无线数据接收→指令处理→硬件响应的嵌入式开发全流程。
开发环境
CH582F最小开发板
MounRiver Studio Ⅱ(开发环境)
WCHISPStudio(烧录工具)
WCH的基于该芯片的示例基础库
Start
目标:
基于CH582F的BLE外设示例工程(路径:EVT\EXAM\BLE\Peripheral)实现以下功能:
1. GATT服务架构
创建1个自定义服务(UUID可自定义)
在该服务下实现2个特征值:
特征值1(可写):用于接收控制指令(Write Without Response)
特征值2(Notify):支持订阅功能,供设备主动推送状态请求
2. LED控制逻辑
当特征值1收到
0x01时:将指定GPIO引脚置低电平(LED点亮,共阳设计默认高电平截止)
当特征值1收到
0x00时:将对应GPIO置高电平(LED熄灭)
3. 硬件连接说明
LED采用共阳接法(阳极接VCC,阴极接GPIO),故低电平有效点亮
具体引脚定义可根据开发板原理图调整,此处不赘述硬件设计细节
蓝牙控制LED实现步骤详解
1. 修改GATT服务配置文件
文件路径:\EVT\EXAM\BLE\Peripheral\Profile\gattprofile.c
精简特征值:
删除 static gattAttribute_t simpleProfileAttrTbl[] 数组中的 *特征值2、3、5**,仅保留 特征值1(可写) 和 特征值4(订阅通知)。
调整特征值4的存储位置偏移量:
#define SIMPLEPROFILE_CHAR4_VALUE_POS 5 // 原值需根据实际剩余特征值位置调整2. 初始化外设与LED配置
文件路径:\EVT\EXAM\BLE\Peripheral\APP\peripheral.c
移除无用特征值初始化:在
Peripheral_Init()函数中,注释掉以下代码:
// charValue2/3/5 相关初始化
// SimpleProfile_SetParameter2/3/5 函数调用添加LED控制宏与初始化:
#define LED_PIN GPIO_Pin_5 // 假设LED连接PA5
#define LED_ON() GPIOA_ResetBits(LED_PIN) // 低电平点亮(共阳)
#define LED_OFF() GPIOA_SetBits(LED_PIN) // 高电平熄灭
void Peripheral_Init() {
// ...其他初始化代码
GPIOA_ModeCfg(LED_PIN, GPIO_ModeOut_PP_5mA); // 推挽输出
GPIOA_SetBits(LED_PIN); // 初始状态关闭LED
}3. 实现数据接收与LED控制逻辑
在 simpleProfileChangeCB 回调函数中修改 特征值1 的处理逻辑:
case SIMPLEPROFILE_CHAR1:
ledControlValue = *pValue; // 读取接收到的数据
uint8_t newValue[SIMPLEPROFILE_CHAR1_LEN];
tmos_memcpy(newValue, pValue, len); // 复制数据(可选)
PRINT("Received CHAR1 Value: %d\n", ledControlValue);
// 控制LED状态
switch (ledControlValue) {
case 0x00:
LED_OFF();
PRINT("LED Turned OFF\n");
break;
case 0x01:
LED_ON();
PRINT("LED Turned ON\n");
break;
}
// 向订阅设备通知当前状态(特征值4)
uint8_t notiData[1] = {ledControlValue};
peripheralChar4Notify(notiData, 1); // 发送通知数据
break;
4. 编译与烧录步骤
1. 编译工程:
在开发环境中按下*Ctrl+B** 编译全部代码。
生成的HEX文件位于:
\EVT\EXAM\BLE\Peripheral\obj\<项目名>.hex
2. 烧录固件:
打开 *WCHISPStudio** 烧录工具。
* 选择生成的HEX文件(目标程序文件1)。
* 硬件操作:
1. 按住开发板上的 BOOT按钮。
2. 重新插拔USB,工具将自动识别设备。
3. 点击 下载 完成烧录。
---
5. 功能验证
* 使用蓝牙调试工具(如nRF Connect或LightBlue):
1. 连接设备并找到 特征值1(可写)。
2. 发送 0x01:LED点亮(低电平触发)。
3. 发送 0x00:LED熄灭(高电平触发)。
* 订阅通知:
订阅 *特征值4**,设备会在LED状态变化时推送当前值(0x00/0x01)。