/* Dummy configuration data. */
static configuration_t m_dummy_cfg =
{
.config1_on = false,
.config2_on = true,
.boot_count = 0x0,
.device_name = "dummy",
}; /* A record containing dummy configuration data. */
static fds_record_t const m_dummy_record =
{
.file_id = CONFIG_FILE,
.key = CONFIG_REC_KEY,
.data.p_data = &ucheck_v,//&m_dummy_cfg,
/* The length of a record is always expressed in 4-byte units (words). */
.data.length_words = (sizeof(ucheck_v) + 3) / sizeof(uint32_t),
}; /* Keep track of the progress of a delete_all operation. */
//static struct
//{
// bool delete_next; //!< Delete next record.
// bool pending; //!< Waiting for an fds FDS_EVT_DEL_RECORD event, to delete the next record.
//} m_delete_all; void user_data_update(void)
{
ret_code_t rc; // NRF_LOG_INFO("Reading flash usage statistics..."); fds_stat_t stat = {0}; rc = fds_stat(&stat);
APP_ERROR_CHECK(rc); NRF_LOG_INFO("Found %d valid records.", stat.valid_records);
NRF_LOG_INFO("Found %d dirty records (ready to be garbage collected).", stat.dirty_records); fds_record_desc_t desc = {0};
fds_find_token_t tok = {0}; rc = fds_record_find(CONFIG_FILE, CONFIG_REC_KEY, &desc, &tok); if (rc == FDS_SUCCESS)
{
/* A config file is in flash. Let's update it. */
fds_flash_record_t config = {0}; /* Open the record and read its contents. */
rc = fds_record_open(&desc, &config);
APP_ERROR_CHECK(rc); /* Copy the configuration from flash into m_dummy_cfg. */
//memcpy(&ucheck_v, config.p_data, sizeof(check_V));//这里是更新数据,所以不能把旧数据复制过来了 NRF_LOG_INFO("Config file found, updating boot count to %d.", ucheck_v.boot_count); /* Update boot count. */
ucheck_v.boot_count++; /* Close the record when done reading. */
rc = fds_record_close(&desc);
APP_ERROR_CHECK(rc); /* Write the updated record to flash. */
rc = fds_record_update(&desc, &m_dummy_record);
APP_ERROR_CHECK(rc);
}
else
{
/* System config not found; write a new one. */
NRF_LOG_INFO("Writing config file..."); rc = fds_record_write(&desc, &m_dummy_record);
APP_ERROR_CHECK(rc);
} //cli_start();
}
void user_init_data_flash(void)
{
ret_code_t rc;
fds_record_desc_t desc = {0};
fds_find_token_t tok = {0}; rc = fds_record_find(CONFIG_FILE, CONFIG_REC_KEY, &desc, &tok); if (rc == FDS_SUCCESS)
{
/* A config file is in flash. Let's update it. */
fds_flash_record_t config = {0}; /* Open the record and read its contents. */
rc = fds_record_open(&desc, &config);
APP_ERROR_CHECK(rc); /* Copy the configuration from flash into m_dummy_cfg. */
memcpy(&ucheck_v, config.p_data, sizeof(check_V)); NRF_LOG_INFO("Config file found, updating boot count to %d.", ucheck_v.boot_count); /* Update boot count. */
ucheck_v.boot_count++; /* Close the record when done reading. */
rc = fds_record_close(&desc);
APP_ERROR_CHECK(rc); /* Write the updated record to flash. */
rc = fds_record_update(&desc, &m_dummy_record);
APP_ERROR_CHECK(rc);
} }

在增加了DFU之后的52832程序,只要增加如下程序就可以完成FDS的数据保存

