|
1. 引言 在许多基于 BlueNRG-1/2 系列芯片的低功耗蓝牙的设计项目时,客户通常会在 Flash 的特定区域存储定制的数据。然而需要特别注意的是,在 BlueNRG-1/2 方案中,用户对 Flash 的读写操作必须在射频空闲的情况下进行,两者是互斥的关系。 ' U+ e, k2 f4 j ( m; @$ i8 v8 t2 Z& L$ S* n 2. 问题描述 客户经常反馈类似问题,诸如:当用户程序尝试将用户定制数据写入 Flash 中特定区 域时,发现 BLE 射频部分停止工作,或芯片直接死机了。 / l% `" J/ `2 o2 C) b# v/ c 2.1. 原因分析
7 d2 h, M, ?* m; Z 4 H7 w# _+ m, c4 t D1 i 3. 解决办法 使用一个双向链表来管理 Flash 操作(Flash 擦除或者是 Flash 写,Flash 读无需和 BLE 相关事件互斥),并使用一个双向链表来管理空余时间状态。在空余的时间执行 Flash 操作。从芯片手册可以知道,操作 Flash,特别是擦除时,会占用比较多的时间。为 了避免操作 Flash 占用过多的时间片,把每次写或者擦除 Flash,用一个列表来管理,每 次写或者擦除操作,插入 Flash 操作链表的最后。在主循环中检测是否有足够的时间写, 如果当前空闲的时间足够,取出 Flash 操作链表中最前的一个节点,执行 Flash 操作,然 后将节点移除。对于如何检测空闲时刻,也用一个链表来管理空闲时刻。具体思路如下: ( J! F0 @9 V" g ( T) S7 {6 H; M ( W! Z9 \9 t2 L8 i2 K
, I9 p" ]/ E* r7 M, T
/ Z* A8 k3 W7 y 第四步:构造 flash_list_tick 函数,flash_list_tick 函数主要是从 Flash 任务列表中去取节 点,当空余时间满足时,则执行相应的 Flash 操作,然后将节点从任务列表中移除,回收到空闲列表中。. M2 Y X: ]. O- }. w
4. 将上述方案加入客户工程的步骤示例 3 U2 I4 p/ C$ d, g) @ $ g5 P" ^, Y+ Z( p, t0 |2 g2 e
V' m! K: ?, d5 J
9 X$ N0 V( d5 n- D/ k : l& X, g: P- @# g; n$ Q* R
, P) r# v! E. \4 t, _ m+ Q& D J 4. 应用操作 Flash 调用接口。- d9 z7 H! w/ b/ N
5. 小结 如果使用此方法中的 Flash 擦除,没有任何 BLE 事件时,直接调用此方法不会执行任何 Flash 的操作。所以当没有蓝牙事件时,可以使用 SDK 默认的 Flash 访问接口或者是手工调度函数,类似这样:flash_list_tick(~0u) : D) a+ u, I+ r# a% j* z/ t 工程测试源码参考附件压缩包: BlueNRG Flash vs BLE event handle source code.7z ( P( p) @* Z! z 工程路径为: BlueNRG_Demo/BlueNRG-1_2DK 3.1.0/Project/Supply/BLE_Chat_Master_Slave_WithFlashAccess/ 转载自: STM32单片机 如有侵权请联系删除 ( S! t7 h" A5 W2 s |
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
微信公众号
手机版