CH582F通过蓝牙控制LED的开关
AI-摘要
KunKunYu GPT
AI初始化中...
介绍自己
生成本文简介
推荐相关文章
前往主页
前往tianli博客
CH582F通过蓝牙控制LED的开关
前言
实现蓝牙控制LED的核心目的是深入理解蓝牙MCU的工作原理,具体包括:
- 数据交互机制:学习蓝牙模块如何接收、解析外部数据;
- 硬件控制逻辑:掌握MCU根据接收到的指令控制GPIO电平变化(高/低电平)的实现方式;
- 协议栈应用:通过CH582F芯片的蓝牙功能,实践BLE协议栈的数据收发流程。
对于熟悉STM32或51单片机的开发者而言,基础的点灯操作(LED控制)已属于常规技能。本项目的重点在于拓展无线通信能力,将传统硬件控制与蓝牙无线通信相结合,从而:
- 理解蓝牙数据帧的组成与解析
- 实现无线指令到硬件动作的完整链路
- 掌握低功耗蓝牙(BLE)的通信模式
通过这一实践,可系统性地掌握从无线数据接收→指令处理→硬件响应的嵌入式开发全流程。
开发环境
CH582F最小开发板
MounRiver Studio Ⅱ(开发环境)
WCHISPStudio(烧录工具)
WCH的基于该芯片的示例基础库
Start
目标:
基于CH582F的BLE外设示例工程(路径:EVT\EXAM\BLE\Peripheral
)实现以下功能:
- GATT服务架构
- 创建1个自定义服务(UUID可自定义)
- 在该服务下实现2个特征值:
- 特征值1(可写):用于接收控制指令(Write Without Response)
- 特征值2(Notify):支持订阅功能,供设备主动推送状态请求
- LED控制逻辑
- 当特征值1收到
0x01
时:- 将指定GPIO引脚置低电平(LED点亮,共阳设计默认高电平截止)
- 当特征值1收到
0x00
时:- 将对应GPIO置高电平(LED熄灭)
- 当特征值1收到
- 硬件连接说明
- 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. 编译与烧录步骤
- 编译工程:
- 在开发环境中按下Ctrl+B 编译全部代码。
- 生成的HEX文件位于:
\EVT\EXAM\BLE\Peripheral\obj\<项目名>.hex
- 烧录固件:
- 打开 WCHISPStudio 烧录工具。
- 选择生成的HEX文件(目标程序文件1)。
- 硬件操作:
- 按住开发板上的 BOOT按钮。
- 重新插拔USB,工具将自动识别设备。
- 点击 下载 完成烧录。
5. 功能验证
- 使用蓝牙调试工具(如nRF Connect或LightBlue):
- 连接设备并找到 特征值1(可写)。
- 发送 0x01:LED点亮(低电平触发)。
- 发送 0x00:LED熄灭(高电平触发)。
- 订阅通知:
- 订阅 特征值4,设备会在LED状态变化时推送当前值(0x00/0x01)。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Guidie
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果