编译环境Keil,NRF52840 S140协议栈为例使用noinit ram将APP的广播ID序列号存到非初时化ram区,DFU时取出内容id并广播出来,要求APP广播名为S140_XXXXXX,DFU广播名为DFU_XXXXXX,保存2者的id号要一致,如下步骤实现数据在软件复位的情况下进行数据保存不丢失

  • 应用程序广播名拼接
#define DEVICE_NAME                     "S140_"
uint32_t test_id = 10086;
/**@brief Function for the GAP initialization.** @details This function will set up all the necessary GAP (Generic Access Profile) parameters of*          the device. It also sets the permissions and appearance.*/
static void gap_params_init(void)
{uint32_t                err_code;ble_gap_conn_params_t   gap_conn_params;ble_gap_conn_sec_mode_t sec_mode;BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);char buf[32];uint8_t name_len = sprintf(buf,"%s%06u",DEVICE_NAME,test_id);err_code = sd_ble_gap_device_name_set(&sec_mode,(const uint8_t *) buf,name_len);APP_ERROR_CHECK(err_code);memset(&gap_conn_params, 0, sizeof(gap_conn_params));gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;gap_conn_params.slave_latency     = SLAVE_LATENCY;gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;err_code = sd_ble_gap_ppcp_set(&gap_conn_params);APP_ERROR_CHECK(err_code);
}
  • 定义noinit地址范围,在keil target下配置
  • 这里在RAM的末尾配置16字节noinit RAM,因为NRF52840_xxAA的RAM大小为256KB,那么
    IRAM1 Start + Size = IRAM2 Start
    IRAM2 Start + Size = 256 * 1024 = 0x40000,则
    IRAM2 Start = 0x20002AE8 + 0X3D508 = 0x2003FFF0
    IRAM2 Start 0x2003FFF0 + 0x10 = 0x40000,刚好是NRF52840_xxAA RAM的总大小值
  • 定义保存ID的变量类型
typedef struct
{uint8_t id[8];uint32_t flag;
}noinit_data_info_t;
  • 定义变量并指定到0x2003FFF0地址

#define __noinit__ __attribute__((at(0x2003FFF0)))
__noinit__ noinit_data_info_t noinit_data;
  • 保存ID函数实现
/**
* @brieaf 保存ID
*/
/**
* @brieaf 保存ID
*/
void save_id_to_noinit_ram(void)
{memset(&noinit_data,0,sizeof(noinit_data));sprintf((char*)noinit_data.id,"%06u",test_id);noinit_data.flag = 0x55AAAA55;
}
  • 进入DFU前调用save_id_to_noinit_ram函数,这里仅接收到任意数据都会进入DFU
void save_id_to_noinit_ram(void);
/**@brief Function for handling the data from the Nordic UART Service.** @details This function will process the data received from the Nordic UART BLE Service and send*          it to the UART module.** @param[in] p_evt       Nordic UART Service event.*/
/**@snippet [Handling the data received over BLE] */
static void nus_data_handler(ble_nus_evt_t * p_evt)
{if (p_evt->type == BLE_NUS_EVT_RX_DATA){save_id_to_noinit_ram();sd_power_gpregret_clr(0,0xffffffff); sd_power_gpregret_set(0,0xb1);NVIC_SystemReset();}}

DFU工程配置RAM

  • 定义变量类型及变量同APP工程一致

typedef struct
{uint8_t id[8];uint32_t flag;
}noinit_data_info_t;#define __noinit__ __attribute__((at(0x2003FFF0)))
__noinit__ noinit_data_info_t noinit_data;
  • 获取ID函数
uint8_t *get_id_string(void)
{if(noinit_data.flag != 0x55AAAA55) //默认ID为1{noinit_data.id[0] = '0';noinit_data.id[1] = '0';noinit_data.id[2] = '0';noinit_data.id[3] = '0';noinit_data.id[4] = '0';noinit_data.id[5] = '1';noinit_data.id[6] = '\0';}return noinit_data.id;
}
  • sdk_config.h定义DFU_前缀名称
// <s> NRF_DFU_BLE_ADV_NAME - Default advertising name.
#ifndef NRF_DFU_BLE_ADV_NAME
#define NRF_DFU_BLE_ADV_NAME "DFU_"
#endif
  • 修改nrf_dfu_ble.c中gap_params_init函数中的内容
uint8_t *get_id_string(void);
/**@brief     Function for initializing GAP.** @details   This function sets up all necessary GAP (Generic Access Profile) parameters of*            the device. It also sets the permissions and appearance.*/
static uint32_t gap_params_init(void)
{uint32_t                err_code;ble_gap_conn_sec_mode_t sec_mode;uint8_t const *         device_name;uint32_t                name_len;BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);#if (!NRF_DFU_BLE_REQUIRES_BONDS)err_code = gap_address_change();VERIFY_SUCCESS(err_code);if ((m_flags & DFU_BLE_FLAG_USE_ADV_NAME) != 0){NRF_LOG_DEBUG("Setting adv name: %s, length: %d", m_adv_name.name, m_adv_name.len);device_name = m_adv_name.name;name_len    = m_adv_name.len;}else
#endif{NRF_LOG_DEBUG("Using default advertising name");//#############################################################// 以下是修改的内容uint8_t buf[32];memset(buf,0,sizeof(buf));name_len  = strlen(NRF_DFU_BLE_ADV_NAME);uint8_t const *pName = (uint8_t const *)(NRF_DFU_BLE_ADV_NAME);for(uint8_t i=0; i<name_len; i++){buf[i] = pName[i];}pName = get_id_string();for(uint8_t i=0; i<6; i++){buf[name_len] = pName[i];name_len++;}device_name = (uint8_t const *)buf;//#################################################################   }err_code = sd_ble_gap_device_name_set(&sec_mode, device_name, name_len);VERIFY_SUCCESS(err_code);err_code = sd_ble_gap_ppcp_set(&m_gap_conn_params);return err_code;
}
  • 删除APP和DFU工程中的_build文件夹里的内容,编译2个工程,烧录运行,APP扫描蓝牙名称如下
  • 连接并发送任意字符进入DFU,DFU文播DFU_010086,后缀ID和APP后缀成功保持一致了
  • 加载升级包升级

