nRF52832 — DFU升级
?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
?XX ?作 ? ? ? 者:文化人
?XX ?聯系方式:(或進群:471144274)
?XX ?版權聲明:原創文章,歡迎評論和轉載~轉載時能告訴我一聲就最好了
?XX ?要說的話:作者水平有限,難免有不足之處,懇請指正!
?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
寫在前面:每次跟銷售或者客戶做項目評估的時候,他們都會問到“能支持OTA嗎?”,可見OTA升級對于一個產品而言是多么重要(~廢話)。
一、OTA空中升級:
? ? ? ?1、概念:
? ? ? ? ? ? DFU:Device Firmware Update(設備固件更新)
? ? ? ? ? ? OTA: Over The Air (空中升級)
? ? ? ? ? ? 兩種不同布局方式的差別:
? ? ? ? ? ? (1)single bank布局不支持softdevice及bootloader自身的升級,只支持該芯片上應用程序的升級。
? ? ? ? ? ? (2)采用single bank布局的方式中,一旦開始升級,芯片上原有的應用程序將不能被保存。而以dual bank布局的方式中,在開始接收新的二進制程序(image)時,原有的二進制程序(image)將會被保留,如果升級失敗不會影響芯片上原有的程序。目前的SDK DFU都是只支持dual bank升級,如果需要single bank需要使用6.0之前的版本sdk。還有就是采用dual bank升級的代碼大小不能超過總(內存-SoftDevice size - Bootloader size)/2.
? ? ? ?2、啟動的過程:
? ? ? ? ? ? 對于單片機類的產品,要支持空中升級,通常單片機內部會燒錄兩段代碼,一個是bootloader程序,一個是用戶app程序,bootloader程序主要就是實現app升級的程序,它是單片機上電后首次運行的程序,app程序就是實現產品功能的程序。對于nRF52832來說,雖然多了Nordic官方提供的softdevice,但是原理還是一樣的。芯片上電首次運行softdevice,雖然這段程序不負責程序升級,但是它也具備一點bootloader的功能,也就是說,芯片上電后,它會判斷芯片內部是否有bootloader代碼(bootloader代碼位置固定,所以它能判斷出是否有合法的bootloader程序),若有bootloader程序則會跳轉到bootloader程序執行,若沒有bootloader程序而只檢測到了用戶的app程序,那么就直接跳轉到app程序運行,bootloader程序差不多只做兩件事情,1:控制程序的跳轉,比如跳轉到app程序;2:實現app程序升級;
? ? ? ? ? ? ? nRF52832程序加載順序;
? ? ? ? ? ? ? 1)SoftDevice加載;
? ? ? ? ? ? ? 2)SoftDevice初始化藍牙協議棧;
? ? ? ? ? ? ? 3)SoftDevice檢查0x10001014處是否保存有有效的BootLoader地址, 如果不是跳轉到0x14000處的APP執行,流程結束.
? ? ? ? ? ? ? 4)如果是有效bootloader地址,SoftDevice就跳轉到BootLoader執行;
? ? ? ? ? ? ? 5)BootLoader進行他的業務處理工作;
? ? ? ? ? ? ? 6)BootLoader跳轉到0x14000處的APP執行,流程結束.
? ? ? ? 3、OTA升級的原理:
? ? ? ? ? ? ? 正常啟動之后,程序會運行在app程序,如果它支持OTA的話,使用 nrftoolbox(推薦使用 v2.0.0 以上)或者?nrf connect 可以進行空中升級,只要向該 DFU control point 特征值中寫入 0x01,設備便斷開連接,上報?BLE_DFU_EVT_ENTERING_BOOTLOADER 事件,這時程序會跳轉到bootloader中,等待OTA升級指令,使用nRF connect進行空中升級,如果升級成功,程序又會自動跳轉(setting文件的作用下)到app程序,正常運行;
二、小潘的分享:
? ? ? 1、文檔鏈接:
? ? ? ? ? ?首先非常感謝小潘大神的分享,詳細的操作文檔請點擊這個。
? ? ? 2、遇到的問題:
? ? ? ? ? ?根據文檔進行操作,編譯bootloader出現兩個錯誤,在解決第一個問題(uecc.h)時就卡住了,執行make指令總是提示這個,以為是mingw安裝有問題,重新試了好多次都不行~
? ? ? ?搜了很多資料,最后找到了這個,?按照4、5的操作,解決了第一個問題;接著根據小潘的文檔,一路很順暢的完成了。
三、OTA升級實操(從零開始建立一個支持dfu服務的應用):
? ? ? ?1、參考文檔1;
? ? ? ? ? ? 參考文檔2;
? ? ? ?2、sdk版本是nRF5_SDK_12.2.0,沒有dfu服務的工程選擇的是app_ble_uart:
? ? ? ? ? ? ?1)添加ble_dfu.c、nrf_dfu_settings.c、nrf_dfu_flash.c(app_scheduler.c、crc32.c和nrf_nvmc.c選擇添加)到自己的工程中,添加對應頭文件的路徑;
? ? ? ? ? ? ?2)參考experimental_ble_app_buttonless_dfu工程,在main.c文件里找到service_init()函數,添加如下代碼:
? ? ? ? ? ? ?找到ble_evt_dispatch()函數,添加如下代碼:
? ? ? ? ? ? ? ? ? ? ble_dfu_on_ble_evt(&m_dfus, p_ble_evt);
? ? ? ? ? ? ?3)編譯后,解決提示的錯誤,按照小潘的文檔,燒錄,可以成功進行dfu升級;
? ? ? ? ? ? ?4)有一個問題:需要把ble_nus_init()屏蔽掉藍牙才能搜索到,可能是某些屬性沖突了,修改了服務的uuid還是不行,暫時先記在這里;
遺留問題收斂:2018-01-12
1、參考文檔1;
? ? ? 參考文檔2;
2、如圖,解決方法可以修改Vendor specific UUID的個數,或者把UUID的類型修改為非BLE_UUID_TYPE_BLE;
? ? PS:如果使用高版本SDK,并且程序中已經自定義基準UUID的話,這個時候添加DFU代碼需要修改基準UUID允許添加的個數,因為默認是1。否則ble_dfu_init初始化函數里面調用sd_ble_uuid_vs_add 函數時就會出錯。
相關問題補充一:2018-03-06
1、在其他的資料中看到的解釋:
相關問題補充二:2018-07-27
1、使用過程中遇到的問題:
燒錄的bootloader_setting.hex一定要是對應的application.hex生成的,如果兩個不對應,會卡在bootloader里面;
什么意思呢?就是說如果你已經按照softdevice-->bootloader_setting-->bootloader-->application燒錄,想再去調試的話直接下載application.hex是不行的,會卡在bootloader里面,因為這個application.hex跟你燒錄的bootloader_setting.hex是不對應的。
那怎么辦呢?先擦除,只燒錄softdevice-->application就行,這樣就可以調試了。
總結
以上是生活随笔為你收集整理的nRF52832 — DFU升级的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 010. 谈一谈110%战略
- 下一篇: Android drm-hwcompos