NRF52832的FDS程序,参考非蓝牙例程修改而来(需要增加DFU的基础上只要增加如下程序即可解决)的更多相关文章

  1. (Map)利用Map,完成下面的功能:  从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。  附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 附录 (Map)在原有世界杯Map 的基础上,增加如下功能: 读入一支球队的名字,输出该球队夺冠的年份列表。 例如,读入“巴西”,应当输出 1958 1962 1970 1

    package homework001; import java.util.HashMap; import java.util.Scanner; public class Map { public s ...

  2. QT创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束的简单示例

    QT创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束的简单示例 部分代码: // 创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束 QMenu *pDialog = mBar->ad ...

  3. 操作系统的发展史(并发与并行)<异步与同步>《进程与程序》[非堵塞与堵塞]

    目录 一:一:手工操作 -- 穿孔卡片 1.简介 二:手工操作方式两个特点: 三:批处理 -- 磁带存储 1.联机批处理系统 2.脱机批处理系统 3.多道程序系统 4.多道批处理系统 四:总结发展史 ...

  4. C#取得Web程序和非Web程序的根目录的N种取法

    取得控制台应用程序的根目录方法方法1.Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径方法2.AppDomain.CurrentDomain.BaseDi ...

  5. 从此走上一条iOS程序猿不归路。。。

    新的城市,新的生活!前不久刚刚结束了苦逼的面试找工作之旅,期间也小有收货,如今正处年底工作闲暇之余,将前一阵子陆陆续续的总结整理了一下,本人菜鸟程序猿一只,水平有限,本文总结的知识不算深入,比较浅显, ...

  6. Lua 学习之基础篇九<Lua 协同程序(Coroutine)>

    引言 讲到协程,首先来介绍一下线程和协程的区别 lua协程和多线程 相同之处:拥有自己独立的桟.局部变量和PC计数器,同时又与其他协程共享全局变量和其他大部分东西 不同之处:一个多线程程序可以同时运行 ...

  7. 应用程序框架实战十四:DDD分层架构之领域实体(基础篇)

    上一篇,我介绍了自己在DDD分层架构方面的一些感想,本文开始介绍领域层的实体,代码主要参考自<领域驱动设计C#2008实现>,另外参考了网上找到的一些示例代码. 什么是实体 由标识来区分的 ...

  8. 基于php基础语言编写的小程序之计算器

    基于php基础语言编写的小程序之计算器 需求:在输入框中输入数字进行加.减.乘.除运算(html+php) 思路: 1首先要创建输入数字和运算符的输入框,数字用input的text属性,运算符用sel ...

  9. 【转】appStore上传苹果应用程序软件发布流程

    转载地址:http://blog.sina.com.cn/s/blog_68661bd801019uzd.html 首先确定帐号是否能发布, https://developer.apple.com/a ...

  10. appStore上传苹果应用程序软件发布流程(之前都是同事发,复制一份备用)

    首先确定帐号是否能发布, https://developer.apple.com/account,如果你打开Provisioning Portal,然后点击DisTribution看到的是下图中那样, ...

随机推荐

  1. dockerfile实践学习

    一.dockerfile简介 镜像是分层存储的,每一层在前一层的基础上进行修改. 容器也是分层存储,已经向为基础层,在其他基础上加一层作为容器运行的存储层. 创建镜像的另种两种方法 手动修改容器内容, ...

  2. Paddiing 组件

    一.Flutter Paddiing 组件 在 html 中常见的布局标签都有 padding 属性,但是 Flutter 中很多 Widget 是没有 padding 属性.这个时候我们可以用 Pa ...

  3. 安装git-lfs

    git大文件报错: smudge filter lfs failedwarning: 克隆成功,但是检出失败.您可以通过 'git status' 检查哪些已被检出,然后使用命令'git checko ...

  4. win10事件查看器出现10016错误的解决办法

    该错误一般会重复出现在事件查看器,严重的会导致系统卡死. 以解决下列错误为例,给出步骤: 注意记录用户(划掉的部分)及要添加的权限(本例为"本地激活"权限) 1.运行regedit ...

  5. 实现分页数据请求的思路/Element UI(Plus)的分页模板(Vue3.x写法),(直接使用<script>引入vue.js)

    实现分页数据请求的思路/Element UI(Plus)的分页模板(Vue3.x写法),(直接使用<script>引入vue.js) 1. 效果图: 2.实现分页数据请求的思路:   分页 ...

  6. uniapp 通用函数说明

    onLoad函数      监听页面加载,在onLoad中发送请求是比较合适的,即页面一加载就发送请求获取数据,option接受其他界面传过来的数据,数据类型为obj onLoad(option) { ...

  7. ResponseUtil 请求返回

    package com.infosec.sso.common; import java.io.IOException; import java.util.HashMap; import java.ut ...

  8. vue remark重置 提交

    html: <el-table-column prop="remark" label="">                 <templat ...

  9. ES操作

    总结一些ES的操作方式及语法   查看健康状态 curl -XGET http://localhost:9200/_cluster/health?pretty   查看索引 curl -XGET ht ...

  10. java使用minio上传下载文件

    Minio模板类: @RequiredArgsConstructor public class MinioTemplate implements InitializingBean { private ...