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