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)。

某网站的短信验证码校验漏洞 2026-07-05

评论区