
1. 引言 在许多基于 BlueNRG-1/2 系列芯片的低功耗蓝牙的设计项目时,客户通常会在 Flash 的特定区域存储定制的数据。然而需要特别注意的是,在 BlueNRG-1/2 方案中,用户对 Flash 的读写操作必须在射频空闲的情况下进行,两者是互斥的关系。 1 k" ^9 u8 |' Z3 h( K1 ~ 2. 问题描述 客户经常反馈类似问题,诸如:当用户程序尝试将用户定制数据写入 Flash 中特定区 域时,发现 BLE 射频部分停止工作,或芯片直接死机了。 2.1. 原因分析 ' [$ J# H9 g9 ^% b* c$ e& S
: n) D. i! q/ r' @* w 3. 解决办法 使用一个双向链表来管理 Flash 操作(Flash 擦除或者是 Flash 写,Flash 读无需和 BLE 相关事件互斥),并使用一个双向链表来管理空余时间状态。在空余的时间执行 Flash 操作。从芯片手册可以知道,操作 Flash,特别是擦除时,会占用比较多的时间。为 了避免操作 Flash 占用过多的时间片,把每次写或者擦除 Flash,用一个列表来管理,每 次写或者擦除操作,插入 Flash 操作链表的最后。在主循环中检测是否有足够的时间写, 如果当前空闲的时间足够,取出 Flash 操作链表中最前的一个节点,执行 Flash 操作,然 后将节点移除。对于如何检测空闲时刻,也用一个链表来管理空闲时刻。具体思路如下: # R6 ^, }! i5 H / I# ^3 ]; f, @* j ![]() % d# X; z! c( p! p$ `2 H1 q: \ 第二步:设置之后,重写函数aci_hal_end_of_radio_activity_event,当有事件触发时, 就会进入这个函数。3 g+ }0 S" Y0 f) r' W ![]() 7 W8 ]3 F) r1 U 第三步:构造一个 Flash 操作调度函数,每次进入这个函数,生成一个空闲时刻的节点插 入到链表中。主循环中有个 Flash 操作的调度函数,不停的调度是否有数据需要写入。在 Flash 操作的调度函数中,主要做两件事情,一个是把空闲时间计算出来给到底层的 Flash 操作链表调 度中。另一个是移除过期的节点。![]() 3 M4 i) g( J A& q 第四步:构造 flash_list_tick 函数,flash_list_tick 函数主要是从 Flash 任务列表中去取节 点,当空余时间满足时,则执行相应的 Flash 操作,然后将节点从任务列表中移除,回收到空闲列表中。1 R: h# p5 I/ G& N3 l+ w% O/ l- X3 \' f2 o' g% S6 b/ N' M9 N . F0 _2 `2 s4 f) Q8 s' y ![]() 9 v- @, s3 m9 n% b1 C2 M/ ~! p& G 4. 将上述方案加入客户工程的步骤示例 8 n8 S* a( \+ }/ ^6 g' J 4 V3 Q g. g0 t6 r- U; ~ ![]() % q# _8 k* D! m) ~0 f 2. 在 aci_hal_end_of_radio_activity_event 中添加空闲链表的更新函数。" ?4 Y4 `7 G! t ![]() ( k/ N5 x6 J: V* e' z& M ![]() $ [7 v9 ?% S" ?1 s4 \ 4. 应用操作 Flash 调用接口。$ S4 X. E/ X7 O" j/ `+ m, W ![]() 5. 小结 如果使用此方法中的 Flash 擦除,没有任何 BLE 事件时,直接调用此方法不会执行任何 Flash 的操作。所以当没有蓝牙事件时,可以使用 SDK 默认的 Flash 访问接口或者是手工调度函数,类似这样:flash_list_tick(~0u) ; a9 Z; }( a( n. ` 工程测试源码参考附件压缩包: BlueNRG Flash vs BLE event handle source code.7z - D/ E) Z; v) X5 [; R! e6 } 工程路径为: BlueNRG_Demo/BlueNRG-1_2DK 3.1.0/Project/Supply/BLE_Chat_Master_Slave_WithFlashAccess/ 转载自: STM32单片机 如有侵权请联系删除- F5 W1 i5 t: k , j% s5 e% f9 y: |- r, E& ` |
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南
ST 微控制器电磁兼容性 (EMC) 设计指南
适用于STM32微控制器的ΣΔ数字接口入门