nRF52-QA-DFU升级测试脚本

Nordic nRF5 SDK DFU升级步骤

  1. 编译micro-ecc库
  2. 生成私钥与公钥
  3. 编译bootloader与application
  4. 生成settings文件
  5. 合并settings文件Bootloader Application 和Softdevice
  6. 生成dfu升级包及bin文件
  7. 烧录合并后的固件
  8. BLE/UART/USB升级测试

Nordic nRF5 SDK DFU需要配置的参数有

  1. 生成升级包时的Softdevice ID 芯片系列
  2. DFU时固件Bootloader Application的版本信息
  3. DFU升级时的串口端口和和波特率

Nordic nRF5 SDK DFU升级的触发方式

  1. 按键触发
  2. pinreset复位触发
  3. 寄存器GPREGRET触发

DFU升级脚本参数配置及功能说明

此脚本主要用于配置和执行Nordic半导体的nRF系列芯片的DFU(Device Firmware Update)升级操作。脚本的功能包括检查DFU环境配置、创建DFU密钥、创建通过BLE、UART和USB进行DFU的固件与升级包等。

需要配置的参数

  1. 芯片型号
    • 参数: IC_TYPE
    • 可选值: nRF52832, nRF52833, nRF52832-QFAB, nRF52820, nRF52810, nRF52811, nRF52805, nRF52840
    • 示例: SET "IC_TYPE=nRF52840"
  2. 现有固件和新固件的SoftDevice版本号
    • 参数: DFU_SD, NEW_DFU_SD
    • 示例: SET "DFU_SD=s140_nrf52_7.2.0"
      SET "NEW_DFU_SD=s140_nrf52_7.2.0"
  3. DFU固件版本信息
    • 参数: HEX_VERSION_ST, HEX_VERSION_APP, HEX_VERSION_BL
    • 说明: HEX_VERSION_ST值默认为2,不要修改
    • 示例: SET "HEX_VERSION_ST=2"
      SET "HEX_VERSION_APP=3"
      SET "HEX_VERSION_BL=3"
  4. 用户烧录芯片时的Jlink序列号
    • 参数: USER_JLINK_SNR
    • 示例: SET "USER_JLINK_SNR="
  5. BLE/UART/USB测试DFU升级参数
    • 参数: BLE_DONGLE_JLINK_SNR, BLE_DONGLE_COM_PORT, UART_COM_BAUD, UART_COM_PORT, USB_COM_BAUD, USB_COM_PORT
    • 示例: SET "BLE_DONGLE_JLINK_SNR="
      SET "BLE_DONGLE_COM_PORT=COM29"
      SET "UART_COM_BAUD=115200"
      SET "UART_COM_PORT=COM10"
      SET "USB_COM_BAUD=115200"
      SET "USB_COM_PORT=COM25"
  6. DFU设备的蓝牙名称和MAC地址
    • 参数: IC_NAME, IC_MAC
    • 示例: SET "IC_NAME=Nordic_Buttonless"
      SET "IC_MAC=C5:FB:5F:EC:FC:17"
  7. 修改项目配置
    • 参数: CONFIG_DEFAULT_PROJECT
    • 示例: SET "CONFIG_DEFAULT_PROJECT=Y"
  8. 用户自定义DFU工程路径
    • 参数: PROJECT_PATH_APPLICATION, PROJECT_PATH_BOOTLOADER_BLE, PROJECT_PATH_BOOTLOADER_UART, PROJECT_PATH_BOOTLOADER_USB
    • 说明: 当CONFIG_DEFAULT_PROJECTN时需配置
    • 示例: SET "PROJECT_PATH_APPLICATION="
      SET "PROJECT_PATH_BOOTLOADER_BLE="
      SET "PROJECT_PATH_BOOTLOADER_UART="
      SET "PROJECT_PATH_BOOTLOADER_USB="
  9. 用户自定义DFU固件路径
    • 参数: HEX_PATH_SD, HEX_PATH_APP, HEX_PATH_BL_BLE, HEX_PATH_BL_UART, HEX_PATH_BL_USB
    • 说明: 当CONFIG_DEFAULT_PROJECTN时需配置
    • 示例: SET "HEX_PATH_SD="
      SET "HEX_PATH_APP="
      SET "HEX_PATH_BL_BLE="
      SET "HEX_PATH_BL_UART="
      SET "HEX_PATH_BL_USB="

脚本功能

  1. 第一步:检查DFU环境配置
    • 检查nrfutil配置
    • 检查nrfjprog配置
    • 检查arm-none-eabi-gcc
    • 检查make配置
    • 检查用户配置的参数
    • 查看帮助文档
    • 安装nRF5 SDK nRF52805补丁
  2. 第二步:创建DFU私钥与公钥
    • 创建DFU私钥dfu_private_key.pem和DFU公钥dfu_public_key.c
    • 用创建的DFU公钥dfu_public_key.c替换DFU目录的DFU公钥
  3. 第三步:创建通过BLE进行DFU的固件与升级包
    • 编译BLE Bootloader工程
    • 编译Application工程
    • 复制BL_BLE.hex SD.hex APP.hex到当前目录
    • 合并DFU固件为MERGED_BLE.hex生成DFU升级包*.zip
    • 生成DFU升级文件*.bin给MCU上位机用
    • 烧录MERGED_BLE.hex固件
    • 使用Dongle通过BLE name升级APP.zip
    • 使用Dongle通过BLE mac升级APP.zip
  4. 第四步:创建通过UART进行DFU的固件与升级包
    • 编译UART Bootloader工程
    • 编译Application工程
    • 复制BL_UART.hex SD.hex APP.hex到当前目录
    • 合并DFU固件为MERGED_UART.hex生成DFU升级包*.zip
    • 生成DFU升级文件*.bin给MCU上位机用
    • 烧录MERGED_UART.hex固件
    • 使用UART串口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_GPREGRET=1 NRF_DFU_SERIAL_UART_USES_HWFC=0)
    • 使用UART串口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_PINRESET=1 NRF_DFU_SERIAL_UART_USES_HWFC=0)
    • 使用UART串口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_BUTTON=1 NRF_DFU_SERIAL_UART_USES_HWFC=0)
  5. 第五步:创建通过USB进行DFU的固件与升级包
    • IC_TYPEnRF52840, nRF52833nRF52820时才执行
    • 编译USB Bootloader工程
    • 编译Application工程
    • 复制BL_USB.hex SD.hex APP.hex到当前目录
    • 合并DFU固件为MERGED_USB.hex生成DFU升级包*.zip
    • 生成DFU升级文件*.bin给MCU上位机用
    • 烧录MERGED_USB.hex固件
    • 使用USB口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_GPREGRET=1)
    • 使用USB口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_PINRESET=1)
    • 使用USB口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_BUTTON=1)

