从零开始的nrf52832蓝牙开发(4)--串口DFU
上一篇:
從零開始的nrf52832藍牙開發(3)--藍牙串口實現
在本章之前推薦先閱讀博文:
詳解藍牙空中升級(BLE OTA)原理與步驟
作者對Nordic芯片的應用理解極其透徹,連Nordic的官方公眾號也轉發過他的教程博文,不知是否就職于Nordic。
在上面推薦的博文基礎上,筆者做了串口DFU實踐,寫的更加詳細,對實際過程中遇到的問題做了更加細致的描述和解決。
本章使用三個工程:
bootloader:
nRF5_SDK_15.3.0_59ac345\examples\dfu\secure_bootloader\pca10040_uart_debug\ses
application:
nRF5_SDK_15.3.0_59ac345\examples\ble_peripheral\ble_app_buttonless_dfu\pca10040\s132\ses
new_application:
nRF5_SDK_15.3.0_59ac345\examples\ble_peripheral\ble_app_blinky\pca10040\s132\ses
bootloader使用的是安全模式的bootloader,因為官方的samples中串口升級方式只提供了安全模式的bootloader,默認app用的無按鍵藍牙dfu的例程,而升級后的app使用的是ble_app_blinky,其實只要可以區分出來升級前后的app,使用哪個作為升級app都可以。
我們預期的效果是,代碼先正常運行ble_app_buttonless_dfu,可以使用手機連接藍牙試一下,然后在沒有藍牙連接的情況下,長按Button3進入DFU模式,此時我們使用nrfutil把固件發送給開發板,完成升級,升級后藍牙變成了ble_app_blinky。
1. 編譯bootloader
1.1 安裝加密庫
打開
直接build會發現報錯:
運行加密庫安裝腳本:
如果網速不好會下載很慢,打開腳本看一下具體步驟:
你可以直接到github上下載對應源碼,下載完成后確保你的電腦上有gcc和arm-none-eabi-gcc且gcc需要加到環境變量里面,而arm-none-eabi需要在SDK的環境變量設置里面更改路徑。可以參考我之前的文章:
windows下用VSCODE開發stm32踩的坑
如果沒有設置會報錯誤找不到工具鏈:
?可以看到提示去更改工具鏈路徑的文件為:
打開后更改為你所下載的工具鏈安裝路徑和實際版本:
最好直接去安裝路徑里復制路徑,否則要看仔細路徑是否一模一樣,注意是 / 而不是 \ 。最后可以運行腳本,也可以直接在目錄micro-ecc里打開Power shell輸入?
make?-C?nrf52hf_armgcc/armgcc
這里注意如果你的micro-ecc源碼是從github上下載的,請把源碼文件夾由micro-ecc-master改成micro-ecc,否則Makefile中的路徑會對不上,且工程編譯時還是會報找不到uEcc.h。
1.2 修改reserved_flash配置
編譯成功后,再次打開工程編譯:
可以看到還是會報錯,此錯誤是由于IDE和SDK版本不兼容導致的問題,可以看到錯誤提示為在鏈接階段,兩個段的地址有重疊。我們重新找到工程文件下有一個 flash_placement.xml 文件,用文本或者vscode打開,調整reserved_flash的起始地址和大小:
保存后重新打開工程編譯,可以看到編譯成功:
1.3 修改密鑰
我們打開?dfu_public_key.c?文件可以看到我們的密鑰是在debug版本才有的:
也就是你只能使用官方提供的測試升級包去測試升級,為了方便我們測試,我們使用自己生成的密鑰,我們需要安裝 nRF Command Line Tools ,如果你要開發Nordic的芯片,這個工具基本上必須安裝:
nRF Command Line Tools
它里面包含nRF Util ,這個工具是使用DFU所必要的。
?
?替換密鑰的方法就是把原來的?dfu_public_key.c 刪除掉,然后再生成一個,在dfu_public_key.c所在的文件夾下使用指令:
nrfutil keys generate priv.pem nrfutil keys display --key pk --format code priv.pem --out_file dfu_public_key.c第一條生成私鑰,也就是priv.pem。第二條通過私鑰生成公鑰并轉換為.c文件。
然后重新打開工程文件,生成bootloader。
2. 編譯APP
打開工程文件,編譯:
一樣的錯誤一樣的解決辦法。
因為我們需要使用按鍵去升級,所以我們把和藍牙升級有沖突的代碼注釋掉:
然后添加按鍵事件:
這里按鍵號從0開始,所以按鍵號2對于button3。
BSP事件里面本身就包含了DFU事件,我們可以直接使用,然后在ble_dfu.c里仿照原本進入DFU模式的函數寫一個通過按鍵進入DFU的函數:
然后在BSP事件回調里去調用:
3. 編譯新APP
隨便使用一個工程文件,比如本文使用的ble_app_blinky,編譯后生成hex。
4. 生成固件和升級包
可以隨便找一個地方新建一個DFU文件夾,把之前編譯生成的以下文件復制進去:
還需要把softdevie.hex添加進去:
把名字改為:
使用指令,或者直接編一個腳本:
# 生成settings.hexnrfutil settings generate --family NRF52 --application app.hex --application-version 1 --bootloader-version 1 --bl-settings-version 2 settings.hex# 合并hex文件mergehex --merge bootloader.hex settings.hex --output tmp.hex mergehex --merge tmp.hex app.hex s132_nrf52_6.1.1_softdevice.hex --output merge.hex#刪除中間文件rm tmp.hex# 生成升級包nrfutil pkg generate --application app_new.hex --application-version 2 --hw-version 52 --sd-req 0xB7 --key-file priv.pem app_new.zip注意里面的參數要和實際情況對應!特別是文件名和0xB7,這個0xB7要根據你的協議棧版本更改。
得到兩個文件,merge.hex是默認程序,而app_new.zip是用來升級的固件。
5. 升級固件
使用指令把固件先下載進開發板:
nrfjprog --eraseall -f NRF52 nrfjprog --program merge.hex --verify -f NRF52 nrfjprog --reset -f NRF52此時可以看到板子LED1一直在閃爍,證明處在廣播狀態,使用手機可以連上Nordic_Buttonless這個藍牙,在斷開藍牙的情況下,長按Button3,LED1和LED3會常亮,代表進入了DFU模式。
此時使用指令升級新的固件,我這里電腦識別為COM3,你需要改為自己電腦上對應的端口:
nrfutil dfu serial -pkg app_new.zip -p COM3固件升級成功后手機可以搜掃Nordic_Blinky,當廣播時LED1常亮,手機連接上后LED2常亮。
至此,使用串口的DFU測試完成。
總結
以上是生活随笔為你收集整理的从零开始的nrf52832蓝牙开发(4)--串口DFU的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《博弈论》之囚犯困境与破解之道
- 下一篇: 市场是有效的吗?