STM32 利用FlashDB库实现在线扇区数据管理不丢失

这篇具有很好参考价值的文章主要介绍了STM32 利用FlashDB库实现在线扇区数据管理不丢失。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32 利用FlashDB库实现在线扇区数据管理不丢失


  • 📍FalshDB地址:https://gitee.com/Armink/FlashDB
  • ✨STM32没有片内EEPROM这样的存储区,虽然有备份寄存器,仅可以实现对少量数据的频繁存储,但是依赖备份电源(BAT引脚)为芯片维持供电,才能保持数据的不丢失。FlashDB库利用在线对片内或片外存储扇区进行管理,可以有效的保存数据,掉电不丢失。在不增加像EEPROM外设的情况下,有效利用内部空余的flash空间,进行数据存储,也可以对片外spi flash存储芯片进行数据管理。类似esp32的NVS空间,也有使用键值对,进行数据存储和管理。
  • 🌿FlashDB库,目前包含STM32F1、F4的相关Keil MDK demo现成的工程例程,可以直接测试使用,可以移植到STM32其他型号单片机上使用。目前是支持STM32和esp8266的。
  • 🧨FlashDB移植指南:https://armink.gitee.io/flashdb/#/zh-cn/porting
  • 🥕类似轻量级的还有EasyFlash(同作者FlashDB) 、 tinyFlash.
  • 🔖个人使用的是STM32F427进行demo测试,测试结果和说明文档内容相符。
    flashdb,stm32,stm32,FlashDB
  • 🥕以下内容是该项目作者的对其的相关内容的介绍:

📘FlashDB使用场景介绍

  • 🎉如今,物联网产品种类越来越多,运行时产生的数据种类及总量及也在不断变大。FlashDB 提供了多样化的数据存储方案,不仅资源占用小,并且存储容量大,非常适合用于物联网产品。下面是主要应用场景:
  • 键值数据库 :
    • 产品参数存储
    • 用户配置信息存储
    • 小文件管理
  • 时序数据库 :
    存储动态产生的结构化数据:如 温湿度传感器采集的环境监测信息,智能手环实时记录的人体健康信息等
    记录运行日志:存储产品历史的运行日志,异常告警的记录等

KVDB 键值数据库介绍

  • 🌿KVDB 的基础功能的使用:

记录开机次数:

void kvdb_basic_sample(fdb_kvdb_t kvdb)
{
    struct fdb_blob blob;
    int boot_count = 0;

    FDB_INFO("==================== kvdb_basic_sample ====================\n");

    { /* GET the KV value */
        /* get the "boot_count" KV value */
        fdb_kv_get_blob(kvdb, "boot_count", fdb_blob_make(&blob, &boot_count, sizeof(boot_count)));
        /* the blob.saved.len is more than 0 when get the value successful */
        if (blob.saved.len > 0) {
            FDB_INFO("get the 'boot_count' value is %d\n", boot_count);
        } else {
            FDB_INFO("get the 'boot_count' failed\n");
        }
    }

    { /* CHANGE the KV value */
        /* increase the boot count */
        boot_count ++;
        /* change the "boot_count" KV's value */
        fdb_kv_set_blob(kvdb, "boot_count", fdb_blob_make(&blob, &boot_count, sizeof(boot_count)));
        FDB_INFO("set the 'boot_count' value to %d\n", boot_count);
    }

    FDB_INFO("===========================================================\n");
}
  • 🌿字符串类型 KV

字符串 KV 的相关功能,字符串 KV 作为一个特殊的 KV 类型,其 Key 与 Value 均为字符串,常被用于参数存储、命令存储等可读性要求较高的场景。

void kvdb_type_string_sample(fdb_kvdb_t kvdb)
{
    FDB_INFO("==================== kvdb_type_string_sample ====================\n");
    { /* CREATE new Key-Value */
        char temp_data[10] = "36C";

        /* It will create new KV node when "temp" KV not in database. */
        fdb_kv_set(kvdb, "temp", temp_data);
        FDB_INFO("create the 'temp' string KV, value is: %s\n", temp_data);
    }

    { /* GET the KV value */
        char *return_value, temp_data[10] = { 0 };

        /* Get the "temp" KV value.
         * NOTE: The return value saved in fdb_kv_get's buffer. Please copy away as soon as possible.
         */
        return_value = fdb_kv_get(kvdb, "temp");
        /* the return value is NULL when get the value failed */
        if (return_value != NULL) {
            strncpy(temp_data, return_value, sizeof(temp_data));
            FDB_INFO("get the 'temp' value is: %s\n", temp_data);
        }
    }

    { /* CHANGE the KV value */
        char temp_data[10] = "38C";

        /* change the "temp" KV's value to "38C" */
        fdb_kv_set(kvdb, "temp", temp_data);
        FDB_INFO("set 'temp' value to %s\n", temp_data);
    }

    { /* DELETE the KV by name */
        fdb_kv_del(kvdb, "temp");
        FDB_INFO("delete the 'temp' finish\n");
    }

    FDB_INFO("===========================================================\n");
}
  • 遍历所有 KV