Nordic nRF5 SDK DFU脚本内容

  1. 云盘下载:链接
    @setlocal enabledelayedexpansion
    @echo off
    :prompt
    @echo off
    echo ===========================================================
    echo 用户需要配置的参数
    echo ===========================================================
    REM 设置芯片型号
    REM 可选项:[nRF52832|nRF52833|nRF52832-QFAB|nRF52820|nRF52810|nRF52811|nRF52805|nRF52840]
    SET "IC_TYPE=nRF52840"

    REM 设置现有固件和新固件的SoftDevice版本号
    REM 版本号从SoftDevice固件路径获取
    SET "DFU_SD=s140_nrf52_7.2.0"
    SET "NEW_DFU_SD=s140_nrf52_7.2.0"

    REM 设置DFU固件版本信息
    REM HEX_VERSION_ST值默认为2,不要修改。
    SET "HEX_VERSION_ST=2"
    SET "HEX_VERSION_APP=3"
    SET "HEX_VERSION_BL=3"

    REM 设置用户烧录芯片时的Jlink序列号
    REM SET "USER_JLINK_SNR=1050227850"
    SET "USER_JLINK_SNR="

    REM 在Windows上使用BLE/UART/USB测试DFU升级需配置下述参数
    REM 配置DK[nRF52820 nRF52833 nRF52840]做Dongle时的Jlink序列号,非DK做Dongle(正常Dongle)则序列号留空。
    REM SET "BLE_DONGLE_JLINK_SNR=682774303"
    SET "BLE_DONGLE_JLINK_SNR="
    SET "BLE_DONGLE_COM_PORT=COM29"
    SET "UART_COM_BAUD=115200"
    SET "UART_COM_PORT=COM10"
    SET "USB_COM_BAUD=115200"
    SET "USB_COM_PORT=COM25"

    REM 需要进行DFU的设备的蓝牙名称和MAC地址
    SET "IC_NAME=Nordic_Buttonless"
    SET "IC_MAC=C5:FB:5F:EC:FC:17"

    REM 修改CONFIG_DEFAULT_PROJECT设置为N可使脚本作用于用户自己的DFU工程:BLE/UART/USB Bootloader和Application
    SET "CONFIG_DEFAULT_PROJECT=Y"

    REM 判断芯片是否带USB功能,用于屏蔽部分没有USB功能的芯片指令
    if "!IC_TYPE!"=="nRF52840" (
        SET "USB_MATCH=TRUE"
    ) else if "!IC_TYPE!"=="nRF52833" (
        SET "USB_MATCH=TRUE"
    ) else if "!IC_TYPE!"=="nRF52820" (
        SET "USB_MATCH=TRUE"
    ) else (
        SET "USB_MATCH=FALSE"
    )

    if "!CONFIG_DEFAULT_PROJECT!"=="N" (
        echo 设置用户自己的DFU工程路径,可参考默认DFU工程路径
        SET "PROJECT_PATH_APPLICATION="
        SET "PROJECT_PATH_BOOTLOADER_BLE="
        SET "PROJECT_PATH_BOOTLOADER_UART="
        REM 当使用下述芯片时需设置USB Bootloader工程路径:nRF52840 nRF52833 nRF52820
        if "!USB_MATCH!"=="TRUE" (
            SET "PROJECT_PATH_BOOTLOADER_USB="
        )
        
        echo 设置用户自己的DFU固件路径,可参考默认DFU固件路径
        SET "HEX_PATH_SD="
        SET "HEX_PATH_APP="
        SET "HEX_PATH_BL_BLE="
        SET "HEX_PATH_BL_UART="
        REM 当使用下述芯片时需设置USB Bootloader固件路径:nRF52840 nRF52833 nRF52820
        if "!USB_MATCH!"=="TRUE" (
            SET "HEX_PATH_BL_USB="
        )
    )

    echo ===========================================================
    echo 参数配置完毕
    echo ===========================================================

    REM 配置用户烧录芯片时的Jlink序列号
    if not "!USER_JLINK_SNR!"=="" (
        SET "USER_JLINK_SNR=--snr !USER_JLINK_SNR!"
    )

    REM 配置DK Dongle Jlink序列号
    if not "!BLE_DONGLE_JLINK_SNR!"=="" (
        SET "DONGLE_PROG_JLINK_SNR=--snr !BLE_DONGLE_JLINK_SNR!"
        SET "DONGLE_DFU_JLINK_SNR=-snr !BLE_DONGLE_JLINK_SNR!"
    ) else (
        SET "DONGLE_PROG_JLINK_SNR="
        SET "DONGLE_DFU_JLINK_SNR="
    )

    echo 用户烧录芯片时的Jlink序列号为:!USER_JLINK_SNR!
    echo 配置DK做Dongle时的DK Dongle Jlink序列号为:!BLE_DONGLE_JLINK_SNR!
    echo BLE Dongle串口端口号设置为:!BLE_DONGLE_COM_PORT!
    echo UART串口波特率设置为:!UART_COM_BAUD!
    echo UART串口端口号设置为:!UART_COM_PORT!
    echo USB串口波特率设置为:!USB_COM_BAUD!
    echo USB串口端口号设置为:!USB_COM_PORT!
    echo 需要进行DFU的设备的蓝牙名称设置为:!IC_NAME!
    echo 需要进行DFU的设备的MAC地址设置为:!IC_MAC!
    echo ===========================================================

    REM DFU默认工程路径配置
    if "!CONFIG_DEFAULT_PROJECT!"=="Y" (
        echo "使用默认DFU工程"
        if "!IC_TYPE!"=="nRF52840" (
            REM "设置DFU工程路径"
            SET "PROJECT_PATH_APPLICATION=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10056\s140\arm5_no_packs\ble_app_buttonless_dfu_pca10056_s140.uvprojx"
            SET "PROJECT_PATH_BOOTLOADER_BLE=..\examples\dfu\secure_bootloader\pca10056_s140_ble\arm5_no_packs\secure_bootloader_ble_s140_pca10056.uvprojx"
            SET "PROJECT_PATH_BOOTLOADER_UART=..\examples\dfu\secure_bootloader\pca10056_uart\arm5_no_packs\secure_bootloader_uart_mbr_pca10056.uvprojx"
            SET "PROJECT_PATH_BOOTLOADER_USB=..\examples\dfu\secure_bootloader\pca10056_usb\arm5_no_packs\secure_bootloader_usb_mbr_pca10056.uvprojx"
            
            REM "设置DFU工程固件路径"
            SET "HEX_PATH_SD=..\components\softdevice\s140\hex\s140_nrf52_7.2.0_softdevice.hex"
            SET "HEX_PATH_APP=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10056\s140\arm5_no_packs\_build\nrf52840_xxaa.hex"
            SET "HEX_PATH_BL_BLE=..\examples\dfu\secure_bootloader\pca10056_s140_ble\arm5_no_packs\_build\nrf52840_xxaa_s140.hex"
            SET "HEX_PATH_BL_UART=..\examples\dfu\secure_bootloader\pca10056_uart\arm5_no_packs\_build\nrf52840_xxaa_mbr.hex"
            SET "HEX_PATH_BL_USB=..\examples\dfu\secure_bootloader\pca10056_usb\arm5_no_packs\_build\nrf52840_xxaa.hex"
            
        ) else if "!IC_TYPE!"=="nRF52833" (
            REM "DFU工程路径设置"
            SET "PROJECT_PATH_APPLICATION=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10100\s140\arm5_no_packs\ble_app_buttonless_dfu_pca10100_s140.uvprojx"
            SET "PROJECT_PATH_BOOTLOADER_BLE=..\examples\dfu\secure_bootloader\pca10100_s140_ble\arm5_no_packs\secure_bootloader_ble_s140_pca10100.uvprojx"
            SET "PROJECT_PATH_BOOTLOADER_UART=..\examples\dfu\secure_bootloader\pca10100_uart\arm5_no_packs\secure_bootloader_uart_mbr_pca10100.uvprojx"
            SET "PROJECT_PATH_BOOTLOADER_USB=..\examples\dfu\secure_bootloader\pca10100_usb\arm5_no_packs\secure_bootloader_usb_mbr_pca10100.uvprojx"
            
            REM "DFU工程编译后固件路径设置"
            SET "HEX_PATH_SD=..\components\softdevice\s140\hex\s140_nrf52_7.2.0_softdevice.hex"
            SET "HEX_PATH_APP=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10100\s140\arm5_no_packs\_build\nrf52833_xxaa.hex"
            SET "HEX_PATH_BL_BLE=..\examples\dfu\secure_bootloader\pca10100_s140_ble\arm5_no_packs\_build\nrf52833_xxaa_s140.hex"
            SET "HEX_PATH_BL_UART=..\examples\dfu\secure_bootloader\pca10100_uart\arm5_no_packs\_build\nrf52833_xxaa_mbr.hex"
            SET "HEX_PATH_BL_USB=..\examples\dfu\secure_bootloader\pca10100_usb\arm5_no_packs\_build\nrf52833_xxaa.hex"
            
        ) else if "!IC_TYPE!"=="nRF52820" (
            REM "DFU工程路径设置"
            SET "PROJECT_PATH_APPLICATION=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10100e\s112\arm5_no_packs\ble_app_buttonless_dfu_pca10100e_s112.uvprojx"
            SET "PROJECT_PATH_BOOTLOADER_BLE=..\examples\dfu\secure_bootloader\pca10100e_s112_ble\arm5_no_packs\secure_bootloader_ble_s112_pca10100e.uvprojx"
            SET "PROJECT_PATH_BOOTLOADER_UART=..\examples\dfu\secure_bootloader\pca10100e_uart\arm5_no_packs\secure_bootloader_uart_mbr_pca10100e.uvprojx"
            SET "PROJECT_PATH_BOOTLOADER_USB=..\examples\dfu\secure_bootloader\pca10100e_usb\arm5_no_packs\secure_bootloader_usb_mbr_pca10100e.uvprojx"
            
            REM "DFU工程编译后固件路径设置"
            SET "HEX_PATH_SD=..\components\softdevice\s112\hex\s112_nrf52_7.2.0_softdevice.hex"
            SET "HEX_PATH_APP=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10100e\s112\arm5_no_packs\_build\nrf52820_xxaa.hex"
            SET "HEX_PATH_BL_BLE=..\examples\dfu\secure_bootloader\pca10100e_s112_ble\arm5_no_packs\_build\nrf52820_xxaa_s112.hex"
            SET "HEX_PATH_BL_UART=..\examples\dfu\secure_bootloader\pca10100e_uart\arm5_no_packs\_build\nrf52820_xxaa_mbr.hex"
            SET "HEX_PATH_BL_USB=..\examples\dfu\secure_bootloader\pca10100e_usb\arm5_no_packs\_build\nrf52820_xxaa.hex"

        ) else if "!IC_TYPE!"=="nRF52832" (
            REM "DFU工程路径设置"
            SET "PROJECT_PATH_APPLICATION=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10040\s132\arm5_no_packs\ble_app_buttonless_dfu_pca10040_s132.uvprojx"
            SET "PROJECT_PATH_BOOTLOADER_BLE=..\examples\dfu\secure_bootloader\pca10040_s132_ble\arm5_no_packs\secure_bootloader_ble_s132_pca10040.uvprojx"
            SET "PROJECT_PATH_BOOTLOADER_UART=..\examples\dfu\secure_bootloader\pca10040_uart\arm5_no_packs\secure_bootloader_uart_mbr_pca10040.uvprojx"
            
            REM "DFU工程编译后固件路径设置"
            SET "HEX_PATH_SD=..\components\softdevice\s132\hex\s132_nrf52_7.2.0_softdevice.hex"
            SET "HEX_PATH_APP=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10040\s132\arm5_no_packs\_build\nrf52832_xxaa.hex"
            SET "HEX_PATH_BL_BLE=..\examples\dfu\secure_bootloader\pca10040_s132_ble\arm5_no_packs\_build\nrf52832_xxaa_s132.hex"
            SET "HEX_PATH_BL_UART=..\examples\dfu\secure_bootloader\pca10040_uart\arm5_no_packs\_build\nrf52832_xxaa_mbr.hex"
            
        ) else if "!IC_TYPE!"=="nRF52811" (
            echo "DFU工程路径设置"
            SET "PROJECT_PATH_APPLICATION=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10056e\s112\arm5_no_packs\ble_app_buttonless_dfu_pca10056e_s112.uvprojx"
            SET "PROJECT_PATH_BOOTLOADER_BLE=..\examples\dfu\secure_bootloader\pca10056e_s112_ble\arm5_no_packs\secure_bootloader_ble_s112_pca10056e.uvprojx"
            SET "PROJECT_PATH_BOOTLOADER_UART=..\examples\dfu\secure_bootloader\pca10056e_uart\arm5_no_packs\secure_bootloader_uart_mbr_pca10056e.uvprojx"
            
            REM "DFU工程编译后固件路径设置"
            SET "HEX_PATH_SD=..\components\softdevice\s112\hex\s112_nrf52_7.2.0_softdevice.hex"
            SET "HEX_PATH_APP=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10056e\s112\arm5_no_packs\_build\nrf52811_xxaa.hex"
            SET "HEX_PATH_BL_BLE=..\examples\dfu\secure_bootloader\pca10056e_s112_ble\arm5_no_packs\_build\nrf52811_xxaa_s112.hex"
            SET "HEX_PATH_BL_UART=..\examples\dfu\secure_bootloader\pca10056e_uart\arm5_no_packs\_build\nrf52811_xxaa_mbr.hex"
        ) else if "!IC_TYPE!"=="nRF52810" (
            REM "DFU工程路径设置"
            SET "PROJECT_PATH_APPLICATION=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10040e\s112\arm5_no_packs\ble_app_buttonless_dfu_pca10040e_s112.uvprojx"
            SET "PROJECT_PATH_BOOTLOADER_BLE=..\examples\dfu\secure_bootloader\pca10040e_s112_ble\arm5_no_packs\secure_bootloader_ble_s112_pca10040e.uvprojx"
            SET "PROJECT_PATH_BOOTLOADER_UART=..\examples\dfu\secure_bootloader\pca10040e_uart\arm5_no_packs\secure_bootloader_uart_mbr_pca10040e.uvprojx"
            
            REM "DFU工程编译后固件路径设置"
            SET "HEX_PATH_SD=..\components\softdevice\s112\hex\s112_nrf52_7.2.0_softdevice.hex"
            SET "HEX_PATH_APP=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10040e\s112\arm5_no_packs\_build\nrf52810_xxaa.hex"
            SET "HEX_PATH_BL_BLE=..\examples\dfu\secure_bootloader\pca10040e_s112_ble\arm5_no_packs\_build\nrf52810_xxaa_s112.hex"
            SET "HEX_PATH_BL_UART=..\examples\dfu\secure_bootloader\pca10040e_uart\arm5_no_packs\_build\nrf52810_xxaa_mbr.hex"
        ) else if "!IC_TYPE!"=="nRF52805" (
            REM "DFU工程路径设置"
            SET "PROJECT_PATH_APPLICATION=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10040e_nrf52805\s112\arm5_no_packs\ble_app_buttonless_dfu_pca10040e_nrf52805_s112.uvprojx"
            SET "PROJECT_PATH_BOOTLOADER_BLE=..\examples\dfu\secure_bootloader\pca10040e_nrf52805_s112_ble\arm5_no_packs\secure_bootloader_ble_s112_pca10040e_nrf52805.uvprojx"
            SET "PROJECT_PATH_BOOTLOADER_UART=..\examples\dfu\secure_bootloader\pca10040e_nrf52805_uart\arm5_no_packs\secure_bootloader_uart_mbr_pca10040e_nrf52805.uvprojx"
            
            REM "DFU工程编译后固件路径设置"
            SET "HEX_PATH_SD=..\components\softdevice\s112\hex\s112_nrf52_7.2.0_softdevice.hex"
            SET "HEX_PATH_APP=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10040e_nrf52805\s112\arm5_no_packs\_build\nrf52805_xxaa.hex"
            SET "HEX_PATH_BL_BLE=..\examples\dfu\secure_bootloader\pca10040e_nrf52805_s112_ble\arm5_no_packs\_build\nrf52805_xxaa_s112.hex"
            SET "HEX_PATH_BL_UART=..\examples\dfu\secure_bootloader\pca10040e_nrf52805_uart\arm5_no_packs\_build\nrf52805_xxaa_mbr.hex"
        ) else (
            echo 不支持的芯片型号:!IC_TYPE!
        )
    ) else (
        echo 当前使用用户自己的DFU工程
    )
    echo ===========================================================
    SET "PRO_IC_FAMILY=NRF52"
    echo "设置烧录时芯片系列为:!PRO_IC_FAMILY! 可选项为:[NRF51|NRF52|NRF53|NRF91]"
    SET "PKG_HW_FAMILY=52"
    echo "设置生成DFU包时芯片系列为:!PKG_HW_FAMILY! 可选项为:[51|52]"
    IF "!IC_TYPE!"=="nRF52832" SET "ST_IC_FAMILY=NRF52"
    IF "!IC_TYPE!"=="nRF52833" SET "ST_IC_FAMILY=NRF52"
    IF "!IC_TYPE!"=="nRF52832-QFAB" SET "ST_IC_FAMILY=NRF52QFAB"
    IF "!IC_TYPE!"=="nRF52820" SET "ST_IC_FAMILY=NRF52QFAB"
    IF "!IC_TYPE!"=="nRF52810" SET "ST_IC_FAMILY=NRF52810"
    IF "!IC_TYPE!"=="nRF52811" SET "ST_IC_FAMILY=NRF52810"
    IF "!IC_TYPE!"=="nRF52805" SET "ST_IC_FAMILY=NRF52810"
    IF "!IC_TYPE!"=="nRF52840" SET "ST_IC_FAMILY=NRF52840"
    echo "设置生成DFU Settings文件时芯片系列为:!ST_IC_FAMILY! 可选项为:[NRF51|NRF52|NRF52QFAB|NRF52810|NRF52840]"
    echo ===========================================================
    REM 初始化PKG_VERSION_SD_ID
    SET "PKG_VERSION_SD_ID="
    SET "PKG_VERSION_SD_REQ="
    REM 定义软件设备版本号与ID的数组
    set "SD_VERSION[s112_nrf52_6.0.0]=0xA7"
    set "SD_VERSION[s112_nrf52_6.1.0]=0xB0"
    set "SD_VERSION[s112_nrf52_6.1.1]=0xB8"
    set "SD_VERSION[s112_nrf52_7.0.0]=0xC4"
    set "SD_VERSION[s112_nrf52_7.0.1]=0xCD"
    set "SD_VERSION[s112_nrf52_7.2.0]=0x103"
    set "SD_VERSION[s112_nrf52_7.3.0]=0x126"
    set "SD_VERSION[s113_nrf52_7.0.0]=0xC3"
    set "SD_VERSION[s113_nrf52_7.0.1]=0xCC"
    set "SD_VERSION[s113_nrf52_7.2.0]=0x102"
    set "SD_VERSION[s113_nrf52_7.3.0]=0x125"
    set "SD_VERSION[s122_nrf52_8.0.0]=0xEA"
    set "SD_VERSION[s122_nrf52_8.1.1]=0x112"
    set "SD_VERSION[s130_nrf51_1.0.0]=0x67"
    set "SD_VERSION[s130_nrf51_2.0.0]=0x80"
    set "SD_VERSION[s130_nrf51_2.0.1]=0x87"
    set "SD_VERSION[s132_nrf52_2.0.0]=0x81"
    set "SD_VERSION[s132_nrf52_2.0.1]=0x88"
    set "SD_VERSION[s132_nrf52_3.0.0]=0x8C"
    set "SD_VERSION[s132_nrf52_3.1.0]=0x91"
    set "SD_VERSION[s132_nrf52_4.0.0]=0x95"
    set "SD_VERSION[s132_nrf52_4.0.2]=0x98"
    set "SD_VERSION[s132_nrf52_4.0.3]=0x99"
    set "SD_VERSION[s132_nrf52_4.0.4]=0x9E"
    set "SD_VERSION[s132_nrf52_4.0.5]=0x9F"
    set "SD_VERSION[s132_nrf52_5.0.0]=0x9D"
    set "SD_VERSION[s132_nrf52_5.1.0]=0xA5"
    set "SD_VERSION[s132_nrf52_6.0.0]=0xA8"
    set "SD_VERSION[s132_nrf52_6.1.0]=0xAF"
    set "SD_VERSION[s132_nrf52_6.1.1]=0xB7"
    set "SD_VERSION[s132_nrf52_7.0.0]=0xC2"
    set "SD_VERSION[s132_nrf52_7.0.1]=0xCB"
    set "SD_VERSION[s132_nrf52_7.2.0]=0x101"
    set "SD_VERSION[s132_nrf52_7.3.0]=0x124"
    set "SD_VERSION[s140_nrf52_6.0.0]=0xA9"
    set "SD_VERSION[s140_nrf52_6.1.0]=0xAE"
    set "SD_VERSION[s140_nrf52_6.1.1]=0xB6"
    set "SD_VERSION[s140_nrf52_7.0.0]=0xC1"
    set "SD_VERSION[s140_nrf52_7.0.1]=0xCA"
    set "SD_VERSION[s140_nrf52_7.2.0]=0x100"
    set "SD_VERSION[s140_nrf52_7.3.0]=0x123"
    set "SD_VERSION[s212_nrf52_6.1.1]=0xBC"
    set "SD_VERSION[s332_nrf52_6.1.1]=0xBA"
    set "SD_VERSION[s340_nrf52_6.1.1]=0xB9"

    REM 设置PKG_VERSION_SD_ID
    if defined SD_VERSION[%DFU_SD%] (
        SET "PKG_VERSION_SD_ID=!SD_VERSION[%DFU_SD%]!"
    ) else (
        echo "错误:不支持的SoftDevice版本n: !DFU_SD!"
        exit /b 1
    )

    REM 设置PKG_VERSION_SD_REQ
    if defined SD_VERSION[%NEW_DFU_SD%] (
        SET "PKG_VERSION_SD_REQ=!SD_VERSION[%NEW_DFU_SD%]!"
    ) else (
        echo "错误:不支持的SoftDevice版本: !NEW_DFU_SD!"
        exit /b 1
    )
    echo "DFU现有固件SoftDevice ID为:!PKG_VERSION_SD_ID!"
    echo "DFU新的固件SoftDevice ID为:!PKG_VERSION_SD_REQ!"

    echo ===========================================================
    echo "DFU密钥依赖库路径设置"
    SET "KEY_BACKUP_TIME=%date:~0,4%%date:~5,2%%date:~8,2%-%time:~0,2%%time:~3,2%%time:~6,2%"
    SET "MICRO_ECC_FOLDER_SOURCE_PATH=.\micro-ecc"
    SET "MICRO_ECC_FOLDER_TARGET_PATH=..\external\micro-ecc"
    SET "MICRO_ECC_LIB_PATH=..\external\micro-ecc\nrf52hf_keil\armgcc\micro_ecc_lib_nrf52.lib"
    SET "PRIVATE_KEY_NAME=dfu_private_key.pem"
    SET "PUBLIC_KEY_NAME=dfu_public_key.c"
    SET "KEY_BACKUP_DIRECTORY_PATH=.\backup\"
    SET "PUBLIC_KEY_PATH=..\examples\dfu\"
    echo ===========================================================
    echo "HEX固件文件名字解释"
    echo "ST为settings文件"
    echo "BL为bootloader文件"
    echo "SD为softdevice文件"
    echo "APP为application文件"
    echo "MERGED为settings文件 + bootloader文件 + softdevice文件 + application文件合并后的文件"

    echo "HEX固件文件名字定义"
    SET "HEX_NAME_BL_BLE=BL_BLE.hex"
    SET "HEX_NAME_BL_UART=BL_UART.hex"
    SET "HEX_NAME_BL_USB=BL_USB.hex"
    SET "HEX_NAME_SD=SD.hex"
    SET "HEX_NAME_APP=APP.hex"

    SET "HEX_NAME_SD_APP_BL_BLE=SD_APP_BL_BLE.hex"
    SET "HEX_NAME_SD_APP_BL_UART=SD_APP_BL_UART.hex"
    SET "HEX_NAME_SD_APP_BL_USB=SD_APP_BL_USB.hex"
    SET "HEX_NAME_MERGED_BLE=MERGED_BLE.hex"
    SET "HEX_NAME_MERGED_UART=MERGED_UART.hex"
    SET "HEX_NAME_MERGED_USB=MERGED_USB.hex"
    SET "HEX_NAME_SD_APP=SD_APP.hex"
    SET "HEX_NAME_ST=ST.hex"
    echo ===========================================================
    echo "ZIP升级包文件名字定义"
    SET "PKG_NAME_BL_BLE=BL_BLE.zip"
    SET "PKG_NAME_BL_UART=BL_UART.zip"
    SET "PKG_NAME_BL_USB=BL_USB.zip"
    SET "PKG_NAME_SOFTDEVICE=SD.zip"
    SET "PKG_NAME_APP=APP.zip"

    SET "PKG_NAME_BL_BLE_SD=BL_BLE_SD.zip"
    SET "PKG_NAME_BL_UART_SD=BL_UART_SD.zip"
    SET "PKG_NAME_BL_USB_SD=BL_USB_SD.zip"
    SET "PKG_NAME_BL_BLE_SD_APP=BL_BLE_SD_APP.zip"
    SET "PKG_NAME_BL_UART_SD_APP=BL_UART_SD_APP.zip"
    SET "PKG_NAME_BL_USB_SD_APP=BL_USB_SD_APP.zip"
    SET "PKG_NAME_SD_APP=SD_APP.zip"
    echo ===========================================================
    echo "设置ZIP包转BIN文件python工具路径"
    SET "TOOL_PATH_ZIP_TO_BIN=!CD!\micro-ecc\dfu_zip_to_bin.py"
    echo "BIN文件名字定义"
    SET "BIN_NAME_BL_BLE=BL_BLE.bin"
    SET "BIN_NAME_BL_UART=BL_UART.bin"
    SET "BIN_NAME_BL_USB=BL_USB.bin"
    SET "BIN_NAME_SOFTDEVICE=SD.bin"
    SET "BIN_NAME_APP=APP.bin"

    SET "BIN_NAME_BL_BLE_SD=BL_BLE_SD.bin"
    SET "BIN_NAME_BL_UART_SD=BL_UART_SD.bin"
    SET "BIN_NAME_BL_USB_SD=BL_USB_SD.bin"
    SET "BIN_NAME_BL_BLE_SD_APP=BL_BLE_SD_APP.bin"
    SET "BIN_NAME_BL_UART_SD_APP=BL_UART_SD_APP.bin"
    SET "BIN_NAME_BL_USB_SD_APP=BL_USB_SD_APP.bin"
    SET "BIN_NAME_SD_APP=SD_APP.bin"
    cls
    echo ===========================================================
    echo "用REM 注释掉cls查看所有配置"
    echo "脚本默认放在目录:nRF5_SDK_17.1.0_ddde560_dfu\PMtools\"
    echo ===========================================================
    echo "nrf-command-line-tools命令行工具"
    echo "PMtools DFU命令行工具v0.0.1-Peter"
    echo ===========================================================
    echo "常用指令             操作"
    echo "第一步:检查DFU环境配置"
    echo "011  -------------  检查DFU环境nrfutil配置"
    echo "012  -------------  检查DFU环境nrfjprog配置"
    echo "013  -------------  检查arm-none-eabi-gcc"
    echo "014  -------------  检查DFU环境make配置"
    echo "015  -------------  检查用户配置的参数"
    echo "016  -------------  查看帮助文档"
    echo "017  -------------  安装nRF5 SDK nRF52805补丁"
    echo ===========================================================
    echo "第二步:创建DFU私钥与公钥"
    echo "021  -------------  创建DFU私钥dfu_private_key.pem和DFU公钥dfu_public_key.c"
    echo "022  -------------  用创建的DFU公钥dfu_public_key.c替换DFU目录的DFU公钥"
    echo ===========================================================
    echo "第三步:创建通过BLE进行DFU的固件与升级包"
    echo "031  -------------  编译BLE Bootloader工程"
    echo "032  -------------  编译Application工程"
    echo "033  -------------  复制BL_BLE.hex SD.hex APP.hex到当前目录"
    echo "034  -------------  合并DFU固件为MERGED_BLE.hex 生成DFU升级包*.zip"
    echo "035  -------------  生成DFU升级文件*.bin给MCU上位机用"
    echo "036  -------------  烧录MERGED_BLE.hex固件"
    echo "037  -------------  使用Dongle通过BLE name升级APP.zip"
    echo "038  -------------  使用Dongle通过BLE mac升级APP.zip"
    echo ===========================================================
    echo "第四步:创建通过UART进行DFU的固件与升级包"
    echo "041  -------------  编译UART Bootloader工程"
    echo "042  -------------  编译Application工程"
    echo "043  -------------  复制BL_UART.hex SD.hex APP.hex到当前目录"
    echo "044  -------------  合并DFU固件为MERGED_UART.hex 生成DFU升级包*.zip"
    echo "045  -------------  生成DFU升级文件*.bin给MCU上位机用"
    echo "046  -------------  烧录MERGED_UART.hex固件"
    echo "047  -------------  使用UART串口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_GPREGRET=1 NRF_DFU_SERIAL_UART_USES_HWFC=0)"
    echo "048  -------------  使用UART串口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_PINRESET=1 NRF_DFU_SERIAL_UART_USES_HWFC=0)"
    echo "049  -------------  使用UART串口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_BUTTON=1 NRF_DFU_SERIAL_UART_USES_HWFC=0)"
    echo ===========================================================
    if "!USB_MATCH!"=="TRUE" (
        echo "第五步:创建通过USB进行DFU的固件与升级包"
        echo "051  -------------  编译USB Bootloader工程"
        echo "052  -------------  编译Application工程"
        echo "053  -------------  复制BL_USB.hex SD.hex APP.hex到当前目录"
        echo "054  -------------  合并DFU固件为MERGED_USB.hex 生成DFU升级包*.zip"
        echo "055  -------------  生成DFU升级文件*.bin给MCU上位机用"
        echo "056  -------------  烧录MERGED_USB.hex固件"
        echo "057  -------------  使用USB口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_GPREGRET=1)"
        echo "058  -------------  使用USB口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_PINRESET=1)"
        echo "059  -------------  使用USB口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_BUTTON=1)"
        echo ===========================================================
    )
    echo "通用指令             操作"
    echo "rcv  -------------  recover"
    echo "rst  -------------  debugreset"
    echo "e    -------------  exit"
    echo ===========================================================
    set /p "choice=请输入选项(001-059)执行对应的DFU步骤: "

    if "!choice!"=="" (
        goto prompt 
    ) else if "!choice!"=="011" (
        REM 检查 nrfjprog
        where nrfjprog >nul 2>nul
        if %errorlevel% neq 0 (
            echo "1.未安装nRF Command Line Tools或者未配置nrfjprog路径到windows path环境变量(默认路径:C:\Program Files\Nordic Semiconductor\nrf-command-line-tools\bin)"
            echo "2.下载链接:https://www.nordicsemi.com/Products/Development-tools/nRF-Command-Line-Tools/Download?lang=en#infotabs"
        ) else (
            where nrfjprog
            where mergehex
            nrfjprog -v
        )
    ) else if "!choice!"=="012" (
        REM 检查 nrfutil
        where nrfutil >nul 2>nul
        if %errorlevel% neq 0 (
            echo "1.未安装或未配置nrfutil路径到windows path环境变量(默认路径:D:\nRF5 SDK\nRF5_SDK_17.1.0_ddde560_dfu\nrf52840_ok\micro-ecc\nrfutil.exe)"
            echo "2.下载链接:https://www.nordicsemi.com/Products/Development-tools/nRF-Util/Download#infotabs"
        ) else (
            where nrfutil
            nrfutil -V
        )
    ) else if "!choice!"=="013" (
        REM 检查 arm-none-eabi-gcc
        where arm-none-eabi-gcc >nul 2>nul
        if %errorlevel% neq 0 (
            echo "1.未安装GCC: GCC ARM Embedded 9.2020-q2.major"
            echo "2.下载链接:https://developer.arm.com/downloads/-/gnu-rm"
        ) else (
            where arm-none-eabi-gcc
            arm-none-eabi-gcc --version
        )
    )  else if "!choice!"=="014" (
        REM 检查 make
        where make >nul 2>nul
        if %errorlevel% neq 0 (
            echo "1.未安装make,GNU Make 4.3"
            echo "2.下载链接:https://udomain.dl.sourceforge.net/project/gnuwin32/sed/4.2.1/sed-4.2.1-setup.exe?viasf=1"
        ) else (
            where make
            make -v
        )
    )  else if "!choice!"=="015" (
        echo "当前已经连接上的Jlink序列号为:"
        nrfjprog --ids
        echo "当前脚本当所在前目录为:%~dp0"
        echo "DFU的芯片型号设置为:!IC_TYPE!"
        echo "老固件softdevice版本号与ID设置为:!DFU_SD! !PKG_VERSION_SD_ID!"
        echo "新固件softdevice版本号与ID设置为:!NEW_DFU_SD! !PKG_VERSION_SD_REQ!"
        
        echo "烧录时芯片family系列为:!PRO_IC_FAMILY!"
        echo "生成Settings时芯片family为:!ST_IC_FAMILY!"
        echo "生成*.zip包时芯片系列为:!PKG_HW_FAMILY!"
        
        echo "APP版本为用户自定义:!HEX_VERSION_APP!"
        echo "Bootloader版本为用户自定义:!HEX_VERSION_BL!"
        echo "Settings版本为固定值:!HEX_VERSION_ST!"

        echo "在windows上使用BLE/UART/USB测试DFU升级需配置下述参数"
        echo "用户给自己板子烧录程序用的Jlink序列号设置为:!USER_JLINK_SNR!"
        echo "用户给开发板烧录Dongle程序的Jlink序列号设置为:!BLE_DONGLE_JLINK_SNR!"
        echo "BLE Dongle串口端口号设置为:!BLE_DONGLE_COM_PORT!"
        echo "UART串口波特率设置为:!UART_COM_BAUD!"
        echo "UART串口端口号设置为:!UART_COM_PORT!"
        echo "USB串口波特率设置为:!USB_COM_BAUD!"
        echo "USB串口端口号设置为:!USB_COM_PORT!"
        echo "需要进行DFU的设备的蓝牙名称设置为:!IC_NAME!"
        echo "需要进行DFU的设备的MAC地址设置为:!IC_MAC!"

        echo "当前CONFIG_DEFAULT_PROJECT设置为!CONFIG_DEFAULT_PROJECT!,=N则使用用户自定义工程路径"
        echo "工程路径设置"
        echo "Application工程路径设置为:!PROJECT_PATH_APPLICATION!"
        echo "BLE Bootloader工程路径设置为:!PROJECT_PATH_BOOTLOADER_BLE!"
        echo "UART Bootloader工程路径设置为:!PROJECT_PATH_BOOTLOADER_UART!"
        if "!USB_MATCH!"=="TRUE" (
            echo "USB Bootloader工程路径设置为:!PROJECT_PATH_BOOTLOADER_USB!"
        )

        echo "固件路径设置"
        echo "SoftDevice固件路径设置为:!HEX_PATH_SD!"
        echo "Application固件路径设置为:!HEX_PATH_APP!"
        echo "BLE Bootloader固件路径设置为:!HEX_PATH_BL_BLE!"
        echo "UART Bootloader固件路径设置为:!HEX_PATH_BL_UART!"
        if "!USB_MATCH!"=="TRUE" (
            echo "USB Bootloader固件路径设置为:!HEX_PATH_BL_USB!"
        )
    ) else if "!choice!"=="016" (
        REM start msedge "https://www.cnblogs.com/iini/p/9314246.html"
        REM start msedge "!CD!\micro-ecc\nRF_Command_Line_Tools_v1.4.pdf"
        REM start msedge "!CD!\micro-ecc\nrfutil_v6.1.0.pdf"
        start msedge "!CD!\micro-ecc\readme.md"
    ) else if "!choice!"=="017" (
        echo "nRF52805 patch路径设置"
        SET "PATCH_PATH_NRF52805=.\micro-ecc\nRF52805_patch"
        
        copy "!PATCH_PATH_NRF52805!\nrfx_irqs.h" ..\modules\nrfx\soc\nrfx_irqs.h
        copy "!PATCH_PATH_NRF52805!\nrfx_irqs_nrf52805.h" ..\modules\nrfx\soc\nrfx_irqs_nrf52805.h
        copy "!PATCH_PATH_NRF52805!\nrfx_coredep.h" ..\modules\nrfx\soc\nrfx_coredep.h
        copy "!PATCH_PATH_NRF52805!\nrfx_prs.h" ..\modules\nrfx\drivers\src\prs\nrfx_prs.h
        copy "!PATCH_PATH_NRF52805!\nrf_dfu_types.h" ..\components\libraries\bootloader\dfu\nrf_dfu_types.h
        copy "!PATCH_PATH_NRF52805!\nrf_bootloader_info.h" ..\components\libraries\bootloader\nrf_bootloader_info.h
    ) else if "!choice!"=="021" (
        if not exist !MICRO_ECC_LIB_PATH! (
            echo " copy micro-ecc directory to external directory"
            ROBOCOPY !MICRO_ECC_FOLDER_SOURCE_PATH! !MICRO_ECC_FOLDER_TARGET_PATH! /E /MT:8
        )
        if not exist !KEY_BACKUP_DIRECTORY_PATH! (
            echo "make backup directory"
            md !KEY_BACKUP_DIRECTORY_PATH!
        )
        if exist !PRIVATE_KEY_NAME! (
            echo "backup "!PRIVATE_KEY_NAME!
            ren !PRIVATE_KEY_NAME! !KEY_BACKUP_TIME!.!PRIVATE_KEY_NAME!
            move !KEY_BACKUP_TIME!.!PRIVATE_KEY_NAME! !KEY_BACKUP_DIRECTORY_PATH!!KEY_BACKUP_TIME!.!PRIVATE_KEY_NAME!
        )
        if exist !PUBLIC_KEY_NAME! (
            echo "backup "!PUBLIC_KEY_NAME!
            ren !PUBLIC_KEY_NAME! !KEY_BACKUP_TIME!.!PUBLIC_KEY_NAME!
            move !KEY_BACKUP_TIME!.!PUBLIC_KEY_NAME! !KEY_BACKUP_DIRECTORY_PATH!!KEY_BACKUP_TIME!.!PUBLIC_KEY_NAME!
        )
        echo "create" !PRIVATE_KEY_NAME! "at:" !KEY_BACKUP_TIME!
        nrfutil keys generate !PRIVATE_KEY_NAME!
        echo "creat" !PUBLIC_KEY_NAME! "at:" !KEY_BACKUP_TIME!
        nrfutil keys display --key pk --format code !PRIVATE_KEY_NAME! --out_file !PUBLIC_KEY_NAME!
    ) else if "!choice!"=="022" (
        echo "复制 !PUBLIC_KEY_NAME! 到路径 !PUBLIC_KEY_PATH!!PUBLIC_KEY_NAME!"
        copy !PUBLIC_KEY_NAME! !PUBLIC_KEY_PATH!!PUBLIC_KEY_NAME!
    ) else if "!choice!"=="031" (
        echo "build ble bootloader project"
        
        echo "Init building bootloader project..."
        echo .>bootloader_build_log.txt
        UV4 -j0 -r !PROJECT_PATH_BOOTLOADER_BLE! -o "!cd!\bootloader_build_log.txt"
        type bootloader_build_log.txt
        echo "bootloader build completed."
    ) else if "!choice!"=="032" (
        echo "build application project"

        echo "Init building application project..."
        echo .>application_build_log.txt
        UV4 -j0 -r !PROJECT_PATH_APPLICATION! -o "!cd!\application_build_log.txt"
        UV4 -j0 -r D:\nRF5 SDK\nRF5_SDK_17.1.0_ddde560_dfu\examples\ble_peripheral\ble_app_buttonless_dfu\pca10056\s140\arm5_no_packs\ble_app_buttonless_dfu_pca10056_s140.uvprojx -o "!cd!\application_build_log.txt"
        type application_build_log.txt
        echo "application build completed."
    ) else if "!choice!"=="033" (
        echo "copy softdevice ble_bootloader and application hex"
        copy !HEX_PATH_SD! !HEX_NAME_SD!
        copy !HEX_PATH_BL_BLE! !HEX_NAME_BL_BLE!
        copy !HEX_PATH_APP! !HEX_NAME_APP!
    ) else if "!choice!"=="034" (
        echo "merged hex"
        nrfutil settings generate --family !ST_IC_FAMILY! --application !HEX_NAME_APP! --application-version !HEX_VERSION_APP! --bootloader-version !HEX_VERSION_BL! --bl-settings-version !HEX_VERSION_ST! !HEX_NAME_ST!
        mergehex -m !HEX_NAME_SD! !HEX_NAME_APP!  -o !HEX_NAME_SD_APP! 
        mergehex -m !HEX_NAME_SD_APP!  !HEX_NAME_BL_BLE! -o !HEX_NAME_SD_APP_BL_BLE!
        mergehex -m !HEX_NAME_SD_APP_BL_BLE! !HEX_NAME_ST! -o !HEX_NAME_MERGED_BLE!
        REM del !HEX_NAME_ST!
        del !HEX_NAME_SD_APP!
        del !HEX_NAME_SD_APP_BL_BLE!
        
        echo "packaged"
        nrfutil pkg generate --key-file !PRIVATE_KEY_NAME! --hw-version !PKG_HW_FAMILY! --sd-req !PKG_VERSION_SD_REQ! --bootloader !HEX_NAME_BL_BLE! --bootloader-version !HEX_VERSION_BL! !PKG_NAME_BL_BLE!
        nrfutil pkg generate --key-file !PRIVATE_KEY_NAME! --hw-version !PKG_HW_FAMILY! --sd-req !PKG_VERSION_SD_REQ! --softdevice !HEX_NAME_SD! --sd-id !PKG_VERSION_SD_ID! !PKG_NAME_SOFTDEVICE!
        nrfutil pkg generate --key-file !PRIVATE_KEY_NAME! --hw-version !PKG_HW_FAMILY! --sd-req !PKG_VERSION_SD_REQ! --application !HEX_NAME_APP! --application-version !HEX_VERSION_APP! !PKG_NAME_APP!

        nrfutil pkg generate --key-file !PRIVATE_KEY_NAME! --hw-version !PKG_HW_FAMILY! --sd-req !PKG_VERSION_SD_REQ! --bootloader !HEX_NAME_BL_BLE! --bootloader-version !HEX_VERSION_BL! --softdevice !HEX_NAME_SD! --sd-id !PKG_VERSION_SD_ID! !PKG_NAME_BL_BLE_SD!
        nrfutil pkg generate --key-file !PRIVATE_KEY_NAME! --hw-version !PKG_HW_FAMILY! --sd-req !PKG_VERSION_SD_REQ! --bootloader !HEX_NAME_BL_BLE! --bootloader-version !HEX_VERSION_BL! --softdevice !HEX_NAME_SD! --sd-id !PKG_VERSION_SD_ID! --application !HEX_NAME_APP! --application-version !HEX_VERSION_APP! !PKG_NAME_BL_BLE_SD_APP!
        nrfutil pkg generate --key-file !PRIVATE_KEY_NAME! --hw-version !PKG_HW_FAMILY! --sd-req !PKG_VERSION_SD_REQ! --softdevice !HEX_NAME_SD! --sd-id !PKG_VERSION_SD_ID! --application !HEX_NAME_APP!  --application-version !HEX_VERSION_APP! !PKG_NAME_SD_APP!
    ) else if "!choice!"=="035" (
        python "!TOOL_PATH_ZIP_TO_BIN!" !PKG_NAME_BL_BLE! !BIN_NAME_BL_BLE!
        python "!TOOL_PATH_ZIP_TO_BIN!" !PKG_NAME_SOFTDEVICE! !BIN_NAME_SOFTDEVICE!
        python "!TOOL_PATH_ZIP_TO_BIN!" !PKG_NAME_APP! !BIN_NAME_APP!
        python "!TOOL_PATH_ZIP_TO_BIN!" !PKG_NAME_BL_BLE_SD! !BIN_NAME_BL_BLE_SD!
    ) else if "!choice!"=="036" (
        nrfjprog --family !PRO_IC_FAMILY! --recover !USER_JLINK_SNR!
        nrfjprog --family !PRO_IC_FAMILY! --eraseall !USER_JLINK_SNR!
        nrfjprog --family !PRO_IC_FAMILY! --program !HEX_NAME_MERGED_BLE! --sectorerase --verify --reset !USER_JLINK_SNR!
    ) else if "!choice!"=="037" (
        echo "DFU *.pkg from ble and find by name"
        if not "!BLE_DONGLE_JLINK_SNR!"=="" (
            nrfjprog --family !PRO_IC_FAMILY! --recover !DONGLE_PROG_JLINK_SNR!
        )
        nrfutil dfu ble -ic !PRO_IC_FAMILY! -pkg !PKG_NAME_APP! -p !BLE_DONGLE_COM_PORT! -n !IC_NAME! -f -cd 3 !DONGLE_DFU_JLINK_SNR!
    ) else if "!choice!"=="038" (
        echo "DFU *.pkg from ble and find by mac"
        if not "!BLE_DONGLE_JLINK_SNR!"=="" (
            nrfjprog --family !PRO_IC_FAMILY! --recover !DONGLE_PROG_JLINK_SNR!
        )
        nrfutil dfu ble -ic !PRO_IC_FAMILY! -pkg !PKG_NAME_APP! -p !BLE_DONGLE_COM_PORT! -a !IC_MAC! -f -cd 3 !DONGLE_DFU_JLINK_SNR!
    ) else if "!choice!"=="041" (
        echo "build uart bootloader project"

        echo "Init building bootloader project..."
        echo .>bootloader_build_log.txt
        UV4 -j0 -r !PROJECT_PATH_BOOTLOADER_UART! -o "!cd!\bootloader_build_log.txt"
        type bootloader_build_log.txt
        echo "bootloader build completed."
    ) else if "!choice!"=="042" (
        echo "build application project"

        echo "Init building application project..."
        echo .>application_build_log.txt
        UV4 -j0 -r !PROJECT_PATH_APPLICATION! -o "!cd!\application_build_log.txt"
        type application_build_log.txt
        echo "application build completed."
    ) else if "!choice!"=="043" (
        echo "copy softdevice uart_bootloader and application hex"
        copy !HEX_PATH_SD! !HEX_NAME_SD!
        copy !HEX_PATH_BL_UART! !HEX_NAME_BL_UART!
        copy !HEX_PATH_APP! !HEX_NAME_APP!
    ) else if "!choice!"=="044" (
        echo "merged hex"
        nrfutil settings generate --family !ST_IC_FAMILY! --application !HEX_NAME_APP! --application-version !HEX_VERSION_APP! --bootloader-version !HEX_VERSION_BL! --bl-settings-version !HEX_VERSION_ST! !HEX_NAME_ST!
        mergehex -m !HEX_NAME_SD! !HEX_NAME_APP!  -o !HEX_NAME_SD_APP! 
        mergehex -m !HEX_NAME_SD_APP!  !HEX_NAME_BL_UART! -o !HEX_NAME_SD_APP_BL_UART!
        mergehex -m !HEX_NAME_SD_APP_BL_UART! !HEX_NAME_ST! -o !HEX_NAME_MERGED_UART!
        REM del !HEX_NAME_ST!
        del !HEX_NAME_SD_APP!
        del !HEX_NAME_SD_APP_BL_UART!
        
        echo "packaged"
        nrfutil pkg generate --key-file !PRIVATE_KEY_NAME! --hw-version !PKG_HW_FAMILY! --sd-req !PKG_VERSION_SD_REQ! --bootloader !HEX_NAME_BL_UART! --bootloader-version !HEX_VERSION_BL! !PKG_NAME_BL_UART!
        nrfutil pkg generate --key-file !PRIVATE_KEY_NAME! --hw-version !PKG_HW_FAMILY! --sd-req !PKG_VERSION_SD_REQ! --softdevice !HEX_NAME_SD! --sd-id !PKG_VERSION_SD_ID! !PKG_NAME_SOFTDEVICE!
        nrfutil pkg generate --key-file !PRIVATE_KEY_NAME! --hw-version !PKG_HW_FAMILY! --sd-req !PKG_VERSION_SD_REQ! --application !HEX_NAME_APP! --application-version !HEX_VERSION_APP! !PKG_NAME_APP!

        nrfutil pkg generate --key-file !PRIVATE_KEY_NAME! --hw-version !PKG_HW_FAMILY! --sd-req !PKG_VERSION_SD_REQ! --bootloader !HEX_NAME_BL_UART! --bootloader-version !HEX_VERSION_BL! --softdevice !HEX_NAME_SD! --sd-id !PKG_VERSION_SD_ID! !PKG_NAME_BL_UART_SD!
        nrfutil pkg generate --key-file !PRIVATE_KEY_NAME! --hw-version !PKG_HW_FAMILY! --sd-req !PKG_VERSION_SD_REQ! --bootloader !HEX_NAME_BL_UART! --bootloader-version !HEX_VERSION_BL! --softdevice !HEX_NAME_SD! --sd-id !PKG_VERSION_SD_ID! --application !HEX_NAME_APP! --application-version !HEX_VERSION_APP! !PKG_NAME_BL_UART_SD_APP!
        nrfutil pkg generate --key-file !PRIVATE_KEY_NAME! --hw-version !PKG_HW_FAMILY! --sd-req !PKG_VERSION_SD_REQ! --softdevice !HEX_NAME_SD! --sd-id !PKG_VERSION_SD_ID! --application !HEX_NAME_APP!  --application-version !HEX_VERSION_APP! !PKG_NAME_SD_APP!
    ) else if "!choice!"=="045" (
        python "!TOOL_PATH_ZIP_TO_BIN!" !PKG_NAME_BL_BLE! !BIN_NAME_BL_BLE!
        python "!TOOL_PATH_ZIP_TO_BIN!" !PKG_NAME_SOFTDEVICE! !BIN_NAME_SOFTDEVICE!
        python "!TOOL_PATH_ZIP_TO_BIN!" !PKG_NAME_APP! !BIN_NAME_APP!
        python "!TOOL_PATH_ZIP_TO_BIN!" !PKG_NAME_BL_BLE_SD! !BIN_NAME_BL_BLE_SD!
    ) else if "!choice!"=="046" (
        nrfjprog --family !PRO_IC_FAMILY! --recover !USER_JLINK_SNR!
        nrfjprog --family !PRO_IC_FAMILY! --eraseall !USER_JLINK_SNR!
        nrfjprog --family !PRO_IC_FAMILY! --program !HEX_NAME_MERGED_UART! --sectorerase --verify --reset !USER_JLINK_SNR!
    ) else if "!choice!"=="047" (
        echo "DFU *.pkg from uart with NRF_BL_DFU_ENTER_METHOD_GPREGRET=1"
        
        SET "BOOTLOADER_DFU_START_MASK=0xF9"
        SET "BOOTLOADER_DFU_START=0xB1"
        SET "NRF_POWER_GPREGRET=0x4000051C"
        nrfjprog --family !PRO_IC_FAMILY! --memwr !NRF_POWER_GPREGRET! --val !BOOTLOADER_DFU_START! !USER_JLINK_SNR!
        nrfjprog --family !PRO_IC_FAMILY! --memrd !NRF_POWER_GPREGRET! --w 32 --n 4 !USER_JLINK_SNR!
        
        nrfjprog --family !PRO_IC_FAMILY! --debugreset !USER_JLINK_SNR!
        nrfutil dfu serial -pkg !PKG_NAME_APP! -p !UART_COM_PORT! -b !UART_COM_BAUD! -fc 0
    )else if "!choice!"=="048" (
        echo "DFU *.pkg from uart with 配置NRF_BL_DFU_ENTER_METHOD_PINRESET=1"
        
        nrfjprog --pinreset !USER_JLINK_SNR!
        nrfutil dfu serial -pkg !PKG_NAME_APP! -p !UART_COM_PORT! -b !UART_COM_BAUD! -fc 0
    )else if "!choice!"=="049" (
        echo "DFU *.pkg from uart with 配置NRF_BL_DFU_ENTER_METHOD_BUTTON=1"
        
        nrfjprog --family !PRO_IC_FAMILY! --debugreset !USER_JLINK_SNR!
        nrfutil dfu serial -pkg !PKG_NAME_APP! -p !UART_COM_PORT! -b !UART_COM_BAUD! -fc 0
    )
    REM 根据芯片型号判断下述代码是否需要执行
    if "!USB_MATCH!"=="TRUE" (
        if "!choice!"=="051" (
            echo "build usb bootloader project"

            echo "Init building bootloader project..."
            echo .>bootloader_build_log.txt
            UV4 -j0 -r !PROJECT_PATH_BOOTLOADER_USB! -o "!cd!\bootloader_build_log.txt"
            type bootloader_build_log.txt
            echo "bootloader build completed."
        ) else if "!choice!"=="052" (
            echo "build application project"

            echo "Init building application project..."
            echo .>application_build_log.txt
            UV4 -j0 -r !PROJECT_PATH_APPLICATION! -o "!cd!\application_build_log.txt"
            type application_build_log.txt
            echo "application build completed."
        ) else if "!choice!"=="053" (
            echo "copy softdevice usb_bootloader and application hex"
            copy !HEX_PATH_SD! !HEX_NAME_SD!
            copy !HEX_PATH_BL_USB! !HEX_NAME_BL_USB!
            copy !HEX_PATH_APP! !HEX_NAME_APP!
        ) else if "!choice!"=="054" (
            echo "merged hex"
            nrfutil settings generate --family !ST_IC_FAMILY! --application !HEX_NAME_APP! --application-version !HEX_VERSION_APP! --bootloader-version !HEX_VERSION_BL! --bl-settings-version !HEX_VERSION_ST! !HEX_NAME_ST!
            mergehex -m !HEX_NAME_SD! !HEX_NAME_APP!  -o !HEX_NAME_SD_APP! 
            mergehex -m !HEX_NAME_SD_APP!  !HEX_NAME_BL_USB! -o !HEX_NAME_SD_APP_BL_USB!
            mergehex -m !HEX_NAME_SD_APP_BL_USB! !HEX_NAME_ST! -o !HEX_NAME_MERGED_USB!
            REM del !HEX_NAME_ST!
            del !HEX_NAME_SD_APP!
            del !HEX_NAME_SD_APP_BL_USB!
            
            echo "packaged"
            nrfutil pkg generate --key-file !PRIVATE_KEY_NAME! --hw-version !PKG_HW_FAMILY! --sd-req !PKG_VERSION_SD_REQ! --bootloader !HEX_NAME_BL_USB! --bootloader-version !HEX_VERSION_BL! !PKG_NAME_BL_USB!
            nrfutil pkg generate --key-file !PRIVATE_KEY_NAME! --hw-version !PKG_HW_FAMILY! --sd-req !PKG_VERSION_SD_REQ! --softdevice !HEX_NAME_SD! --sd-id !PKG_VERSION_SD_ID! !PKG_NAME_SOFTDEVICE!
            nrfutil pkg generate --key-file !PRIVATE_KEY_NAME! --hw-version !PKG_HW_FAMILY! --sd-req !PKG_VERSION_SD_REQ! --application !HEX_NAME_APP! --application-version !HEX_VERSION_APP! !PKG_NAME_APP!

            nrfutil pkg generate --key-file !PRIVATE_KEY_NAME! --hw-version !PKG_HW_FAMILY! --sd-req !PKG_VERSION_SD_REQ! --bootloader !HEX_NAME_BL_USB! --bootloader-version !HEX_VERSION_BL! --softdevice !HEX_NAME_SD! --sd-id !PKG_VERSION_SD_ID! !PKG_NAME_BL_USB_SD!
            nrfutil pkg generate --key-file !PRIVATE_KEY_NAME! --hw-version !PKG_HW_FAMILY! --sd-req !PKG_VERSION_SD_REQ! --bootloader !HEX_NAME_BL_USB! --bootloader-version !HEX_VERSION_BL! --softdevice !HEX_NAME_SD! --sd-id !PKG_VERSION_SD_ID! --application !HEX_NAME_APP! --application-version !HEX_VERSION_APP! !PKG_NAME_BL_USB_SD_APP!
            nrfutil pkg generate --key-file !PRIVATE_KEY_NAME! --hw-version !PKG_HW_FAMILY! --sd-req !PKG_VERSION_SD_REQ! --softdevice !HEX_NAME_SD! --sd-id !PKG_VERSION_SD_ID! --application !HEX_NAME_APP!  --application-version !HEX_VERSION_APP! !PKG_NAME_SD_APP!

        ) else if "!choice!"=="055" (
            python "!TOOL_PATH_ZIP_TO_BIN!" !PKG_NAME_BL_BLE! !BIN_NAME_BL_BLE!
            python "!TOOL_PATH_ZIP_TO_BIN!" !PKG_NAME_SOFTDEVICE! !BIN_NAME_SOFTDEVICE!
            python "!TOOL_PATH_ZIP_TO_BIN!" !PKG_NAME_APP! !BIN_NAME_APP!
            python "!TOOL_PATH_ZIP_TO_BIN!" !PKG_NAME_BL_BLE_SD! !BIN_NAME_BL_BLE_SD!
        ) else if "!choice!"=="056" (
            nrfjprog --family !PRO_IC_FAMILY! --recover !USER_JLINK_SNR!
            nrfjprog --family !PRO_IC_FAMILY! --eraseall !USER_JLINK_SNR!
            nrfjprog --family !PRO_IC_FAMILY! --program !HEX_NAME_MERGED_USB! --sectorerase --verify --reset !USER_JLINK_SNR!
        ) else if "!choice!"=="057" (
            echo "DFU *.pkg from usb with NRF_BL_DFU_ENTER_METHOD_GPREGRET=1"
            
            SET "BOOTLOADER_DFU_START_MASK=0xF9"
            SET "BOOTLOADER_DFU_START=0xB1"
            SET "NRF_POWER_GPREGRET=0x4000051C"
            nrfjprog --family !PRO_IC_FAMILY! --memwr !NRF_POWER_GPREGRET! --val !BOOTLOADER_DFU_START! !USER_JLINK_SNR!
            nrfjprog --family !PRO_IC_FAMILY! --memrd !NRF_POWER_GPREGRET! --w 32 --n 4 !USER_JLINK_SNR!
            nrfjprog --family !PRO_IC_FAMILY! --debugreset !USER_JLINK_SNR!
            nrfutil dfu usb-serial -pkg !PKG_NAME_APP! -p !USB_COM_PORT! -b !USB_COM_BAUD!  -fc 0
        )else if "!choice!"=="058" (
            echo "DFU *.pkg from usb with 配置NRF_BL_DFU_ENTER_METHOD_PINRESET=1"
            
            nrfjprog --family !PRO_IC_FAMILY! --pinreset !USER_JLINK_SNR!
            nrfutil dfu usb-serial -pkg !PKG_NAME_APP! -p !USB_COM_PORT! -b !UART_COM_BAUD! -fc 0
        )else if "!choice!"=="059" (
            echo "DFU *.pkg from usb with 1或者NRF_BL_DFU_ENTER_METHOD_BUTTON=1 P0.25/P0.16"
            
            nrfjprog --family !PRO_IC_FAMILY! --debugreset !USER_JLINK_SNR!
            nrfutil dfu usb-serial -pkg !PKG_NAME_APP! -p !USB_COM_PORT! -b !UART_COM_BAUD! -fc 0
        )
    )

    if "!choice!"=="rcv" (
        nrfjprog --recover !USER_JLINK_SNR!
    ) else if "!choice!"=="rst" (
        nrfjprog --debugreset !USER_JLINK_SNR!
    ) else if "!choice!"=="e" (
        exit
    )

    pause
    goto prompt
    @endlocal

新手必知

海量第三方学习资源.

超全常用工具与文档.

本站常用资源下载.

常见问题搜索.

QQ群: 542294007.

文章引用自:元仓库 OLIB.cn.