可以辅助实现以下 (1) 监测蓝牙收发事件,代码可以根据事件执行一些应用层处理,如计数,闪灯,评估连接活跃情况等。 (2) 可以监测是否出现长时间的没有蓝牙收发活动。 如因为莫名原因出现的异常情况。 (3) 以下代码只是参考作用。 需要根据自己要求做一些修改。 步骤1-添加如下参考代码。 //(1)step 1 static uint32_t ble_rx_event_flag = 0;//BLE Rx event 标志,有活动时清0,否则定时累加 /** * @brief 清0,ble_rx_event_flag 标志 * @param ongoing2 也可以做其它,如闪灯,指示蓝牙活动情况 */ void rwip_bb_frame_ongoing_new(uint32 t ongoing2) { if (ongoing2) { //判断这个位置 ble_rx_event_flag = 0; // Clear flag counter } } /** * @brief 定时检查 ble_rx_event_flag 标记, * */ void Second_timer_flag_checker(void) { // TIMEOUT_N 的设置,需要结合Interval和Lanency来设置适合值,来判断多久才是未有收到数据。 #define TIMEOUT_N (7) /* ble_rx_event_flag 每隔1秒增加一下, 如果超过 TIMEOUT_N 未被清0, 表示长时间未有接收到数据了。 */ if ((++ble_rx_event_flag) >= TIMEOUT_N) /* && (Power_state == 1) */) { // 这里用户可以选择做一些应对,如开启广播,断开连接,或者重启等 pmu_force_reboot(); //此处示例重启 } } /** * @brief 修改的蓝牙中断函数,需要替换启动文件中的 BT_IROHandler * 最好定义为RAM执行的代码 */ void BT_IRQHandler_new(void) { extern void BT_IRQHandler(void); uint32_t ongoing1, ongoing2; ongoing1 = rwip_env.prevent_sleep & RW_BB_FRAME_ONGOING; BT_IROHandler(); //默认的蓝牙中断处理函数 ongoing2 = rwip_env.prevent_sleep & RW_BB_FRAME_ONGOING; if (ongoing1 != ongoing2) //表示蓝牙事件执行完,不再阻止睡眠,蓝牙Rx活动正常 { rwip_bb_frame_ongoing_new(ongoing2); //清标志,或者加闪灯等操作都行 } } 步骤2-在启动文件代码中修改 //(2)工程启动文件中, 所有和BT_IRQHandler 相关的,替换为 BT_IRQHandler_new //如: startup_hs6621_flash.s .......... ; External Interrupts DCD BT_IRQHandler_new ; 0 BT_IRQHandler DCD BT_OSCEN_IRQHandler ; 1 DCD DMA_IRQHandler ; 2 .......... |