求一个BLE低功耗蓝牙 ch592f新增seriver的例程 - RISC-V MCU技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

啊啊啊 关注 私信
[问答]

求一个BLE低功耗蓝牙 ch592f新增seriver的例程

求一个BLE低功耗蓝牙 ch592f新增seriver的例程

回帖(1)

贾小龙

2025-4-1 18:04:44

以下是基于沁恒CH592F芯片新增BLE Service的步骤说明及示例代码:




步骤说明:




  1. 获取SDK和开发环境



    • 从沁恒官网下载最新SDK(如WCH BLE SDK)。

    • 确保已安装Keil开发环境及CH592F支持包。




  2. 理解BLE服务结构



    • BLE服务基于GATT协议,每个服务包含若干特征值(Characteristic)。

    • 需要定义Service UUID和Characteristic UUID(16位或128位)。




  3. 修改配置文件



    • 调整gattprofile.h中的属性表大小(CFG_MAX_SERVICE)。




  4. 定义自定义UUID



    • 在适当位置(如service.h)定义UUID:
      #define MY_SERVICE_UUID        0xAA10 // 自定义服务UUID
      #define MY_CHARACTERISTIC_UUID 0xAA11 // 自定义特征UUID




  5. 初始化服务




    • 在应用初始化函数中注册服务,例如:


      void MyService_Init(void) {
      // 添加服务
      uint8_t serviceUUID[2] = {LO_UINT16(MY_SERVICE_UUID), HI_UINT16(MY_SERVICE_UUID)};
      ADD_SERVICE(0, PRIMARY_SERVICE, serviceUUID, 0, 0);

      // 添加特征值
      uint8_t charUUID[2] = {LO_UINT16(MY_CHARACTERISTIC_UUID), HI_UINT16(MY_CHARACTERISTIC_UUID)};
      ADD_CHARACTERISTIC(0, CHAR_PROP_READ | CHAR_PROP_WRITE,
                          charUUID, ATT_PERMISSION_AUTHEN_READ | ATT_PERMISSION_AUTHEN_WRITE,
                          myCharData, sizeof(myCharData), 0);
      }





  6. 处理读写事件



    • 在BLE事件回调中处理特征值的读写:
      void handleBleEvent(tmos_event_hdr_t *pMsg) {
      switch(pMsg->event) {
           case ATT_READ_IND:
           case ATT_WRITE_IND:
               // 解析并处理读写请求
               if(pMsg->handle == myCharHandle) {
                   // 读取或更新数据
               }
               break;
      }
      }




  7. 编译测试



    • 使用手机APP(如nRF Connect)扫描并验证服务是否可见,测试特征值读写。






示例代码片段:


// service.h
#define MY_SERVICE_UUID        0xAA10
#define MY_CHARACTERISTIC_UUID 0xAA11

// 服务初始化函数
void MyService_Init(void);

// service.c
static uint8_t myCharData[20] = {0}; // 特征值数据
static uint16_t myCharHandle = 0;    // 特征值句柄

void MyService_Init(void) {
    // 添加服务
    uint8_t serviceUUID[2] = {LO_UINT16(MY_SERVICE_UUID), HI_UINT16(MY_SERVICE_UUID)};
    uint16_t serviceHandle = AddService(PRIMARY_SERVICE, serviceUUID, 2, 0);

    // 添加特征值
    uint8_t charUUID[2] = {LO_UINT16(MY_CHARACTERISTIC_UUID), HI_UINT16(MY_CHARACTERISTIC_UUID)};
    myCharHandle = AddCharacteristic(
        CHAR_PROP_READ | CHAR_PROP_WRITE,
        charUUID,
        ATT_PERMISSION_AUTHEN_READ | ATT_PERMISSION_AUTHEN_WRITE,
        myCharData,
        sizeof(myCharData),
        sizeof(myCharData),
        0
    );
}

// 在main.c中调用初始化
int main() {
    // ...其他初始化
    MyService_Init();
    // ...
}

// 处理BLE事件(简化示例)
void TMOS_ProcessEvent(uint8 task_id, uint16 events) {
    if(events & BLE_EVENT) {
        handleBleEvent((tmos_event_hdr_t*)&msg);
    }
}



注意事项:




  1. UUID类型  



    • 使用16位UUID需确保在蓝牙联盟注册,否则使用128位UUID更安全。




  2. 属性表大小  



    • 修改gattprofile.h中的CFG_MAX_SERVICE以防止内存溢出。




  3. 权限控制  



    • 根据需求设置正确的ATT权限(如ATT_PERMISSION_ENC_READ)。




  4. 测试工具  



    • 推荐使用nRF Connect或LightBlue验证服务是否正常广播。




  5. 数据更新  



    • 若特征值支持通知,需调用GATT_HandleValueNoti发送数据。




如需完整工程示例,建议参考沁恒SDK中的Peripheral例程,替换其中的服务部分。

更多回帖

×
发帖