NRF52832串口升級

NRF52832串口升級

寫在前面
剛開始入門52832的時候對於一個嵌入式主控的OTA功能感覺不到其重要性,當真正開始講產品投入到實際環境中進行應用時,這是後即刻凸顯出OTA功能的主要性,如果產品在軟件上出了某些bug,沒有OTA功能不能遠程升級現場設備固件有時將會導致難以估計的損失。對於52832的智能穿戴設備,串口OTA功能實現意義不大,主要是通過官方空中OTA實現對設備進行升級固件。但是如果是一款搭載52832的嵌入式物聯網設備,空中OTA缺點是顯而易見的,不能實現遠程對設備進行升級。但是如果使用設備上其它MCU對52832通過串口進行空中升級,其問題即可得到解決。筆者已實現通過遠程對控制設備中的MCU對52832進行升級。其主要實現流程爲:讓設備連接上服務器,服務器上接收服務器本機串口升級數據,轉發到控制MCU,控制MCU再轉發給52832,逆向數據也一樣的原理,除了數據方向變化其它都是數據轉發處理。

實現52832串口遠程升級的關鍵主要是首先驗證本地串口升級功能,主要實現過程如下:
主要參考文檔
PS:該文檔下載所需積分較貴,但文章確實寫的很好,適合入門級別,也可到各大BLE羣聊搜索下載。

一、搭建環境
文章中搭建環境需要的安裝包
52832官方OTA功能主要是用python腳本語言實現,使用時只需要調用CMD命令行窗口即可。
首先安裝Python,建議使用python-2.7,這也是官方推薦python版本,安裝python過程也很簡單,可自行百度。安裝python完成後,接下來是使用 Python 來安裝 nrfutil,下載 nrfutil 的相關文件,解壓壓縮包並打開有 setup.py 文件的目錄,在此處打開 dos 命令(shift+右鍵打開)輸入命令行 python setup.py install 進行nrfutil安裝。輸入 python setup.py install 這步驟需要有網絡的時候運行,安裝可能需要等待幾分鐘時間。中途遇到過的問題:下載pc-nrfutil-3.3.2版本並安裝,但是總是報錯,
參考解決如下

二、生成密匙
密匙是用於打包升級固件時候使用,作用是掌握該祕鑰的人才能對設備進行升級。生成方法也很簡單,在一個新建文件夾下打開cmd窗口,在 cmd 命令中輸入以下內容:nrfutil.exe keys generate d:\cc_test\private.key即生成密匙 .key文件,該文件用於打包升級固件時使用。接下來在 cmd 中輸入:nrfutil keys display --key pk --format code d:\cc_test\private.key --out_file d:\cc_test\public_key.c 即生成密匙 .c 文件,該文件主要是用於編譯bootloder使用,bootloder用於生成初次燒錄文件。

三、編譯bootloder
編譯bootloder需要將文件夾下的密匙替換爲自己的密匙,將步驟二中的 .c 文件改名爲 dfu_public_key.c ,將<bootloader 工程>\examples\dfu\bootloader_secure這個路徑下的 dfu_public_key.c 用新生成的替換掉。
SDK bootloder路徑 \examples\dfu\experimental_bootloader_secure_serial\pca10040_debug 打開工程,初次編譯會報錯;
報錯
處理方法:
1、將下載的一個叫micro-ecc-master文件夾下的四個文件拷貝到報錯的路徑…\components\libraries\crypto\backend\micro_ecc下
2、然後運行external\micro-ecc目錄下的批處理
完成上述兩步之後編譯通過。

然後是修改bootloder波特率爲9600,在sdk_config文件中修改對應波特率,遠程升級固件建議使用9600更穩定。
在這裏插入圖片描述
最後生成bootloder的hex文件。

四、修改python腳本
這步主要是實現波特率和bootloder中的一直,修改方法很簡單,如下圖打開參考nrfutil路徑下dfu_transport_serial.py文件如下截圖:
在這裏插入圖片描述
修改參數如下(主要是修改波特率和流控 還有下方timeout時間,這個timeout時間是關鍵,是控制等待遠程返回數據的時間,我自己的這套環境使用的是20(PS:下圖未修改)):
在這裏插入圖片描述
然後在pc-nrfutil-master文件下cmd
執行python setup.py build
和python setup.py install 即可。

五、打包固件
固件主要有兩部分,初次燒錄固件和升級固件兩部分。初次燒錄固件用於初次燒錄,升級固件用於後續升級。

①、燒錄固件打包。
需要的文件:
applaction.hex 這個文件爲應用程序編譯出來的hex文件
bootloader.hex 這個文件爲串口bootloder編譯生成的hex文件
softdevice.hex 協議棧hex文件
nrfutil.exe nrfutil工具
將這四個文件放在一個文件夾下,新建一個批處理:

del output3to1.hex
mergehex --merge softdevice.hex bootloader.hex application.hex --output output3to1.hex
del bootloader_setting.hex
nrfutil settings generate --family NRF52 --application application.hex --application-version 1 --bootloader-version 1 --bl-settings-version 1 bootloader_setting.hex
del Application_xxxx.hex
mergehex --merge output3to1.hex bootloader_setting.hex --output Application_xxxx.hex

運行批處理生成的Application_xxxx.hex 爲最終需要燒錄的hex文件
效果如下:
在這裏插入圖片描述
②、燒錄固件打包。
需要的文件:
applaction.hex 這個文件爲應用程序編譯出來的hex文件
private.key 祕鑰 .key 文件
nrfutil.exe nrfutil工具

將這三個文件放在一個文件夾下,新建一個批處理:

del Application.zip
nrfutil pkg generate --hw-version 52 --sd-req 0x98 --application-version 31 --application application.hex --key-file private.key Application.zip

運行批處理生成的 Application.zip 爲最終需要燒錄的zip文件

六、燒錄固件
需要的文件:
Application_xxxx.hex 五中打包好的燒錄固件
nrfutil.exe nrfutil工具

將這二個文件放在一個文件夾下,新建一個批處理:
nrfjprog -f NRF52 --eraseall
nrfjprog -f NRF52 --program “Application_xxxx.hex” --verify
nrfjprog -f NRF52 --reset

PS:燒錄前檢查硬件連接,Jlink驅動安裝正常與否
運行批處理等待燒錄完成

七、升級固件

需要的文件:
Application.zip 五中打包好的升級固件
nrfutil.exe nrfutil工具

將這二個文件放在一個文件夾下,新建一個批處理:
nrfutil dfu serial –pkg app.zip –p COM7 –fc 0 –b 9600

PS:串口COM根據自己連接選擇,升級必須先進入DFU模式,進入DFU模式代碼:

uint32_t bootloader_start(void)
{
    uint32_t err_code;

    err_code = sd_power_gpregret_clr(0, 0xffffffff);
    VERIFY_SUCCESS(err_code);

    err_code = sd_power_gpregret_set(0, BOOTLOADER_DFU_START);
    VERIFY_SUCCESS(err_code);

    err_code = sd_softdevice_disable();
    VERIFY_SUCCESS(err_code);

    err_code = sd_softdevice_vector_table_base_set(NRF_UICR->NRFFW[0]);
    VERIFY_SUCCESS(err_code);

    NVIC_ClearPendingIRQ(SWI2_IRQn);
    interrupts_disable();

    NVIC_SystemReset();
    return NRF_SUCCESS;
}

進入DFU模式後連接硬件串口到PC

運行批處理等待升級完成,完成效果圖:
在這裏插入圖片描述

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