源码下载

NRF52840 DFU APP使用noinit ram方法相关推荐

  1. NRF52840 DFU升级(四):GPREGRET标志位升级

    参考博文<蓝牙nrf51822空中升级> 相关文章:<NRF52840 DFU升级(一): 按键升级>                   <NRF52840 DFU升级 ...

  2. android启动其他app的服务器,Android中通过外部程序启动App的三种方法

    这篇文章主要介绍了Android中通过外部程序启动App的三种方法, 本文讲解了直接通过包名. 通过自定义的Action. 通过Scheme三种方法,并分别给出操作代码,需要的朋友可以参考下 ==== ...

  3. 打开模拟器上app的文件位置方法

    打开模拟器上app的文件位置方法,可以借助该工具,轻易的打开app沙盒文件夹 SimPholders2 转载于:https://www.cnblogs.com/skyry/p/5114507.html

  4. android 监控行为,一种针对Android系统App行为的监控方法

    主权项: 1.一种针对Android系统App行为的监控方法,通过安全内核实现方法在Android内核层添加模块,实现对整个Android系统的系统调用的拦截与监控:包括如下步骤:S1.编写内核模块: ...

  5. Android APP一键退出的方法总结分析

    本文出处: 炎之铠csdn博客:http://blog.csdn.net/totond 炎之铠邮箱:yanzhikai_yjk@qq.com 本文demo地址:https://github.com/t ...

  6. fiddler拦截模拟器中app的请求设置方法

    fiddler拦截模拟器中app的请求设置方法 fiddler设置 Tools -> Options -> connections 设置端口号 可以勾选Allow remote compu ...

  7. 交管12123服务器维护,交管12123服务异常怎么办?交管12123 APP服务异常解决方法...

    交管12123APP是可以随时为你查询违章.缴纳违法费用等服务的软件,也是一款专门为了驾校考试研发的软件,但是最近很多用户发现登录时会遇到服务异常的问题,那么,要怎么解决这个问题呢?接下来,小编就为大 ...

  8. 从Spy Mouse看App Store的推广方法

    原创文章,转载请注明: 转载自All-iPad.net 本文链接地址: 从Spy Mouse看App Store的推广方法 Spy Mouse是EA新发布的一款iPhone游戏,由其在前不久前收购的F ...

  9. 分享国外移动互联网应用app常用21个方法

    近期N多好友都在关注互联网的新趋势,移动互联网,那么如何做好这些移动应用的推广哪?今天做个小小的分享,关于国外专业APP营销公司的常用的21种APP推广方式 步骤/方法 Twitter促销服务 新闻稿 ...

  10. 虚幻引擎UE4.25版本使用Android打包出错提示:ERROR: cmd.exe failed with args /c 和 :app:assembleDebug的解决方法

    虚幻引擎 UE4.25版本使用Android打包出错提示:ERROR: cmd.exe failed with args /c 和 :app:assembleDebug的解决方法: 在虚幻引擎的jdk ...

最新文章

  1. r语言中矩阵QR分解_R语言常用的矩阵操作
  2. MySQL—表的完整性约束(外键约束)(二)
  3. nyoj-68--三点顺序
  4. DCMTK:创建,编写和读取细分对象
  5. Ognl,Context,ValueStack详解
  6. ubuntu 下 php 安装 zip
  7. 【机器视觉学习笔记】大津法/Otsu最大类间方差法 最佳阈值处理(C++)
  8. Redis:12---有序集合对象
  9. 精确的硬盘整数分区方法
  10. 排序算法2:冒泡排序
  11. 你应该知道的Redis过期键和过期策略
  12. 七年级下册政治知识点总结
  13. JS if语句,switch语句——经典例子(水仙花数、瑞年)
  14. 有关DLNA的一个讲座
  15. 苹果手机点击输入框input 页面放大 超出屏幕问题
  16. 代理记账的基本流程是什么
  17. 看到大神移植系统了,我来整理下市面上的系统...
  18. Android8.0 核心app或者service crash多次会进入Recovery
  19. 2019年杭电计算机考研经验
  20. java之一篇:java的执行顺序表象

热门文章

  1. sigmoid函数推导过程
  2. Spring代码实例系列-绪论
  3. Windows 10 : 使用BCDboot恢复双系统启动
  4. Tableau零基础教程
  5. 微信小程序 图片显示不出来的问题 100%管用
  6. 4.3 CMMI4级——定量项目管理(Quatitative Project Management)
  7. c10k java_c10k问题及其解决方案
  8. 游戏使用html签名,利用HTML5实现电子签名板文字涂鸦代码
  9. Reflector dll反编译工具
  10. Java写的答题助手项目分析与总结(二)