遍历 KVDB 中的所有 KV ,用户可以在遍历 KV 时增加自己的处理动作。

  • 首先初始化了 KVDB 的迭代器,然后使用迭代器 API ,将 KVDB 的所有 KV 逐一遍历出来。
    遍历出来的 KV 对象含有 KV 的一些属性,包括:key name, value saved addr, value length 等,用户通过 fdb_blob_read 配合 fdb_kv_to_blob 读取出来,做一些自己的业务处理。
void kvdb_tarversal_sample(fdb_kvdb_t kvdb)
{
    struct fdb_kv_iterator iterator;
    fdb_kv_t cur_kv;
    struct fdb_blob blob;
    size_t data_size;
    uint8_t *data_buf;

    fdb_kv_iterator_init(kvdb, &iterator);

    while (fdb_kv_iterate(kvdb, &iterator)) {
        cur_kv = &(iterator.curr_kv);
        data_size = (size_t) cur_kv->value_len;
        data_buf = (uint8_t *) malloc(data_size);
        if (data_buf == NULL) {
            FDB_INFO("Error: malloc failed.\n");
            break;
        }
        fdb_blob_read((fdb_db_t) kvdb, fdb_kv_to_blob(cur_kv, fdb_blob_make(&blob, data_buf, data_size)));
        /*
         * balabala do what ever you like with blob...
         */
        free(data_buf);
    }
}

flashdb,stm32,stm32,FlashDB

  • 二进制大对象 (BLOB)

时序数据库

  • TSDB 基础示例,具体介绍:https://armink.gitee.io/flashdb/#/zh-cn/sample-tsdb-basic
  • 该示例主要演示了 TSDB 的基础功能,包括 TSL(时序记录)的追加、查询及状态修改功能。

samples/tsdb_sample.c ,包含追加、查询及状态修改这几个过程,大致代码如下:

void tsdb_sample(fdb_tsdb_t tsdb)
{
    struct fdb_blob blob;

    FDB_INFO("==================== tsdb_sample ====================\n");

    { /* APPEND new TSL (time series log) */
        struct env_status status;

        /* append new log to TSDB */
        status.temp = 36;
        status.humi = 85;
        fdb_tsl_append(tsdb, fdb_blob_make(&blob, &status, sizeof(status)));
        FDB_INFO("append the new status.temp (%d) and status.humi (%d)\n", status.temp, status.humi);

        status.temp = 38;
        status.humi = 90;
        fdb_tsl_append(tsdb, fdb_blob_make(&blob, &status, sizeof(status)));
        FDB_INFO("append the new status.temp (%d) and status.humi (%d)\n", status.temp, status.humi);
    }

    { /* QUERY the TSDB */
        /* query all TSL in TSDB by iterator */
        fdb_tsl_iter(tsdb, query_cb, tsdb);
    }

    { /* QUERY the TSDB by time */
        /* prepare query time (from 1970-01-01 00:00:00 to 2020-05-05 00:00:00) */
        struct tm tm_from = { .tm_year = 1970 - 1900, .tm_mon = 0, .tm_mday = 1, .tm_hour = 0, .tm_min = 0, .tm_sec = 0 };
        struct tm tm_to = { .tm_year = 2020 - 1900, .tm_mon = 4, .tm_mday = 5, .tm_hour = 0, .tm_min = 0, .tm_sec = 0 };
        time_t from_time = mktime(&tm_from), to_time = mktime(&tm_to);
        size_t count;
        /* query all TSL in TSDB by time */
        fdb_tsl_iter_by_time(tsdb, from_time, to_time, query_by_time_cb, tsdb);
        /* query all FDB_TSL_WRITE status TSL's count in TSDB by time */
        count = fdb_tsl_query_count(tsdb, from_time, to_time, FDB_TSL_WRITE);
        FDB_INFO("query count is: %u\n", count);
    }

    { /* SET the TSL status */
        /* Change the TSL status by iterator or time iterator
         * set_status_cb: the change operation will in this callback
         *
         * NOTE: The actions to modify the state must be in orderC.
         *       like: FDB_TSL_WRITE -> FDB_TSL_USER_STATUS1 -> FDB_TSL_DELETED -> FDB_TSL_USER_STATUS2
         *       The intermediate states can also be ignored.
         *       such as: FDB_TSL_WRITE -> FDB_TSL_DELETED
         */
        fdb_tsl_iter(tsdb, set_status_cb, tsdb);
    }

    FDB_INFO("===========================================================\n");
}

