引言
在許多基于 BlueNRG-1/2 系列芯片的低功耗藍(lán)牙的設(shè)計項(xiàng)目時,客戶通常會在 Flash的特定區(qū)域存儲定制的數(shù)據(jù)。然而需要特別注意的是,在 BlueNRG-1/2 方案中,用戶對Flash 的讀寫操作必須在射頻空閑的情況下進(jìn)行,兩者是互斥的關(guān)系。
問題描述
客戶經(jīng)常反饋類似問題,諸如:當(dāng)用戶程序嘗試將用戶定制數(shù)據(jù)寫入 Flash 中特定區(qū)域時,發(fā)現(xiàn) BLE 射頻部分停止工作,或芯片直接死機(jī)了。
解決辦法
使用一個雙向鏈表來管理 Flash 操作(Flash 擦除或者是 Flash 寫,F(xiàn)lash 讀無需和BLE 相關(guān)事件互斥),并使用一個雙向鏈表來管理空余時間狀態(tài)。在空余的時間執(zhí)行Flash 操作。從芯片手冊可以知道,操作 Flash,特別是擦除時,會占用比較多的時間。為了避免操作 Flash 占用過多的時間片,把每次寫或者擦除 Flash,用一個列表來管理,每次寫或者擦除操作,插入 Flash 操作鏈表的最后。 在主循環(huán)中檢測是否有足夠的時間寫,如果當(dāng)前空閑的時間足夠,取出 Flash 操作鏈表中最前的一個節(jié)點(diǎn),執(zhí)行 Flash 操作,然后將節(jié)點(diǎn)移除。對于如何檢測空閑時刻,也用一個鏈表來管理空閑時刻。
將上述方案加入客戶工程的步驟示例
小結(jié)
- 如果使用此方法中的 Flash 擦除,沒有任何 BLE 事件時,直接調(diào)用此方法不會執(zhí)行任何 Flash 的操作。所以當(dāng)沒有藍(lán)牙事件時,可以使用 SDK 默認(rèn)的 Flash 訪問接口或者是手工調(diào)度函數(shù),類似這樣:flash_list_tick(~0u)
- 工程測試源碼參考附件壓縮包:BlueNRG Flash vs BLE event handle source code.7z
- 工程路徑為:BlueNRG_Demo/BlueNRG-1_2 DK 3.1.0/Project/Supply/BLE_Chat_Master_Slave_WithFlashAccess/