1、环境搭建以及需要的软件见这篇文章:Secure DFU环境搭建_Zoolybo的博客-CSDN博客

2、密钥以及加密算法的方法详见这篇文章:详解蓝牙空中升级(BLE OTA)原理与步骤_Zoolybo的博客-CSDN博客

一、生成bootloader.hex

1、把dfu_public_key.c拷贝至SDK目录......\...\examples\dfu,替换原有的同名文件。

2、将BLE_peripheral_test\external\micro-ecc文件见拷贝至同目录下替换。

3、打开bootloader工程D:\NUS with DFU\examples\dfu\secure_bootloader\pca10040_s132_ble\arm5_no_packs

4、将...........\examples\dfu\secure_bootloader\pca10040_s132_ble\arm5_no_packs\_build中的hex文件 nrf52832_xxaa_s132copy出来重命名为bootloader.hex.

二、生成app.hex

1、打开NUS工程:D:\...\examples\ble_peripheral\ble_app_uart\pca10040\s132\arm5_no_packs

2\对sdk_config.h修改成如下配置:

#ifndef BLE_DFU_ENABLED#define BLE_DFU_ENABLED 1#endif// <q> NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS  - Buttonless DFU supports bonds.#ifndef NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS#define NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS 0#endif
// <o> NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE - Attribute Table size in bytes. The size must be a multiple of 4.#ifndef NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE#define NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE 1600#endif// <o> NRF_SDH_BLE_VS_UUID_COUNT - The number of vendor-specific UUIDs.#ifndef NRF_SDH_BLE_VS_UUID_COUNT#define NRF_SDH_BLE_VS_UUID_COUNT 2#endif

3、修改应用程序RAM起始地址,如下:

4、

在main.c中添加如下头文件定义:

#ifdef DFU_SUPPORT#include "ble_dfu.h"#endif

在main函数中的services_init();函数中添加如下代码:

 #ifdef DFU_SUPPORTble_dfu_buttonless_init_t dfus_init = {0};// Initialize the async SVCI interface to bootloader.err_code = ble_dfu_buttonless_async_svci_init();APP_ERROR_CHECK(err_code); dfus_init.evt_handler = ble_dfu_evt_handler; err_code = ble_dfu_buttonless_init(&dfus_init);APP_ERROR_CHECK(err_code);#endif

添加ble_dfu_evt_handler代码如下:

// YOUR_JOB: Update this code if you want to do anything given a DFU event (optional).
/**@brief Function for handling dfu events from the Buttonless Secure DFU service** @param[in]   event   Event from the Buttonless Secure DFU service.*/
static void ble_dfu_evt_handler(ble_dfu_buttonless_evt_type_t event)
{switch (event){case BLE_DFU_EVT_BOOTLOADER_ENTER_PREPARE:{NRF_LOG_INFO("Device is preparing to enter bootloader mode.");// Prevent device from advertising on disconnect.ble_adv_modes_config_t config;advertising_config_get(&config);config.ble_adv_on_disconnect_disabled = true;ble_advertising_modes_config_set(&m_advertising, &config);// Disconnect all other bonded devices that currently are connected.// This is required to receive a service changed indication// on bootup after a successful (or aborted) Device Firmware Update.uint32_t conn_count = ble_conn_state_for_each_connected(disconnect, NULL);NRF_LOG_INFO("Disconnected %d links.", conn_count);break;}case BLE_DFU_EVT_BOOTLOADER_ENTER:// YOUR_JOB: Write app-specific unwritten data to FLASH, control finalization of this//           by delaying reset by reporting false in app_shutdown_handlerNRF_LOG_INFO("Device will enter bootloader mode.");break;case BLE_DFU_EVT_BOOTLOADER_ENTER_FAILED:NRF_LOG_ERROR("Request to enter bootloader mode failed asynchroneously.");// YOUR_JOB: Take corrective measures to resolve the issue//           like calling APP_ERROR_CHECK to reset the device.break;case BLE_DFU_EVT_RESPONSE_SEND_ERROR:NRF_LOG_ERROR("Request to send a response to client failed.");// YOUR_JOB: Take corrective measures to resolve the issue//           like calling APP_ERROR_CHECK to reset the device.APP_ERROR_CHECK(false);break;default:NRF_LOG_ERROR("Unknown event from ble_dfu_buttonless.");break;}
}

添加sd_ble_gap_disconnect函数定义如下:

static void disconnect(uint16_t conn_handle, void * p_context)
{UNUSED_PARAMETER(p_context);ret_code_t err_code = sd_ble_gap_disconnect(conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);if (err_code != NRF_SUCCESS){NRF_LOG_WARNING("Failed to disconnect connection. Connection handle: %d Error: %d", conn_handle, err_code);}else{NRF_LOG_DEBUG("Disconnected connection handle %d", conn_handle);}
}

添加advertising_config_get函数定义如下:

static void advertising_config_get(ble_adv_modes_config_t * p_config)
{memset(p_config, 0, sizeof(ble_adv_modes_config_t));p_config->ble_adv_fast_enabled  = true;p_config->ble_adv_fast_interval = APP_ADV_INTERVAL;p_config->ble_adv_fast_timeout  = APP_ADV_DURATION;
}

5、

  1. 添加上述函数涉及到的文件,宏定义及包含相关目录。首先添加如下DFU目录及相关文件:

对SDK不熟悉的童鞋可以直接查找这几个文件然后按照路径添加即可

6、在define中添加这些宏:DEBUG DFU_SUPPORT BL_SETTINGS_ACCESS_ONLY NRF_DFU_SVCI_ENABLED NRF_DFU_TRANSPORT_BLE=1,其中DEBUG宏只是为了调试方便而设置的,跟DFU本身无关。DFU_SUPPORT是我用来控制我添加的DFU代码的,删掉DFU_SUPPORT,将不编译所有DFU有关代码。其余的宏都是系统自带的,如果要支持DFU,也是必须要定义的。

然后包含下列目录:

7、编译,0错误0警告

8、 将......examples\ble_peripheral\ble_app_uart\pca10040\s132\arm5_no_packs\_build中的nrf52832_xxaa.hex拷贝出两份,一份重命名为app_new.hex,一份重新命名为app.hex

三、合并烧写hex

1、打开CMD命令行使用cd命令进入到存放hex的文件夹下,例如:C:\Users\zoolybo>cd /d D:\NUS with DFU\keys

2、将上文生成的3个hex文件和softdevice hex文件merge成一个文件,然后通过nrfjprog或者nRF Connect桌面版进行烧写,相关命令如下所示:

mergehex --merge bootloader.hex settings.hex --output bl_temp.hex
mergehex --merge bl_temp.hex app.hex s132_nrf52_7.2.0_softdevice.hex --output whole.hex

3、通过nrfutil生成新固件对应的zip包:SDK170_app_s132.zip。zip包包含新固件和init包,zip包一般通过云端下发到手机app,手机app再通过蓝牙下载到设备中。生成zip包的命令如下所示:

D:\NUS with DFU\keys>nrfutil pkg generate --application app_new.hex --application-version 2 --hw-version 52 --sd-req 0x101 --key-file private.key SDK170_app_s132.zip

4、使用下列的命令烧写hex文件到芯片 ,如图所示

nrfjprog --eraseall -f NRF52
nrfjprog --program whole.hex --verify -f NRF52
nrfjprog --reset -f NRF52

四、通过DFU升级

此时已经可以收到一个广播名字为DfuTarg的设备了。如图所示

我们将之前生成的升级包SDK170_app_s132.zip可以通过微信的文件传输助手发送到手机,单击压缩包选择使用其他应用打开

选择使用nrf connect打开

然后界面如下

单击右上角的connect,连接设备在选择DFU选项卡

单击升级包选择start开始升级

升级成功后显示这个界面

再次刷线蓝牙搜索,新的升级包已经在运行了,能够搜索到Nordic_UART的设备了

SDK_17.1.0 nrf52832 串口透传(NUS)增加DFU功能OTA相关推荐

  1. 【从0到1搭建LoRa物联网】19、LoRa串口透传例程(补充)

    系列文章: [从0到1搭建LoRa物联网]1.LoRa物联网的架构 [从0到1搭建LoRa物联网]2.终端设备开发方式 [从0到1搭建LoRa物联网]3.国产LoRa终端ASR6505软硬件 [从0到 ...

  2. mysql监听串口_tcp与串口透传(select)

    介绍 tcp作为服务端,监听端口8888,实现串口透传,这里是使用select监听tcp的receive和串口的read,单工通信 -p 指定tcp端口 -s 指定串口 -b 指定波特率 支持4800 ...

  3. Arduino通过串口透传ESP 13板与java程序交互

    Arduino通过串口透传ESP13板与java程序交互 这个程序最基本的想法是用java把Arduino抽象出来,忙活了好几天,虽然没有达到最后的想法,但是学到了很多. Main.java publ ...

  4. STM32------>第三天,spi补充,uart-dma,NB-loT介绍,At指令,串口透传

    spi 补充 uart通讯: 通讯双方波特率,帧格式必须一致 spi通讯:  通讯双方极性,相位一致 Lcd /******************************************** ...

  5. STM32和树莓派串口透传

    目录 树莓派环境串口透传 STM32环境串口透传 最近做一个项目需要STM32和树莓派进行串口通信,实现原理如下: 第一步:使用USB转TTL分别调试STM32和树莓派的串口透传,确保可以通信: 第二 ...

  6. CC2541增加特征值 CHAR6实现串口透传

    一.实现串口 1.1.CC2541的串口简介   CC2541有21个数字输入/输出引脚, 可以配置为通用数字I/O或外设I/O信号, 配置为连接到ADC. 定时器或 USART外设.这些 I/O 口 ...

  7. ft4232树莓派linux扩展串口,如何实现STM32和树莓派串口透传?

    最近做一个项目需要STM32和树莓派进行串口通信,实现原理如下: 第一步:使用USB转TTL分别调试STM32和树莓派的串口透传,确保可以通信: 第二步:确保第一步成功后,将树莓派和STM32连接,进 ...

  8. 【单片机笔记】使用ESP8266的WIFI-MQTT串口透传模块实现TLINK平台测试

    以下内容是使用MARS-WIFI-MQTT串口透传工具对TLINK平台中的MQTT协议进行的测试,请用户使用自己的帐号创建设备进行测试. 模块手册在下面连接中找: 链接:https://pan.bai ...

  9. linux系统串口透传,基于CC2540的USB虚拟串口透传方案

    1.USB虚拟串口代替物理串口的可行性 首先,越来越多带USB接口的器件涌现出来,如带USB接口的单片机,或独立的USB接口器件,而且这些器件的成本已经很接近于使用RS232电平转换芯片所带来的成本. ...

最新文章

  1. php在函数内使用全局变量
  2. retrofit 解析百度地图api 返回数据_阿里二面:关于 Retrofit 你知道多少?看完你的offer稳了
  3. python3.7.2怎么使用win7_Win7同时安装Python2和Python3的配置
  4. 使用OC语言批量修改文件名称
  5. 设计模式——中介者模式
  6. RHEL/CentOS下编译安装Nginx
  7. 第二十三章:准备原材料
  8. 线上问题:大事务问题
  9. excel 第20讲:图表基础
  10. 学习C语言的入门程序
  11. 利用手机设置路由器密码
  12. 流量分析技术丨分享科来网络通讯协议图2022版本(附下载链接)
  13. [译]eBay Elasticsearch性能调优实践
  14. codeforces 1553B Reverse String
  15. 5.登录注册找回密码
  16. ffmpeg画中画效果
  17. word文件解除保护模式让其可编辑
  18. 上帝的心态发生了改变---太原市-------从热血沸腾到麻木不仁
  19. VS2015远程调试
  20. linux系统下如何挂载NTFS移动硬盘

热门文章

  1. 2019计算机专业毕设选题,2019计算机专业毕业论文开题报告
  2. windows8输入法终极完美修复
  3. qq服务器 udp协议,基于UDP傳输协议的实时通信系统的开发(仿qq聊天程序).doc
  4. 惠普新CEO象征性年薪仅1美元 有望获大量股权
  5. 【Pytorch】DCGAN实战(三):二次元动漫头像生成
  6. B端产品设计与运营实战
  7. 成都市冠卓品牌设计责任有限公司“开展走访慰问活动”
  8. 网上银行转账是怎么测的,设计一下测试用例
  9. SQL数据规范1NF、2NF、3NF
  10. 北极星指标|专家建议如何有效制订NSM以驱动增长