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

本文共 6196 字,大约阅读时间需要 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/

    你可能感兴趣的文章
    nodejs+nginx获取真实ip
    查看>>
    nodejs-mime类型
    查看>>
    NodeJs——(11)控制权转移next
    查看>>
    NodeJS、NPM安装配置步骤(windows版本)
    查看>>
    NodeJS、NPM安装配置步骤(windows版本)
    查看>>
    nodejs下的express安装
    查看>>
    nodejs与javascript中的aes加密
    查看>>
    nodejs中Express 路由统一设置缓存的小技巧
    查看>>
    nodejs中express的使用
    查看>>
    Nodejs中搭建一个静态Web服务器,通过读取文件获取响应类型
    查看>>
    Nodejs中的fs模块的使用
    查看>>
    NodeJS使用淘宝npm镜像站的各种姿势
    查看>>
    NodeJs入门知识
    查看>>
    nodejs包管理工具对比:npm、Yarn、cnpm、npx
    查看>>
    NodeJs单元测试之 API性能测试
    查看>>
    nodejs图片转换字节保存
    查看>>
    nodejs在Liunx上的部署生产方式-PM2
    查看>>
    nodejs基于art-template模板引擎生成
    查看>>
    nodejs字符与字节之间的转换
    查看>>
    NodeJs学习笔记001--npm换源
    查看>>