从零开始的nrf52832蓝牙开发--串口DFU
????關(guān)注、星標公眾號,直達精彩內(nèi)容
來源:https://blog.csdn.net/qwe5959798/article/details/120152350
在本章之前推薦先閱讀博文:詳解藍牙空中升級(BLE OTA)原理與步驟
作者對Nordic芯片的應(yīng)用理解極其透徹,連Nordic的官方公眾號也轉(zhuǎn)發(fā)過他的教程博文,不知是否就職于Nordic。
在上面推薦的博文基礎(chǔ)上,筆者做了串口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,其實只要可以區(qū)分出來升級前后的app,使用哪個作為升級app都可以。
我們預(yù)期的效果是,代碼先正常運行ble_app_buttonless_dfu,可以使用手機連接藍牙試一下,然后在沒有藍牙連接的情況下,長按Button3進入DFU模式,此時我們使用nrfutil把固件發(fā)送給開發(fā)板,完成升級,升級后藍牙變成了ble_app_blinky。
1. 編譯bootloader
1.1 安裝加密庫
打開
直接build會發(fā)現(xiàn)報錯:
運行加密庫安裝腳本:
如果網(wǎng)速不好會下載很慢,打開腳本看一下具體步驟:
你可以直接到github上下載對應(yīng)源碼,下載完成后確保你的電腦上有g(shù)cc和arm-none-eabi-gcc且gcc需要加到環(huán)境變量里面,而arm-none-eabi需要在SDK的環(huán)境變量設(shè)置里面更改路徑。可以參考我之前的文章:
windows下用VSCODE開發(fā)stm32踩的坑
如果沒有設(shè)置會報錯誤找不到工具鏈:
?可以看到提示去更改工具鏈路徑的文件為:
打開后更改為你所下載的工具鏈安裝路徑和實際版本:
最好直接去安裝路徑里復(fù)制路徑,否則要看仔細路徑是否一模一樣,注意是 / 而不是 \ 。最后可以運行腳本,也可以直接在目錄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版本不兼容導(dǎo)致的問題,可以看到錯誤提示為在鏈接階段,兩個段的地址有重疊。我們重新找到工程文件下有一個?flash_placement.xml?文件,用文本或者vscode打開,調(diào)整reserved_flash的起始地址和大小:
保存后重新打開工程編譯,可以看到編譯成功:
1.3 修改密鑰
我們打開?dfu_public_key.c?文件可以看到我們的密鑰是在debug版本才有的:
也就是你只能使用官方提供的測試升級包去測試升級,為了方便我們測試,我們使用自己生成的密鑰,我們需要安裝?nRF Command Line Tools?,如果你要開發(fā)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。第二條通過私鑰生成公鑰并轉(zhuǎn)換為.c文件。
然后重新打開工程文件,生成bootloader。
2. 編譯APP
打開工程文件,編譯:
一樣的錯誤一樣的解決辦法。
因為我們需要使用按鍵去升級,所以我們把和藍牙升級有沖突的代碼注釋掉:
然后添加按鍵事件:
這里按鍵號從0開始,所以按鍵號2對于button3。
BSP事件里面本身就包含了DFU事件,我們可以直接使用,然后在ble_dfu.c里仿照原本進入DFU模式的函數(shù)寫一個通過按鍵進入DFU的函數(shù):
然后在BSP事件回調(diào)里去調(diào)用:
3. 編譯新APP
隨便使用一個工程文件,比如本文使用的ble_app_blinky,編譯后生成hex。
4. 生成固件和升級包
可以隨便找一個地方新建一個DFU文件夾,把之前編譯生成的以下文件復(fù)制進去:
還需要把softdevie.hex添加進去:
把名字改為:
使用指令,或者直接編一個腳本:
# 生成settings.hex nrfutil 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注意里面的參數(shù)要和實際情況對應(yīng)!特別是文件名和0xB7,這個0xB7要根據(jù)你的協(xié)議棧版本更改。
得到兩個文件,merge.hex是默認程序,而app_new.zip是用來升級的固件。
5. 升級固件
使用指令把固件先下載進開發(fā)板:
nrfjprog --eraseall -f NRF52 nrfjprog --program merge.hex --verify -f NRF52 nrfjprog --reset -f NRF52此時可以看到板子LED1一直在閃爍,證明處在廣播狀態(tài),使用手機可以連上Nordic_Buttonless這個藍牙,在斷開藍牙的情況下,長按Button3,LED1和LED3會常亮,代表進入了DFU模式。
此時使用指令升級新的固件,我這里電腦識別為COM3,你需要改為自己電腦上對應(yīng)的端口:
nrfutil dfu serial -pkg app_new.zip -p COM3固件升級成功后手機可以搜掃Nordic_Blinky,當(dāng)廣播時LED1常亮,手機連接上后LED2常亮。
至此,使用串口的DFU測試完成。
免責(zé)聲明:本文素材來源網(wǎng)絡(luò),版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請與我聯(lián)系刪除。
???????????????? ?END ????????????????
總結(jié)
以上是生活随笔為你收集整理的从零开始的nrf52832蓝牙开发--串口DFU的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CARLA相机传感器坐标系
- 下一篇: 2022-2028年中国塑料增韧剂行业市