针对国民技术N32WB031蓝牙芯片在运行过程中可能出现的“异常丢广播”现象,本文档提供了一套软件层面的监测与恢复方案。通过添加该机制,可以在不复位整个系统的情况下仅复位蓝牙模块,从而显著提升软件的健壮性和稳定性。
蓝牙复位机制(系统不复位)
该方案的核心在于实现一个仅复位蓝牙协议栈而不影响主系统运行的接口。开发者需在ns_ble.c文件中添加以下接口函数:
核心函数:ns_ble_reset()
此函数供应用层调用,执行后将重置蓝牙状态并重新初始化。
void ns_ble_reset(void)
{
NS_LOG_DEBUG("%s\r\n", __func__);
/// Initialize Task state
ke_state_set(TASK_APP, APP_INIT);
// 重置 GAP 应用环境变量
app_env.adv_actv_idx = GAP_INVALID_ACTV_IDX;
app_env.scan_actv_idx = GAP_INVALID_ACTV_IDX;
app_env.init_actv_idx = GAP_INVALID_ACTV_IDX;
app_env.conidx = GAP_INVALID_CONIDX;
app_env.next_svc = 0;
app_env.adv_mode = APP_ADV_MODE_ENABLE;
app_env.adv_state = APP_ADV_STATE_IDLE;
// 重置连接环境
for (uint8_t i = 0; i < APP_CON_IDX_MAX; i++)
{
app_env.conn_env[i].conidx = GAP_INVALID_CONIDX;
}
// 重置配置文件环境与协议栈
ble_prf_evn.prf_num = 0;
prf_init(RWIP_RST);
rwip_reset();
// 发送 GAPM 重置命令
app_send_gapm_reset_cmd();
}
{
NS_LOG_DEBUG("%s\r\n", __func__);
/// Initialize Task state
ke_state_set(TASK_APP, APP_INIT);
// 重置 GAP 应用环境变量
app_env.adv_actv_idx = GAP_INVALID_ACTV_IDX;
app_env.scan_actv_idx = GAP_INVALID_ACTV_IDX;
app_env.init_actv_idx = GAP_INVALID_ACTV_IDX;
app_env.conidx = GAP_INVALID_CONIDX;
app_env.next_svc = 0;
app_env.adv_mode = APP_ADV_MODE_ENABLE;
app_env.adv_state = APP_ADV_STATE_IDLE;
// 重置连接环境
for (uint8_t i = 0; i < APP_CON_IDX_MAX; i++)
{
app_env.conn_env[i].conidx = GAP_INVALID_CONIDX;
}
// 重置配置文件环境与协议栈
ble_prf_evn.prf_num = 0;
prf_init(RWIP_RST);
rwip_reset();
// 发送 GAPM 重置命令
app_send_gapm_reset_cmd();
}
异常监测与触发流程
为了自动检测蓝牙是否“假死”或丢广播,系统利用RTC(实时时钟)进行周期性监测。
监测配置与逻辑:
| 配置项 | 说明 |
|---|---|
| 触发源 |
RTC 自动唤醒配置 (rtc_wk_init) |
| 触发事件 |
RTC 中断中触发蓝牙状态检查消息 (APP_BLE_CHECK_EVT) |
| 监测周期 | 必须大于广播间隔,否则无法准确判断广播是否丢失 |
| 防误触机制 | 在应用层主动停止广播或设备无连接时,需暂停监测流程,防止误触发蓝牙服务复位 |
执行逻辑:
RTC中断:到达设定时间后,RTC中断服务程序被触发。
状态检查:在中断处理函数中发送APP_BLE_CHECK_EVT消息,或直接执行异常检查逻辑。
判定异常:若检测到蓝牙广播异常(如未按预期发送)。
执行恢复:调用上述ns_ble_reset()函数,重置蓝牙并重新初始化。
这套机制通过RTC硬件定时结合软件状态机重置,巧妙地解决了N32WB031蓝牙芯片偶发性丢广播的问题。它避免了传统方案中需要重启整个MCU带来的业务中断,是BMS产品中提升蓝牙连接可靠性的有效手段。
