CH582F通过蓝牙控制LED的开关

前言

实现蓝牙控制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)。