你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Blue NRG-1/2芯片Flash与BLE互斥处理经验分享

[复制链接]
攻城狮Melo 发布时间:2023-4-7 16:24
1. 引言
在许多基于 BlueNRG-1/2 系列芯片的低功耗蓝牙的设计项目时,客户通常会在 Flash 的特定区域存储定制的数据。然而需要特别注意的是,在 BlueNRG-1/2 方案中,用户对 Flash 的读写操作必须在射频空闲的情况下进行,两者是互斥的关系。
: i9 b8 M6 ^6 o6 T/ t
' p/ j" q- ~4 h  O  o" `3 k
2. 问题描述
客户经常反馈类似问题,诸如:当用户程序尝试将用户定制数据写入 Flash 中特定区 域时,发现 BLE 射频部分停止工作,或芯片直接死机了。
8 O7 P: ?. j. ^# t" h1 {, j/ x9 V" y
2.1. 原因分析

6 Q/ U, L0 O$ n( M" a4 @2 d
  • 2.1.1. BlueNRG-1/2 的 Flash 存储应用数据时可能遇到这个问题。因为在擦除一页的过程 中,中断会被关掉大概 20 多 ms, 在此期间,radio 中断是被关掉了的,会导致整个 radio 的状态被延时或者整个 radio 部分的状态被破坏。
    , I, N3 N: T- F" {3 n. ^
  • 2.1.2. ST 的 SDK 虽然提供了访问 Flash 的示例代码,但是当 Flash 操作比较多时,与蓝 牙事件的互斥就比较难处理了;特别是对于一些多连接应用或者同时用了主从、多 种蓝牙事件的场景,互斥就显得更麻烦了。

    ( Q; ]" T9 d* P" U9 c
& J, J& {* k& c: Y! Y$ X
9 F1 u9 j' r1 M
3. 解决办法
使用一个双向链表来管理 Flash 操作(Flash 擦除或者是 Flash 写,Flash 读无需和 BLE 相关事件互斥),并使用一个双向链表来管理空余时间状态。在空余的时间执行 Flash 操作。从芯片手册可以知道,操作 Flash,特别是擦除时,会占用比较多的时间。为 了避免操作 Flash 占用过多的时间片,把每次写或者擦除 Flash,用一个列表来管理,每 次写或者擦除操作,插入 Flash 操作链表的最后。在主循环中检测是否有足够的时间写, 如果当前空闲的时间足够,取出 Flash 操作链表中最前的一个节点,执行 Flash 操作,然 后将节点移除。对于如何检测空闲时刻,也用一个链表来管理空闲时刻。具体思路如下:
5 L: |5 W5 T2 @: s5 L% @


. ?! G  q# J, E. F

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

/ R" x8 B0 f! ^6 |8 `
微信图片_20230407162359.jpg

: {- ^" ^+ A9 n( x# y
第二步:设置之后,重写函数aci_hal_end_of_radio_activity_event,当有事件触发时, 就会进入这个函数。

& }6 y1 }4 k$ |( I! ]
微信图片_20230407162354.png

/ d+ [: W9 |: W0 g7 c- i" v9 W
第三步:构造一个 Flash 操作调度函数,每次进入这个函数,生成一个空闲时刻的节点插 入到链表中。主循环中有个 Flash 操作的调度函数,不停的调度是否有数据需要写入。在 Flash 操作的调度函数中,主要做两件事情,一个是把空闲时间计算出来给到底层的 Flash 操作链表调 度中。另一个是移除过期的节点。9 s/ ~1 P4 m2 ?* p: t
7 s$ P0 G. C3 |5 s4 t8 J
微信图片_20230407162347.png ) M1 {& Q+ k$ k; x; l
3 _! k. L+ r+ w' _( J( h' \7 U3 j/ u
第四步:构造 flash_list_tick 函数,flash_list_tick 函数主要是从 Flash 任务列表中去取节 点,当空余时间满足时,则执行相应的 Flash 操作,然后将节点从任务列表中移除,回收到空闲列表中。/ [) O$ j* k! m7 z
. T8 A3 T9 E! b$ q5 i

$ L! V0 G. h  n/ ^3 ]1 }7 R 微信图片_20230407162344.png ! J0 F1 ?3 H* x


, t) Q' A/ E9 {7 R2 n. X


" k; q! X. B8 `7 ^- Y. L8 |3 e( g
4. 将上述方案加入客户工程的步骤示例


( U1 @9 ~2 N; n, _

1. 初始化相关链表和初始化 radio 事件回调屏蔽。
8 J# M8 Q: n9 ?& z( m! x% B3 @# w" z3 }! A7 F4 c3 w: U# j( N8 @4 w

8 y" Z1 K* `1 A, ^# [" L/ P 微信图片_20230407162340.png - M4 g/ V5 @5 m- A% [! A! i

: F; g) C$ n. C. |
2. 在 aci_hal_end_of_radio_activity_event 中添加空闲链表的更新函数。
; s- @0 H  w3 k$ q% x' s* R6 ?3 O; n

3 W9 N- V9 K: Y- \" e3 G4 ` 微信图片_20230407162335.png
, ~0 O% E% h. k

0 W6 b+ {4 w# N9 p$ y
3. 在主循环中调度。# T/ K( z2 S5 f3 I  h. a

3 G) T3 ~  r0 d+ D$ m8 ?2 g

& m% }7 m2 t, X0 A' J 微信图片_20230407162331.png
2 e5 }7 `& `9 R2 T8 a
3 P( C2 ]; h- {4 @) e
4. 应用操作 Flash 调用接口。
' K0 k' C5 u. ]9 N, u4 k
9 r  ~% n- y! r

$ F. ?" \. C( g8 } 微信图片_20230407162326.png
& F, O& W$ r; @. U

1 \* t# Q% l+ p6 r: o' N
5. 小结
如果使用此方法中的 Flash 擦除,没有任何 BLE 事件时,直接调用此方法不会执行任何 Flash 的操作。所以当没有蓝牙事件时,可以使用 SDK 默认的 Flash 访问接口或者是手工调度函数,类似这样:flash_list_tick(~0u)
& c. n2 X0 R2 a1 L3 G1 k
工程测试源码参考附件压缩包:
BlueNRG Flash vs BLE event handle source code.7z

7 s  z) [+ x; u% d
工程路径为:
BlueNRG_Demo/BlueNRG-1_2DK 3.1.0/Project/Supply/BLE_Chat_Master_Slave_WithFlashAccess/
. `; ~- A9 U7 ?+ v0 F( x
转载自: STM32单片机
如有侵权请联系删除( k  j- p6 M3 }+ d# h  A1 c6 X: v+ ~  z

# {5 b  h  z8 S7 K$ e% ^
. S1 ~4 q1 D+ U9 ]! q
收藏 评论0 发布时间:2023-4-7 16:24

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版