在连接或广播期间、BLE 堆栈会阻止 GPIO 上的实时中断。 如果维持 BLE 时序对用例很重要、则这是堆栈的已知行为。 对于我们的应用、优先级是捕获所有 GPIO 边沿、这意味着允许 BLE 连接在任何点断开。 我可以处理广播、但一旦连接、就会出现以下问题。 我正在运行 TI BLE 1.4.1堆栈。
在附加的图中、黄色表示使用射频观测输出(OBSSEL0)监视的 TX 活动。 红色轨迹线表示 GPIO ISR/处理活动。 具体而言、在 HAL 任务中处理时、调试输出在 ISR 中设置为高电平、而在该任务中设置为低电平。
这是预期的行为(BLE 处于活动状态、直到 GPIO ISR 触发、然后在捕获所有边沿后完全停止)
当阻塞发生时、迹线如下所示...
被阻断的周期在20ms 至100ms 的任何时间内持续、并且大约发生在1%的时间内。
在实时 GPIO ISR 中、我尝试了各种组合调用以下命令:
HCI_LE_SetAdvEnableCmd (HCI_DISABLE_ADV)
RFST = 0x01;//发送 LLE CMD_SHUTDOWN (立即停止运行)
RFST = 0x0B;//发送 LLE CMD_STOP (正常停止无线电任务)
//重置链路层引擎
LLECTRL &=~0x01;//LLE_EN 设置为低电平
LLECTRL |= 0x01;//LLE_EN 设置为高电平
//禁用射频 ISR 掩码并清除任何标志,以便不屏蔽中断
IEN2 &=~IEN2_RFIE;
S1CON &=~(S1CON_RFIF_1 | S1CON_RFIF_0);
GAPRole_TerminateConnection()
HCI_EXT_DisconnectImmedCmd (uint16 connHandle)
它们都可以改善这种情况、但仅重置链路层引擎即可完全停止阻塞。 但这有时会使 BLE 堆栈处于不可恢复的状态、需要进行复位才能恢复通信。 我已将 GPIO IRQ 优先级设置为高于 RF IRQ、并且此设计中没有其它运行的外设。 我输出 EA 输出以在 GPIO 上进行监控、似乎阻断是由于堆栈或 OSAL 进入临界区并阻断所有 ISR。
那么、问题是如何立即停止 BLE 活动并允许 GPIO ISR 在不受 BLE 堆栈干扰的情况下触发?
或者
在 LLE 复位后、需要重新配置和设置哪些 BLE 参数和寄存器才能实现100%恢复?
感谢所有的想法和想法!!! 谢谢!
[更新]我想在下面添加其他信息。
如果我在 进入 GPIO ISR 的第一个入口调用 HCI_EXT_DisconnectImmedCmd ()、则 BLE 堆栈似乎会阻止 GPIO ISR 大约20ms。 这会导致 ISR 边沿丢失、我需要跟踪所有事件而不会丢失。 该调用会使 BLE 处于功能状态、但对我们的应用来说不可用。 由于 GPIO 活动是异步的、因此我无法执行任何流控制或这样的暂停。 GPIO 需要优先于 BLE 才能捕获活动。
请参阅下图(黄色表示 BLE TX、红色表示 GPIO 的 ISR) 红色曲线在进入 ISR 时设置为高电平、并在 HAL_Drivers.c 中处理的事件/任务时设置为低电平



