本文共 6080 字,大约阅读时间需要 20 分钟。
本文将指导您如何在Windows 64位系统上完成Nordic半导体的DFU升级和bootloader工程开发流程。
(此处已移除下载链接)
安装以下软件工具:
通过以上工具,可以为后续开发打下坚实基础。
在系统环境变量中,将以下路径添加到Path中:
完成后,需要重启电脑以使环境变量生效。
通过以下步骤安装nrfutil工具:
python -m pip install --upgrade pip
python -m pip install nrfutil
##DFU升级silent
static void dfu_observer(nrf_dfu_evt_type_t evt_type) { switch (evt_type) { case NRF_DFU_EVT_DFU_FAILED: case NRF_DFU_EVT_DFU_ABORTED: case NRF_DFU_EVT_DFU_INITIALIZED: BSP_BOARD_INIT(BSP_INIT_LEDS); BSP_BOARD_LED_ON(BSP_BOARD_LED_0); BSP_BOARD_LED_ON(BSP_BOARD_LED_1); BSP_BOARD_LED_OFF(BSP_BOARD_LED_2); break; case NRF_DFU_EVT_TRANSPORT стари ACTIVATED: BSP_BOARD_LED_OFF(BSP_BOARD_LED_1); BSP_BOARD_LED_ON(BSP_BOARD_LED_2); break; default: break; }}
函数dfu_observer用于在DFU事件发生时通知相关操作。
ret_code_t nrf_bootloader_init(nrf_dfu_observer_t observer) { NRF_LOG_DEBUG("In nrf_bootloader_init"); ret_code_t ret_val; nrf_bootloader_fw_activation_result_t activation_result; uint32_t initial_timeout; bool dfu_enter = false; if (NRF_BL_DFU_ENTER_METHOD_BUTTON) { dfu_enter_button_init(); } ret_val = nrf_dfu_settings_init(false); if (ret_val != NRF_SUCCESS) { return NRF_ERROR_INTERNAL; } activation_result = nrf_bootloader_fw_activate(); switch (activation_result) { case ACTIVATION_NONE: initial_timeout = NRF_BOOTLOADER_MS_TO_TICKS(NRF_BL_DFU_INACTIVITY_TIMEOUT_MS); dfu_enter = dfu_enter_check(); break; case ACTIVATION_SUCCESS_EXPECT_ADDITIONAL_UPDATE: initial_timeout = NRF_BOOTLOADER_MS_TO_TICKS(NRF_BL_DFU_CONTINUATION_TIMEOUT_MS); dfu_enter = true; break; case ACTIVATION_SUCCESS: bootloader_reset(); return NRF_ERROR_INTERNAL; case ACTIVATION_ERROR: default: return NRF_ERROR_INTERNAL; } if (dfu_enter) { nrf_bootloader_wdt_init(); scheduler_init(); dfu_enter_flags_clear(); ret_val = nrf_dfu_init_user(); if (ret_val != NRF_SUCCESS) { return NRF_ERROR_INTERNAL; } nrf_bootloader_dfu_inactivity_timer_restart(initial_timeout, inactivity_timeout); ret_val = nrf_dfu_init(dfu_observer); if (ret_val != NRF_SUCCESS) { return NRF_ERROR_INTERNAL; } loop_forever(); } else { ret_val = nrf_dfu_settings_additional_erase(); if (ret_val != NRF_SUCCESS) { return NRF_ERROR_INTERNAL; } nrf_bootloader_app_start(); } return NRF_SUCCESS;}
函数nrf_bootloader_init用于初始化bootloader的相关组件,并根据不同的DFU事件类型执行相应操作。
在命令行中执行以下命令,生成private.pem文件:
nrfutil keys generate private.pem
然后,使用private.pem生成public_key.c文件:
nrfutil keys display --key pk --format code private.pem --out_file public_key.c
将public_key.c文件复制并粘贴到dfu_public_key.c文件中,删除相关错误提示。
ROM地址范围 | 描述 |
---|---|
0x26000 | 协议栈占用的ROM空间上限 |
0x52000 | 用户程序可用ROM空间 |
0x20002AA8 | 协议栈占用的RAM空间 |
0xD558 | 用户程序可能占用的RAM空间大小 |
###Step 1: 修改SDK配置
在sdk_config.h
文件中定义DFU相关宏,并添加以下文件:
ble_dfu.c
ble_dfu_unbonded.c
nrf_dfu_svci.c
###Step 2: 修改C/C++选项
在C/C++选项中添加以下定义:
NRF_DFU_TRANSPORT_BLE=1
BL_SETTINGS_ACCESS_ONLY
###Step 3: 添加头文件
在main.c
中引入以下头文件:
#include "ble_dfu.h"#include "ble_bas.h"#include "ble_dis.h"
###Step 4: 初始化DFU服务
在services_init
函数中添加以下代码:
static void bas_init(void) { ret_code_t err_code; ble_bas_init_t bas_init = {0}; bas_init.evt_handler = NULL; bas_init.support_notification = true; bas_init.p_report_ref = NULL; bas_init.initial_batt_level = 100; bas_init.bl_rd_sec = SEC_OPEN; bas_init.bl_cccd_wr_sec = SEC_OPEN; bas_init.bl_report_rd_sec = SEC_OPEN; err_code = ble_bas_init(&m_bas, &bas_init); APP_ERROR_CHECK(err_code);}static void dis_init(void) { ret_code_t err_code; ble_dis_init_t dis_init = {0}; // 添加制造商信息等 err_code = ble_dis_init(&dis_init); APP_ERROR_CHECK(err_code);}static void services_init(void) { ret_code_t err_code; // 初始化Queued Write Module nrf_ble_qwr_init_t qwr_init = {0}; qwr_init.error_handler = nrf_qwr_error_handler; err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init); APP_ERROR_CHECK(err_code); // 初始化DFU通过buttonless方式 ble_dfu_buttonless_init_t dfus_init = {0}; dfus_init.evt_handler = ble_dfu_evt_handler; err_code = ble_dfu_buttonless_init(&dfus_init); APP_ERROR_CHECK(err_code); // 初始化NUS服务 ble_nus_init_t nus_init = {0}; nus_init.data_handler = nus_data_handler; err_code = ble_nus_init(&m_nus, &nus_init); APP_ERROR_CHECK(err_code); bas_init(); dis_init();}
###Step 5: 添加宏定义
在main.c
中定义以下宏:
#define SOFTWARE_VERSION_STR "1.0.0.0"#define MODEL_NUMBER "DFU_TEST"#define SERIAL_NUMBER "123456789"#define HARDWARE_VERSION "H001"#define FIRMWARE_VERSION "S001"#define SOFTWARE_VERSION SOFTWARE_VERSION_STR#define MANUFACTURER_NAME "NORDIC TECHOLOGY LTD"
###Step 6: 检查settings配置
确保BLE_DIS_ENABLED=1
和BLE_BAS_ENABLED=1
定义正确。
###Step 7: 增加协议栈合并
使用mergehex.exe
工具将协议栈和用户程序合并成一个hex文件:
mergehex.exe --merge nrf52832_xxaa_s132.hex s132_nrf52_6.1.0_softdevice.hex --output production_final1.hex
###Step 8: 烧录工具使用
安装并使用烧录工具nrfjprog.exe
完成芯片烧录。
###Step 9: 生成DFU升级包
使用nrfutil命令生成DFU升级包:
nrfutil pkg generate --family NRF52 --application nrf52832_xxaa.hex --key-file private.pem nrf52832_xxaa_app.zip
###Step 10: DFU升级操作
通过nRF Connect工具或一键式升级工具完成DFU升级。
通过以上步骤,您可以完成Nordic半导体DFU升级和bootloader工程的开发流程。如果需要进一步的技术支持,请参考Nordic半导体官方文档或联系相关技术支持。
转载地址:http://pjxwk.baihongyu.com/