博客
关于我
nrf52832 sdk15.2.0 dfu升级攻略
阅读量:825 次
发布时间:2019-03-22

本文共 6080 字,大约阅读时间需要 20 分钟。

Nordic半导体DFU升级与bootloader工程开发流程

工具准备(Windows 64位)

本文将指导您如何在Windows 64位系统上完成Nordic半导体的DFU升级和bootloader工程开发流程。

软件工具下载地址:

(此处已移除下载链接)

Step 1: 安装软件

安装以下软件工具:

  • Coreutils-5.3.0.exe
  • GCC-arm-none-eabi-6-2017-q2-update-win32-sha2.exe
  • Make-3.81.exe
  • Git-2.21.0-64-bit.exe
  • Python-2.7.12.amd64.msi
  • 通过以上工具,可以为后续开发打下坚实基础。

    Step 2: 设置系统环境变量

    在系统环境变量中,将以下路径添加到Path中:

  • C:\Program Files (x86)\GnuWin32
  • C:\Program Files (x86)\GnuWin32\bin
  • C:\Program Files (x86)\GNU Tools ARM Embedded\6 2017-q2-update\bin
  • C:\Python27\Scripts
  • C:\Python27\Lib
  • C:\Python27
  • 完成后,需要重启电脑以使环境变量生效。

    Step 3: 安装nrfutil

    通过以下步骤安装nrfutil工具:

  • 确保电脑已连接网络。
  • 在命令行中输入以下命令,为pip提升版本:
    python -m pip install --upgrade pip
  • 输入以下命令安装nrfutil:
    python -m pip install nrfutil
  • ##DFU升级silent

    Bootloader工程分析

    main.c文件中的DFU观察器函数

    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事件发生时通知相关操作。

    nrf_bootloader_init函数

    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事件类型执行相应操作。

    DFU升级与Public Key问题

    生成Private Key

    在命令行中执行以下命令,生成private.pem文件:

    nrfutil keys generate private.pem

    生成Public Key

    然后,使用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文件中,删除相关错误提示。

    Bootloader ROM和RAM空间设置

    ROM地址范围 描述
    0x26000 协议栈占用的ROM空间上限
    0x52000 用户程序可用ROM空间
    0x20002AA8 协议栈占用的RAM空间
    0xD558 用户程序可能占用的RAM空间大小

    增加DFU服务

    ###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=1BLE_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/

    你可能感兴趣的文章
    MYSQL一直显示正在启动
    查看>>
    MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
    查看>>
    MySQL万字总结!超详细!
    查看>>
    Mysql下载以及安装(新手入门,超详细)
    查看>>
    MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
    查看>>
    MySQL不同字符集及排序规则详解:业务场景下的最佳选
    查看>>
    Mysql不同官方版本对比
    查看>>
    MySQL与Informix数据库中的同义表创建:深入解析与比较
    查看>>
    mysql与mem_细说 MySQL 之 MEM_ROOT
    查看>>
    MySQL与Oracle的数据迁移注意事项,另附转换工具链接
    查看>>
    mysql丢失更新问题
    查看>>
    MySQL两千万数据优化&迁移
    查看>>
    MySql中 delimiter 详解
    查看>>
    MYSQL中 find_in_set() 函数用法详解
    查看>>
    MySQL中auto_increment有什么作用?(IT枫斗者)
    查看>>
    MySQL中B+Tree索引原理
    查看>>
    mysql中cast() 和convert()的用法讲解
    查看>>
    mysql中datetime与timestamp类型有什么区别
    查看>>
    MySQL中DQL语言的执行顺序
    查看>>
    mysql中floor函数的作用是什么?
    查看>>