BlueNRG系列芯片Flash操作与BLE事件的互斥处理

1. 引言

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

2. 问题描述

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

2.1. 原因分析

2.1.1. BlueNRG-1/2 的 Flash 存储应用数据时可能遇到这个问题。因为在擦除一页的过程中,中断会被关掉大概 20 多 ms, 在此期间,radio 中断是被关掉了的,会导致整个radio 的状态被延时或者整个 radio 部分的状态被破坏。

2.1.2. ST 的 SDK 虽然提供了访问 Flash 的示例代码,但是当 Flash 操作比较多时,与蓝牙事件的互斥就比较难处理了;特别是对于一些多连接应用或者同时用了主从、多种蓝牙事件的场景,互斥就显得更麻烦了。

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);

图1.将 radio active 事件抛到应用程序
图1.将 radio active 事件抛到应用程序
第二步:设置之后,重写函数 aci_hal_end_of_radio_activity_event,当有事件触发时,就会进入这个函数。

图2.重写函数 aci_hal_end_of_radio_activity_event
图2.重写函数 aci_hal_end_of_radio_activity_event

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

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

图4.flash_list_tick 函数
图4.flash_list_tick 函数

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

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

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

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

图6.添加空闲链表的更新函数
在这里插入图片描述

  1. 在主循环中调度。

图7.在主循环中调度
在这里插入图片描述

  1. 应用操作 Flash 调用接口

图8.应用操作 Flash 调用接口
在这里插入图片描述

5. 小结

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

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

  3. 工程路径为:
    BlueNRG_Demo/BlueNRG-1_2 DK 3.1.0/Project/Supply/BLE_Chat_Master_Slave_WithFlashAccess/

文档中所用到的工具及版本

软件包:BlueNRG-1_2 DK 3.1.0
评估板:STEVAL-IDB007V2 (BlueNRG-1) 或 STEVAL-IDB008V2 (BlueNRG-2)

LAT 中的附件

BlueNRG Flash vs BLE event handle source code.7z


本文档参考ST官方的《【应用笔记】LAT1216+BlueNRG系列芯片Flash操作与BLE事件的互斥处理》文档。
参考下载地址:https://download.csdn.net/download/u014319604/88969449

  • 27
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值