谷动谷力

标题: 【应用笔记】Blue NRG-1/2系列芯片Flash操作与BLE事件的互斥处理 [打印本页]

作者: sunsili    时间: 2023-4-6 22:34
标题: 【应用笔记】Blue NRG-1/2系列芯片Flash操作与BLE事件的互斥处理
【应用笔记】Blue NRG-1/2系列芯片Flash操作与BLE事件的互斥处理


在许多基于 BlueNRG-1/2 系列芯片的低功耗蓝牙的设计项目时,客户通常会在 Flash的特定区域存储定制的数据。然而需要特别注意的是,在 BlueNRG-1/2 方案中,用户对Flash 的读写操作必须在射频空闲的情况下进行,两者是互斥的关系。本文档描述Blue NRG-1/2系列芯片Flash操作与BLE事件的互斥处理的流程和步骤。

目录预览
1 引言
2 问题描述
3 解决办法
4 将上述方案加入客户工程的步骤示例
5 小结


1. 引言
在许多基于 BlueNRG-1/2 系列芯片的低功耗蓝牙的设计项目时,客户通常会在 Flash 的特定区域存储定制的数据。然而需要特别注意的是,在 BlueNRG-1/2 方案中,用户对 Flash 的读写操作必须在射频空闲的情况下进行,两者是互斥的关系。


2. 问题描述
客户经常反馈类似问题,诸如:当用户程序尝试将用户定制数据写入 Flash 中特定区 域时,发现 BLE 射频部分停止工作,或芯片直接死机了。

2.1. 原因分析



3. 解决办法
使用一个双向链表来管理 Flash 操作(Flash 擦除或者是 Flash 写,Flash 读无需和 BLE 相关事件互斥),并使用一个双向链表来管理空余时间状态。在空余的时间执行 Flash 操作。从芯片手册可以知道,操作 Flash,特别是擦除时,会占用比较多的时间。为 了避免操作 Flash 占用过多的时间片,把每次写或者擦除 Flash,用一个列表来管理,每 次写或者擦除操作,插入 Flash 操作链表的最后。在主循环中检测是否有足够的时间写, 如果当前空闲的时间足够,取出 Flash 操作链表中最前的一个节点,执行 Flash 操作,然 后将节点移除。对于如何检测空闲时刻,也用一个链表来管理空闲时刻。具体思路如下:


第一步:初始化时需要设置 radio active 事件抛到应用。aci_hal_set_radio_activity_mask(0x0001|0x0002|0x0004|0x0008|0x0010|0x0020)

第二步:设置之后,重写函数aci_hal_end_of_radio_activity_event,当有事件触发时, 就会进入这个函数。

第三步:构造一个 Flash 操作调度函数,每次进入这个函数,生成一个空闲时刻的节点插 入到链表中。主循环中有个 Flash 操作的调度函数,不停的调度是否有数据需要写入。在 Flash 操作的调度函数中,主要做两件事情,一个是把空闲时间计算出来给到底层的 Flash 操作链表调 度中。另一个是移除过期的节点。

第四步:构造 flash_list_tick 函数,flash_list_tick 函数主要是从 Flash 任务列表中去取节 点,当空余时间满足时,则执行相应的 Flash 操作,然后将节点从任务列表中移除,回收到空闲列表中。


4. 将上述方案加入客户工程的步骤示例


1. 初始化相关链表和初始化 radio 事件回调屏蔽。

2. 在 aci_hal_end_of_radio_activity_event 中添加空闲链表的更新函数。

3. 在主循环中调度。

4. 应用操作 Flash 调用接口。

5. 小结
如果使用此方法中的 Flash 擦除,没有任何 BLE 事件时,直接调用此方法不会执行任何 Flash 的操作。所以当没有蓝牙事件时,可以使用 SDK 默认的 Flash 访问接口或者是手工调度函数,类似这样:flash_list_tick(~0u)

工程测试源码参考附件压缩包:
BlueNRG Flash vs BLE event handle source code.7z

工程路径为:
BlueNRG_Demo/BlueNRG-1_2DK 3.1.0/Project/Supply/BLE_Chat_Master_Slave_WithFlashAccess/

本文档描述Blue NRG-1/2系列芯片Flash操作与BLE事件的互斥处理的流程和步骤。 由于文章篇幅有限仅展示部分信息,完整内容请点击“阅读原文”下载原文档。





欢迎光临 谷动谷力 (http://bbs.sunsili.com/) Powered by Discuz! X3.2