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

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

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

5 B/ `, A1 L) `6 X

  P3 Z* }3 v4 @. }  ]
2. 问题描述
客户经常反馈类似问题,诸如:当用户程序尝试将用户定制数据写入 Flash 中特定区 域时,发现 BLE 射频部分停止工作,或芯片直接死机了。
$ E; Z% B+ w( ]& I
2.1. 原因分析
" s: t- e8 ~$ d  `
  • 2.1.1. BlueNRG-1/2 的 Flash 存储应用数据时可能遇到这个问题。因为在擦除一页的过程 中,中断会被关掉大概 20 多 ms, 在此期间,radio 中断是被关掉了的,会导致整个 radio 的状态被延时或者整个 radio 部分的状态被破坏。

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

    1 O  P( m3 I5 H( P

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

/ F! D+ f: p8 q) G: i& x8 t2 R


# N" s' D9 _0 ^' V

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

! S' A" }! d7 R; `% s4 a; r' N
微信图片_20230407162359.jpg
' b! C$ S2 Q' d
第二步:设置之后,重写函数aci_hal_end_of_radio_activity_event,当有事件触发时, 就会进入这个函数。
' F. H; ?2 V. o! f; Y8 s8 k8 k
微信图片_20230407162354.png
5 I- S, ^' H9 N  j$ J2 F* u
第三步:构造一个 Flash 操作调度函数,每次进入这个函数,生成一个空闲时刻的节点插 入到链表中。主循环中有个 Flash 操作的调度函数,不停的调度是否有数据需要写入。在 Flash 操作的调度函数中,主要做两件事情,一个是把空闲时间计算出来给到底层的 Flash 操作链表调 度中。另一个是移除过期的节点。
+ N4 Q% g2 |1 T4 `; ]% y
" ?" ?% L. k, }5 y' s. p- o
微信图片_20230407162347.png - n2 L% I& g8 e$ U+ D
% r: n) K# C+ {0 ?" k4 `, t
第四步:构造 flash_list_tick 函数,flash_list_tick 函数主要是从 Flash 任务列表中去取节 点,当空余时间满足时,则执行相应的 Flash 操作,然后将节点从任务列表中移除,回收到空闲列表中。
8 a+ h* A. s, D2 U, M* J/ d4 M) M3 X2 }9 R$ k

  c: X$ q8 c! _6 u. V: X0 W9 v 微信图片_20230407162344.png
' d: i$ w, u3 k% n9 ?3 E( ]

5 j& n) n" d' \7 M8 h7 A


, d! o) Z, E7 `$ I3 |- r5 u; ?
4. 将上述方案加入客户工程的步骤示例

& ?. H$ k; @# P, V+ s8 X

1. 初始化相关链表和初始化 radio 事件回调屏蔽。4 L: l# _& k: `+ W2 J' J2 ^# o3 P2 e

  n$ E3 g7 [# w$ n4 r# U
" c5 z1 r1 @& W# E
微信图片_20230407162340.png 1 o; b6 N+ o) V

+ T; {" f7 I1 W$ O
2. 在 aci_hal_end_of_radio_activity_event 中添加空闲链表的更新函数。6 o& A$ T) N1 }5 U, a! E6 p6 R

7 a% `. H9 ^* o' F& H
' E- G: B: _1 m
微信图片_20230407162335.png ( U4 Z1 s. ?2 a4 l3 o& A

' l( p( X, V$ z
3. 在主循环中调度。& i1 K1 q1 w! J3 j5 D' X

! U8 j- F; ^) q  K, v
- R/ c+ ^* @" W0 M9 ?
微信图片_20230407162331.png ( c" S% ?+ ?$ W6 t7 D3 Q: V( e" P

1 O3 @0 R. M( J# o7 g6 Q
4. 应用操作 Flash 调用接口。/ }' E! v' o, L1 J# K+ f9 P
% F" S. _' L; S* M8 L5 s
  {$ J' U5 k3 w+ V' G* r1 v/ W' K
微信图片_20230407162326.png
2 b7 c% m6 v5 y6 t
5 q$ J2 I( i$ q( u9 [
5. 小结
如果使用此方法中的 Flash 擦除,没有任何 BLE 事件时,直接调用此方法不会执行任何 Flash 的操作。所以当没有蓝牙事件时,可以使用 SDK 默认的 Flash 访问接口或者是手工调度函数,类似这样:flash_list_tick(~0u)

7 V6 a# q  `1 Q9 E- R
工程测试源码参考附件压缩包:
BlueNRG Flash vs BLE event handle source code.7z
/ t8 N( y. W4 c
工程路径为:
BlueNRG_Demo/BlueNRG-1_2DK 3.1.0/Project/Supply/BLE_Chat_Master_Slave_WithFlashAccess/

/ v3 z) D- X. ~3 x! Q- Z
转载自: STM32单片机
如有侵权请联系删除. Z0 Y2 b6 ~: }. w2 X; ~0 U/ g

7 Z( W, N; w1 \$ Y: N. m8 ~2 ?0 m- K' M# i5 @& Z
赞 收藏 评论0 发布时间:2023-4-7 16:24

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版