引言
在许多基于 BlueNRG-1/2 系列芯片的低功耗蓝牙的设计项目时,客户通常会在 Flash的特定区域存储定制的数据。然而需要特别注意的是,在 BlueNRG-1/2 方案中,用户对Flash 的读写操作必须在射频空闲的情况下进行,两者是互斥的关系。
问题描述
客户经常反馈类似问题,诸如:当用户程序尝试将用户定制数据写入 Flash 中特定区域时,发现 BLE 射频部分停止工作,或芯片直接死机了。
解决办法
使用一个双向链表来管理 Flash 操作(Flash 擦除或者是 Flash 写,Flash 读无需和BLE 相关事件互斥),并使用一个双向链表来管理空余时间状态。在空余的时间执行Flash 操作。从芯片手册可以知道,操作 Flash,特别是擦除时,会占用比较多的时间。为了避免操作 Flash 占用过多的时间片,把每次写或者擦除 Flash,用一个列表来管理,每次写或者擦除操作,插入 Flash 操作链表的最后。 在主循环中检测是否有足够的时间写,如果当前空闲的时间足够,取出 Flash 操作链表中最前的一个节点,执行 Flash 操作,然后将节点移除。对于如何检测空闲时刻,也用一个链表来管理空闲时刻。
将上述方案加入客户工程的步骤示例
小结
- 如果使用此方法中的 Flash 擦除,没有任何 BLE 事件时,直接调用此方法不会执行任何 Flash 的操作。所以当没有蓝牙事件时,可以使用 SDK 默认的 Flash 访问接口或者是手工调度函数,类似这样:flash_list_tick(~0u)
- 工程测试源码参考附件压缩包:BlueNRG Flash vs BLE event handle source code.7z
- 工程路径为:BlueNRG_Demo/BlueNRG-1_2 DK 3.1.0/Project/Supply/BLE_Chat_Master_Slave_WithFlashAccess/
阅读全文