在許多基于 BlueNRG-1/2 系列芯片的低功耗藍(lán)牙的設(shè)計(jì)項(xiàng)目時(shí),客戶通常會(huì)在 Flash的特定區(qū)域存儲(chǔ)定制的數(shù)據(jù)。然而需要特別注意的是,在 BlueNRG-1/2 方案中,用戶對(duì)Flash 的讀寫操作必須在射頻空閑的情況下進(jìn)行,兩者是互斥的關(guān)系。本文檔描述Blue NRG-1/2系列芯片F(xiàn)lash操作與BLE事件的互斥處理的流程和步驟。
目錄預(yù)覽
1 引言
2 問(wèn)題描述
3 解決辦法
4 將上述方案加入客戶工程的步驟示例
5 小結(jié)
1. 引言
在許多基于 BlueNRG-1/2 系列芯片的低功耗藍(lán)牙的設(shè)計(jì)項(xiàng)目時(shí),客戶通常會(huì)在 Flash 的特定區(qū)域存儲(chǔ)定制的數(shù)據(jù)。然而需要特別注意的是,在 BlueNRG-1/2 方案中,用戶對(duì) Flash 的讀寫操作必須在射頻空閑的情況下進(jìn)行,兩者是互斥的關(guān)系。
2. 問(wèn)題描述
客戶經(jīng)常反饋類似問(wèn)題,諸如:當(dāng)用戶程序嘗試將用戶定制數(shù)據(jù)寫入 Flash 中特定區(qū)域時(shí),發(fā)現(xiàn) BLE 射頻部分停止工作,或芯片直接死機(jī)了。
2.1. 原因分析
-
2.1.1. BlueNRG-1/2 的 Flash 存儲(chǔ)應(yīng)用數(shù)據(jù)時(shí)可能遇到這個(gè)問(wèn)題。因?yàn)樵诓脸豁?yè)的過(guò)程中,中斷會(huì)被關(guān)掉大概 20 多 ms, 在此期間,radio 中斷是被關(guān)掉了的,會(huì)導(dǎo)致整個(gè)radio 的狀態(tài)被延時(shí)或者整個(gè) radio 部分的狀態(tài)被破壞。
-
2.1.2. ST 的 SDK 雖然提供了訪問(wèn) Flash 的示例代碼,但是當(dāng) Flash 操作比較多時(shí),與藍(lán)牙事件的互斥就比較難處理了;特別是對(duì)于一些多連接應(yīng)用或者同時(shí)用了主從、多種藍(lán)牙事件的場(chǎng)景,互斥就顯得更麻煩了。
3.解決辦法
使用一個(gè)雙向鏈表來(lái)管理 Flash 操作(Flash 擦除或者是 Flash 寫,F(xiàn)lash 讀無(wú)需和 BLE 相關(guān)事件互斥),并使用一個(gè)雙向鏈表來(lái)管理空余時(shí)間狀態(tài)。在空余的時(shí)間執(zhí)行 Flash 操作。從芯片手冊(cè)可以知道,操作 Flash,特別是擦除時(shí),會(huì)占用比較多的時(shí)間。為 了避免操作 Flash 占用過(guò)多的時(shí)間片,把每次寫或者擦除 Flash,用一個(gè)列表來(lái)管理,每 次寫或者擦除操作,插入 Flash 操作鏈表的最后。在主循環(huán)中檢測(cè)是否有足夠的時(shí)間寫, 如果當(dāng)前空閑的時(shí)間足夠,取出 Flash 操作鏈表中最前的一個(gè)節(jié)點(diǎn),執(zhí)行 Flash 操作,然 后將節(jié)點(diǎn)移除。對(duì)于如何檢測(cè)空閑時(shí)刻,也用一個(gè)鏈表來(lái)管理空閑時(shí)刻。具體思路如下:
第一步:初始化時(shí)需要設(shè)置 radio active 事件拋到應(yīng)用。aci_hal_set_radio_activity_mask(0x0001|0x0002|0x0004|0x0008|0x0010|0x0020)
第二步:設(shè)置之后,重寫函數(shù)aci_hal_end_of_radio_activity_event,當(dāng)有事件觸發(fā)時(shí), 就會(huì)進(jìn)入這個(gè)函數(shù)。
第三步:構(gòu)造一個(gè) Flash 操作調(diào)度函數(shù),每次進(jìn)入這個(gè)函數(shù),生成一個(gè)空閑時(shí)刻的節(jié)點(diǎn)插 入到鏈表中。主循環(huán)中有個(gè) Flash 操作的調(diào)度函數(shù),不停的調(diào)度是否有數(shù)據(jù)需要寫入。在 Flash 操作的調(diào)度函數(shù)中,主要做兩件事情,一個(gè)是把空閑時(shí)間計(jì)算出來(lái)給到底層的 Flash 操作鏈表調(diào) 度中。另一個(gè)是移除過(guò)期的節(jié)點(diǎn)。
第四步:構(gòu)造 flash_list_tick 函數(shù),flash_list_tick 函數(shù)主要是從 Flash 任務(wù)列表中去取節(jié) 點(diǎn),當(dāng)空余時(shí)間滿足時(shí),則執(zhí)行相應(yīng)的 Flash 操作,然后將節(jié)點(diǎn)從任務(wù)列表中移除,回收到空閑列表中。
4.將上述方案加入客戶工程的步驟示例
1. 初始化相關(guān)鏈表和初始化 radio 事件回調(diào)屏蔽。
2. 在 aci_hal_end_of_radio_activity_event 中添加空閑鏈表的更新函數(shù)。
3. 在主循環(huán)中調(diào)度。
4. 應(yīng)用操作 Flash 調(diào)用接口。
5. 小結(jié)
如果使用此方法中的 Flash 擦除,沒(méi)有任何 BLE 事件時(shí),直接調(diào)用此方法不會(huì)執(zhí)行任何 Flash 的操作。所以當(dāng)沒(méi)有藍(lán)牙事件時(shí),可以使用 SDK 默認(rèn)的 Flash 訪問(wèn)接口或者是手工調(diào)度函數(shù),類似這樣:flash_list_tick(~0u)
工程測(cè)試源碼參考附件壓縮包:
BlueNRG Flash vs BLE event handle source code.7z
工程路徑為:
BlueNRG_Demo/BlueNRG-1_2DK 3.1.0/Project/Supply/BLE_Chat_Master_Slave_WithFlashAccess/
本文檔描述Blue NRG-1/2系列芯片F(xiàn)lash操作與BLE事件的互斥處理的流程和步驟。由于文章篇幅有限僅展示部分信息,完整內(nèi)容請(qǐng)點(diǎn)擊“閱讀原文”下載原文檔。
長(zhǎng)按掃碼關(guān)注公眾號(hào)
更多資訊,盡在STM32
▽點(diǎn)擊“閱讀原文”,可下載原文檔
原文標(biāo)題:應(yīng)用筆記|Blue NRG-1/2系列芯片F(xiàn)lash操作與BLE事件的互斥處理
文章出處:【微信公眾號(hào):STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
單片機(jī)
+關(guān)注
關(guān)注
6037文章
44561瀏覽量
635589 -
STM32
+關(guān)注
關(guān)注
2270文章
10901瀏覽量
356196
原文標(biāo)題:應(yīng)用筆記|Blue NRG-1/2系列芯片F(xiàn)lash操作與BLE事件的互斥處理
文章出處:【微信號(hào):STM32_STM8_MCU,微信公眾號(hào):STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論