CH579 CH573 CH582 CH592 蓝牙主机(Central)实例应用讲解(二)——Central消息事件机制初探

发布于:2025-06-15 ⋅ 阅读:(21) ⋅ 点赞:(0)

首先声明一点,本文中所提到的消息事件机制都是本团队在实际工作中总结出来的,错误可能不可避免,如有不对的地方欢迎指正。不过相信对很多刚刚接触蓝牙的朋友还是能提供一些帮助的。

一、CH582芯片架构与BLE Central特性

一)、硬件基础

基于RISC-V内核,内置BLE 5.3双模射频

独立消息队列控制器(Message RAM)实现低延迟事件分发

硬件级AES-128加密加速,保障GATT事件安全

二)、协议栈定制优化

采用沁恒自研BLE协议栈(CH58xBLE_Lib)

Central模式下支持8个并发连接(每个连接独立事件通道)

动态内存分配策略减少事件丢失率(实测<0.1%)

二、消息事件处理流程详解

一)、事件分类与优先级

| 事件类型            | 触发源               | 处理优先级 |
|----------------------|----------------------|-----------------|
| 射频中断事件    | RF硬件中断       | 最高(0)       |
| HCI命令响应     | 主机协议栈        | 高(1)           |
| GATT操作回调  | 从机特征值变更| 中(2)           |
| 定时器事件        | 系统看门狗       | 低(3)           |

二)、关键API与回调机制

事件处理:通过Central_ProcessEvent处理包括Timers,messages以及用户自定义事件。

事件回调:centralEventCB

消息分发:central_ProcessTMOSMsg

本文只对Central的相关消息事件进行分析,对定时器事件、HAL层事件不作解释。

三、初始化及扫描从设备

 HAL层及系统初始化完成后,会调用Central_Init(),这段代码首先就是注册事件处理函数,以及一些必要的初始化,最后启动START_DEVICE_EVT事件,也就是启动Central。完成这些操作后,会触发事件回调函数中的GAP_DEVICE_INIT_DONE_EVENT。

void Central_Init()
{
    centralTaskId = TMOS_ProcessEventRegister(Central_ProcessEvent);

    // Setup GAP
    GAP_SetParamValue(TGAP_DISC_SCAN, DEFAULT_SCAN_DURATION);
    GAP_SetParamValue(TGAP_CONN_EST_INT_MIN, DEFAULT_MIN_CONNECTION_INTERVAL);
    GAP_SetParamValue(TGAP_CONN_EST_INT_MAX, DEFAULT_MAX_CONNECTION_INTERVAL);
    GAP_SetParamValue(TGAP_CONN_EST_SUPERV_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT);

    // Setup the GAP Bond Manager
    {
        uint32_t passkey = DEFAULT_PASSCODE;
        uint8_t  pairMode = DEFAULT_PAIRING_MODE;
        uint8_t  mitm = DEFAULT_MITM_MODE;
        uint8_t  ioCap = DEFAULT_IO_CAPABILITIES;
        uint8_t  bonding = DEFAULT_BONDING_MODE;

        GAPBondMgr_SetParameter(GAPBOND_CENT_DEFAULT_PASSCODE, sizeof(uint32_t), &passkey);
        GAPBondMgr_SetParameter(GAPBOND_CENT_PAIRING_MODE, sizeof(uint8_t), &pairMode);
        GAPBondMgr_SetParameter(GAPBOND_CENT_MITM_PROTECTION, sizeof(uint8_t), &mitm);
        GAPBondMgr_SetParameter(GAPBOND_CENT_IO_CAPABILITIES, sizeof(uint8_t), &ioCap);
        GAPBondMgr_SetParameter(GAPBOND_CENT_BONDING_ENABLED, sizeof(uint8_t), &bonding);
    }
    // Initialize GATT Client
    GATT_InitClient();
    // Register to receive incoming ATT Indications/Notifications
    GATT_RegisterForInd(centralTaskId);
    // Setup a delayed profile startup
    tmos_set_event(centralTaskId, START_DEVICE_EVT);
}
    if(events & START_DEVICE_EVT)
    {
        // Start the Device
        GAPRole_CentralStartDevice(centralTaskId, &centralBondCB, &centralRoleCB);
        return (events ^ START_DEVICE_EVT);
    }

 

在事件回调centralEventCB中,触发GAP_DEVICE_INIT_DONE_EVENT后,


网站公告

今日签到

点亮在社区的每一天
去签到