Nordic--nrf52832--DFU

nRF52832 空中升級 DPU 的概念 :

 在做 BLE 應用開發時,很多時候需要對應用程序進行升級,來修復一些 bug 或者進行功能升級。nRF52832 支持固件無線(低功耗藍牙方式)升級,對當前的應用程序進行更新。用戶可以通過 Iphone 手機(Iphone4 以上)、Windows 系統的電腦、安卓 4.3及以上支持藍牙 4.0 的手機,配合 Nordic Semiconductor 的相關軟件工具,對 nRF52832設備進行 OTA 固件升級。如下圖所示:

在這裏插入圖片描述
上圖首先通過雲端將需要升級的固件文件下發到手機 APP,由手機端 APP 觸發升級流程。下面的內容我們就來涉及這幾個問題。

DFU 的 的 Flash 空間佈局詳解:

在這裏插入圖片描述

協議棧和 bootloader 升級

 下圖是 SDK11 的 FLASH 的內部空間佈局, 我們主要談與早期協議棧版本的區別。早期nRF5x芯片在flash操作上有個限制,爲了保護softdevice協議棧不被破壞,它禁止了應用程序 app 調用 flash 操作函數去讀寫協議棧區。所以早期的升級是無法更新softdevice 的,所以之前那篇講義講 6.0 協議棧的時候只談到了應用程序的更新。

 爲了實現 softdevice 的升級 Nordic 官方推出了新的 softdevice 7.0 之後的版本,在協議棧 sd 下面有一個 MBR,用來升級 sd 協議棧和 bootloader 時候用的。升級協議棧和bootloader 的過程如下圖所示:

在這裏插入圖片描述
圖中,OTG 升級的時候,首先把 app 應用程序區裏的應用程序擦除,變成空的 free,然後把新的協議棧和新的 bootloader 寫入到應用程序區。最好通過調用 MBR 中的 Flash操作函數實現兩個部分的更新,而 MBR 區是受保護的,不會變化。
空間分配如下:
SoftDevice/MBR : 用 於 存 放 SoftDevice , 存 儲 空 間 地 址 範 圍 :0x00000000+MBR+SoftDevice。
Appcation Area:用於存放應用程序代碼(Bank0)、待升級應用程序(Bank1)和私有數據、DFU Bootloader 代碼。

各個存儲區域劃分的請查處不同協議棧版本的說明,圖示所示爲協議棧 S132 SoftDevice v2.0.0-7.alpha:
在這裏插入圖片描述

應用程序升級

應用程序升級分兩類:

1:Dual Bank Flash 佈局

如圖所示:Dual-bank 在更新過程中會先將新的 app 放在 falsh 中,等全部接收完了。然後會檢驗收到的 app 是否有效,如果有效就替換掉現有的 app。這樣即使新的app 是無效的,至少還有舊的 app 可以運行。
在這裏插入圖片描述

2.Single Bank Flash 佈局

 Single-bank 模式是在更新過程中就直接開始用新的 app 覆蓋舊的,因爲不需要在 falsh 中放兩個 app,這種情況可以更新更大的 app,缺點是一旦傳輸錯誤。會導致新舊 app 都無法使用了。
在這裏插入圖片描述
 可以對比下前面的 bootloader 和 sd 的更新只能用 dual-bank 模式,因爲使用single_bank 模式,一旦傳輸錯誤設備就無法啓動了,就只能通過 flash 工具重新燒寫了。而應用程序更新 dual 或 single 模式都可以。即使出錯設備因爲 bootloader 還在就可以再下載 app。

DPU 的運行原理

 在 nRF52832 中,我們確定使用 Dual bank 的方式進行 OTG 升級,也就是稱爲DFU。設備燒錄了 bootloader 程序後,設備會工作在 DFU 模式,這時可以使用手機 DFU工具或者 PC 端的 Master Control Panel 軟件(配合 dongle)對設備進行 DFU 操作。設備上電完成後,系統會先運行 bootloader,bootloader 會判斷在 bank0、是否有應用程序。如果在 bank0 中有應用程序,bootloader 會去執行應用程序,否則系統會一直處在 DFU 模式,等待應用程序更新。系統的執行流程框架圖如下圖所示:
在這裏插入圖片描述
1.在升級程序之前,當前的應用程序存放在 Bank 0,此時 Bank 1 的存儲空間未被使用。

在這裏插入圖片描述

2.Bootloader 進入 DFU 模式會將 Bank 1 區域擦除,用於存放將要升級的應用程序數據,只有接收的數據校驗成功,纔會去擦除 Bank0 的程序,這可以確保當升級程序失敗時,舊的應用程序還可以正常運行,不至於系統停止運行。

在這裏插入圖片描述

3.將接收到的新應用程序的數據包寫入 Bank 1。

在這裏插入圖片描述

4.完成將待升級的應用程序完成寫入 Bank 1 中後,新應用程序和舊的應用程序都會存在 Flash 存儲空間中,這樣可以確保當新的應用程序無法啓動時,還可以運行舊的應用程序。

在這裏插入圖片描述

5.待新接收的數據檢驗成功後,Bank 0 中的舊應用程序會被擦除。

在這裏插入圖片描述

6.將 Bank 1 中的數據拷貝到 Bank 0 也是激活新應用程序的一部分。

在這裏插入圖片描述

7.完成 Bank 1 到 Bank 0 數據的拷貝後,會開始運行 Bank0 的應用程序。Bank 1 中數據不會被擦除,等待再次進入 bootloaderDFU 模式才擦除 Bank1 數據。

在這裏插入圖片描述

8.如果設置了將舊應用程序的數據保留,新的應用程序會將其數據在原有數據存儲空間上疊加存儲,不會覆蓋。這就是 single Bank 和 Dual Bank 的區別了。

DFU升級文件的生成

在這裏插入圖片描述
首先需要準備兩個工程,一個是 BOOTLOAD 工
程,一個是帶 DFU 的應用工程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章