谷动谷力

 找回密码
 立即注册
查看: 729|回复: 0
收起左侧

【应用笔记】Blue NRG-1/2系列芯片Flash操作与BLE事件的互斥处理

[复制链接]
发表于 2023-4-6 22:34:27 | 显示全部楼层 |阅读模式
【应用笔记】Blue NRG-1/2系列芯片Flash操作与BLE事件的互斥处理
# k; v- A7 z7 f% P+ t" b# X  P+ z: F! x/ ?; }

5 v- Y' T1 V+ Q$ \9 H
在许多基于 BlueNRG-1/2 系列芯片的低功耗蓝牙的设计项目时,客户通常会在 Flash的特定区域存储定制的数据。然而需要特别注意的是,在 BlueNRG-1/2 方案中,用户对Flash 的读写操作必须在射频空闲的情况下进行,两者是互斥的关系。本文档描述Blue NRG-1/2系列芯片Flash操作与BLE事件的互斥处理的流程和步骤。
9 m. |/ `" m3 P$ `
目录预览
1 引言
2 问题描述! R% ^- L# ~" l: f
3 解决办法
4 将上述方案加入客户工程的步骤示例
5 小结

: {% l& n. b3 m) E4 A* O
, H1 z9 H0 k5 A  o& B* ?( S, e1 B
1. 引言
在许多基于 BlueNRG-1/2 系列芯片的低功耗蓝牙的设计项目时,客户通常会在 Flash 的特定区域存储定制的数据。然而需要特别注意的是,在 BlueNRG-1/2 方案中,用户对 Flash 的读写操作必须在射频空闲的情况下进行,两者是互斥的关系。

* y4 \& Q% f4 o6 l- m8 }  i9 M" v! c% n: |* O0 O+ i/ V* \7 l
2. 问题描述
客户经常反馈类似问题,诸如:当用户程序尝试将用户定制数据写入 Flash 中特定区 域时,发现 BLE 射频部分停止工作,或芯片直接死机了。
0 m4 L! ~* y0 o8 l" a, m
2.1. 原因分析
* g2 d1 P8 L& ]/ m: }
  • 2.1.1. BlueNRG-1/2 的 Flash 存储应用数据时可能遇到这个问题。因为在擦除一页的过程 中,中断会被关掉大概 20 多 ms, 在此期间,radio 中断是被关掉了的,会导致整个 radio 的状态被延时或者整个 radio 部分的状态被破坏。
  • 2.1.2. ST 的 SDK 虽然提供了访问 Flash 的示例代码,但是当 Flash 操作比较多时,与蓝 牙事件的互斥就比较难处理了;特别是对于一些多连接应用或者同时用了主从、多 种蓝牙事件的场景,互斥就显得更麻烦了。

    8 H" K0 ~: P+ ?/ h# i- Z
) Z) ?8 W# `9 z* L$ a4 h" I
# S' u- k/ w  f) s  W
3. 解决办法
使用一个双向链表来管理 Flash 操作(Flash 擦除或者是 Flash 写,Flash 读无需和 BLE 相关事件互斥),并使用一个双向链表来管理空余时间状态。在空余的时间执行 Flash 操作。从芯片手册可以知道,操作 Flash,特别是擦除时,会占用比较多的时间。为 了避免操作 Flash 占用过多的时间片,把每次写或者擦除 Flash,用一个列表来管理,每 次写或者擦除操作,插入 Flash 操作链表的最后。在主循环中检测是否有足够的时间写, 如果当前空闲的时间足够,取出 Flash 操作链表中最前的一个节点,执行 Flash 操作,然 后将节点移除。对于如何检测空闲时刻,也用一个链表来管理空闲时刻。具体思路如下:
/ ~6 k1 U- c* j% ?% {1 K# W
' e) m# y' ~: y6 u
第一步:初始化时需要设置 radio active 事件抛到应用。aci_hal_set_radio_activity_mask(0x0001|0x0002|0x0004|0x0008|0x0010|0x0020)
- M. W1 v' v! E
0?wx_fmt=png.jpg
7 w. c; {# {+ s: j3 @3 S& g
第二步:设置之后,重写函数aci_hal_end_of_radio_activity_event,当有事件触发时, 就会进入这个函数。
& c$ \/ o8 W) n0 ?0 H7 }7 s
640?wx_fmt=png.jpg
2 k+ u3 Q. A$ q6 ^1 C- s5 _
第三步:构造一个 Flash 操作调度函数,每次进入这个函数,生成一个空闲时刻的节点插 入到链表中。主循环中有个 Flash 操作的调度函数,不停的调度是否有数据需要写入。在 Flash 操作的调度函数中,主要做两件事情,一个是把空闲时间计算出来给到底层的 Flash 操作链表调 度中。另一个是移除过期的节点。! R, D7 ], F* K. Y& y: t
640?wx_fmt=png.jpg
" P1 y6 y  M( W3 d# k
第四步:构造 flash_list_tick 函数,flash_list_tick 函数主要是从 Flash 任务列表中去取节 点,当空余时间满足时,则执行相应的 Flash 操作,然后将节点从任务列表中移除,回收到空闲列表中。
9 i' O( H1 Z$ @1 o+ k2 m# Q
640?wx_fmt=png.jpg
- C" `0 ^& ?+ i! R
; V& I. v! j; Q! z, }
4. 将上述方案加入客户工程的步骤示例

  [$ v. r) a1 K' I, b' v/ l; J8 N& Z: [+ t: u
1. 初始化相关链表和初始化 radio 事件回调屏蔽。
/ Q( I9 g  `+ D3 S2 L' ]
640?wx_fmt=png.jpg

6 h5 e8 U1 o' T6 W5 c2. 在 aci_hal_end_of_radio_activity_event 中添加空闲链表的更新函数。
640?wx_fmt=png.jpg

, x8 j+ N2 ?1 o+ l0 F) M3. 在主循环中调度。2 J7 k2 b8 H+ n0 X8 M
640?wx_fmt=png.jpg
& k5 b( ]( P* h4 w. e; f! `6 N1 Q
4. 应用操作 Flash 调用接口。
5 E3 U2 n( f& X; N9 y
640?wx_fmt=png.jpg

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

4 R2 Z3 x5 A3 L' X0 |, a
工程测试源码参考附件压缩包:
BlueNRG Flash vs BLE event handle source code.7z
, o7 M" }% w: ?4 n3 r
工程路径为:
BlueNRG_Demo/BlueNRG-1_2DK 3.1.0/Project/Supply/BLE_Chat_Master_Slave_WithFlashAccess/

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-3-29 07:36 , Processed in 0.088764 second(s), 40 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表