flashdb,stm32,stm32,FlashDB文章来源地址https://www.toymoban.com/news/detail-849277.html

到了这里,关于STM32 利用FlashDB库实现在线扇区数据管理不丢失的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 交通管理在线服务系统|基于Springboot的交通管理系统设计与实现(源码+数据库+文档)

    交通管理在线服务系统目录 目录 基于Springboot的交通管理系统设计与实现  一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、驾驶证业务管理 3、机动车业务管理 4、机动车业务类型管理 四、数据库设计 1、实体ER图  五、核心代码  六、论文参考 七、最新计算机

    2024年04月28日
    浏览(40)
  • 交通管理|交通管理在线服务系统|基于Springboot的交通管理系统设计与实现(源码+数据库+文档)

    交通管理在线服务系统目录 目录 基于Springboot的交通管理系统设计与实现  一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、驾驶证业务管理 3、机动车业务管理 4、机动车业务类型管理 四、数据库设计 1、实体ER图  五、核心代码  六、论文参考 七、最新计算机

    2024年02月19日
    浏览(46)
  • STM32单片机实现固件在线升级(IAP)

    单片机的固件升级方式有很多种, 1、ICP:In Circuit Programing,简单说就是在单片机开发时使用烧录器升级程序,比如使用J-Link烧录单片机程序。 2、ISP:In System Programing,在单片机内部实现了基于通信接口(如串口、I2C、SPI等等)的FLASH引导程序,配合厂家提供的烧录软件工具

    2024年02月13日
    浏览(57)
  • STM32利用AES加密数据、解密数据

    https://www.md5ma.com/md5-generator 原文链接 使用注意点: 1、AES_KEY_LENGTH取值只能是128,192 和 256 2、密钥和向量表长度为AES_KEY_LENGTH/8个字节 3、加密、解密数据长度为AES_KEY_LENGTH/8的整数倍字节 原文链接:https://blog.csdn.net/joyopirate/article/details/122006598 假如你用的是stm32cubeide,可以考虑

    2024年04月12日
    浏览(62)
  • 利用STM32实现流水灯程序

    keil MDK安装与新建工程 在KEIL MDK官网中下载KEIL MDK ARM,下载链接如下:MDK-ARM Version 5.38a Evaluation Software Request (keil.com),在填写信息后进行安装和下载。 安装后进行以下操作: 右键keil5图标,点击“以管理员身份运行” 进入之后, 点击“ file ”里边的选项“ License Management ”

    2024年02月06日
    浏览(44)
  • stm32利用bootloader与app实现远程升级

    1、flash空间分配: 事先在flash开辟好空间,假设flash为128k,我这边给它分为五个区,分别为bootloader、标志位、application、application backup、标签ID。 (注:升级之前,app的代码烧录于application的flash存储区域内。用于app升级的 bin文件 大小一定要小于自己开辟的flash空间大小)

    2024年02月13日
    浏览(50)
  • STM32F1 IAP在线升级功能实现(使用串口)及心得

    公司产品要求,需要做一个能远程升级程序的功能,找了很多例程,大多都是需要按键来完成操作的,而我需要的是通过串口发送指令来完成,于是东拼西凑最后还是用了四天的时间勉强做出来 整个功能需要的程序是两个部分。一个是IAP程序,一个是APP程序。对于IAP程序和

    2024年02月10日
    浏览(59)
  • 基于STM32利用PWM完成呼吸灯的实现

    1.高级控制定时器功能实现框图 其中分为6个板块:①时钟源②控制器 ③时基单元 ④输入捕获 ⑤输出比较 ⑥断路功能 2.pwm的定义 pwm是​​​​​​​一种模拟控制方式,根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间

    2024年02月03日
    浏览(44)
  • STM32实战(三):利用空闲中断从串口接收任意长数据

    “ 想起密码了,终于想起密码了(´・ω・`) ” 这次我们利用STM32F103的UART内部的空闲中断来实现对串口任意长数据的接收,通过简洁的手段解决了接收端在事前无法得知数据长度的问题。本次教程我们需要一块STM32核心板与一个USB转TTL工具。 STM32的异步串口接收寄存器可以存放

    2024年02月13日
    浏览(46)
  • 利用是stm32cubemx实现双极性spwm调制 基于stm32f407vet6

    【双极性SPWM调制讲解以及基于stm32的代码生成-哔哩哔哩】 https://b23.tv/ytFxdkL 双极性spwm调制虽然没有单极性好用,但比单极性要简单易懂一些,以下教程是如何利用stm32实现双极性spwm调制.   •T1,T2不能同时导通,T3,T4也不能同时导通,否则短路烧管子。 •解决方法:T1与T2用高

    2024年02月15日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包