一、添加的功能
1.在GD32F10x中移植FlashDB,用于片外FLASH(W25Q32JV)
二、背景
1.硬件:GD32F10x
2.软件:KEIL5
3.数据库:FlashDB
三、FlashDB
1.名称:超轻量级嵌入式数据库
2.简介:
FlashDB 是一款超轻量级的嵌入式数据库,专注于提供嵌入式产品的数据存储方案。与传统的基于文件系统的数据库不同,FlashDB 结合了 Flash 的特性,具有较强的性能及可靠性。并在保证极低的资源占用前提下,尽可能延长 Flash 使用寿命。
FlashDB 提供两种数据库模式:
键值数据库 :是一种非关系数据库,它将数据存储为键值(Key-Value)对集合,其中键作为唯一标识符。KVDB 操作简洁,可扩展性强。
时序数据库 :时间序列数据库 (Time Series Database , 简称 TSDB),它将数据按照 时间顺序存储 。TSDB 数据具有时间戳,数据存储量大,插入及查询性能高。
3.FlashDB文档对应网址:FlashDB (gitee.io)
4.FlashDB代码对应网址:
1)GitHub - armink/FlashDB: An ultra-lightweight database that supports key-value and time series data | 一款支持 KV 数据和时序数据的超轻量级数据库
2)FlashDB: 一款支持 KV 数据和时序数据的超轻量级数据库 (gitee.com)
四、FlashDB介绍(我分为4部分)
1.FlashDB APP:用于调用FlashDB的应用函数—-用户进行编写;
2.FlashDB:包含FlashDB的应用函数,并且调用FAL的相关函数;
3.FAL(重点):包含FAL的相关函数,并且可以调用SFUD相关函数;
4.SFUD:名称“串行FLASH万能驱动库”,需要配置SPI和存储器,用于驱动存储器;
五、查看下载的FlashDB压缩包
1.FlashDB-master目录(总)
2.demos目录
3.docs目录
1)其中包含FlashDB文档对应网址;——打不开;
2)使用这个网址:FlashDB (gitee.io)
4.inc目录
1)fdb_cfg.h:作用为配置FLashDB,需修改;具体查看文档(FlashDB (gitee.io))—>开发—>配置。
2)我自己的使用习惯:我一般是将此文件剪切移动到main.c所在目录。
5.port—>fal目录(重点)
1)samples目录(FAL的移植中,只需要修改此目录)
2)fal_cfg.h:作用为配置fal的文件,需修改;我一般是将此文件复制移动到main.c所在目录。
3)fal_flash_sfud_port.c:用于配置SFUD,需修改;
6.src目录:FlashDB源文件,无需修改
7.tests目录:测试目录,可以不使用
六、目录详解
stm32f405rg_spi_flash目录详解(此目录中包含的是外部FLASH的相关文档)
只关注这三个目录就可以;
个人感觉drivers和sfud目录功能有些重合,所有我将关于外扩FLASH的驱动都移植到了一起,这个之后会介绍;
1.application目录
1)fal_cfg.h文件,主要包含FAL的“定义flash设备表”和“定义flash分区表”,这两个概念是FAL配置中很重要的两步,之后会具体讲解;
2)fdb_cfg.h文件,主要包含FDB使用过程中的一些配置,通过注销宏定义来进行实现,,之后会具体讲解;
3)main.c文件中,主要是测试FlashDB是否移植成功的测试例程,同时也是FlashDB的样板例程;我将其修改为fdb_app.c文件;
具体移植过程
一、移植步骤
1.将需要的文件进行分类整理,整理成自己需要的目录文档;
2.在工程中按照整理好的目录创建目录,添加各个目录的文件,同时将需要关联的文件路径进行声明;
3.修改sfud中的对应驱动配置;
4.打开FlashDB和FAL的配置文件,进行配置;
5.实现printf函数;
6.调用FlashDB APP中的官方样板例程,查看log;
二、分类整理
将需要的文件进行分类整理,整理成自己需要的目录文档(步骤一)
1.FAL文件整理
2.flash_app文件整理
1)fal_cfg.h所在的路径:是..\FlashDB-master\port\fal\samples\porting下的fal_cfg.h文件
2)fdb_app.c所在的路径:..\FlashDB-master\demos\stm32f405rg_spi_flash\applications下的main.c文件
3)fdb_app.h所在的路径:我自己编写的.h文件
4)fdb_cfg.h所在的路径:..\FlashDB-master\inc下的fdb_cfg.h文件
3.flashdb文件整理
4.sfud文件整理
1)flash_driver文件夹
2)inc、port、src文件夹
三、工程中添加(步骤二)
四、需要配置、移植、修改的文件(步骤三、步骤四)
1.需要配置的文件 ——- 网址:配置 (gitee.io)
1)fdb_cfg.h:用于配置FlashDB的相关应用,例如可以选择KVDB或者TSDB。
2.需要移植的文件 ——- 网址:移植 (gitee.io)
1)fal_flash_sfud_port.c:用于定义片外flash设备,同时要修改设备的参数。
2)fal_cfg.h:用于定义flash设备表,和定义flash分区表,同时要修改对应的flash设备参数。
3.需要修改的文件 —-这个官网网没有介绍
1)drv_spi_flash.c:文件中是SFUD的驱动入口函数(spi_flash_init())。
2)sfud_port.c:文件中包含引脚配置、SPI配置、SPI读写配置,同时根据芯片的不同进行修改。
五、实现prinf函数,用于打印FlashDB 日志(步骤五)
六、成功后的log(以本工程为例)
1.首次启动(首次启动,FlashDB需要一定时间的配置)
\ | /
- RT - Thread Operating System
/ | \ 3.1.3 build Dec 16 2021
2006 - 2019 Copyright by rt-thread team
[SFUD]Find a Winbond W25Q32JV flash chip. Size is 4194304 bytes.
SFUD Flash device reset success.
[SFUD]norflash0 flash device is initialize success.
[D/FAL] (fal_flash_init:63) Flash device | norflash0 | addr: 0x00000000 | len: 0x00400000 | blk_size: 0x00001000 |initialized finish.
[32;22m[I/FAL] ==================== FAL partition table ====================[0m
[32;22m[I/FAL] | name | flash_dev | offset | length |[0m
[32;22m[I/FAL] -------------------------------------------------------------[0m
[32;22m[I/FAL] | fdb_tsdb1 | norflash0 | 0x00000000 | 0x00100000 |[0m
[32;22m[I/FAL] | fdb_kvdb1 | norflash0 | 0x00100000 | 0x00100000 |[0m
[32;22m[I/FAL] =============================================================[0m
[32;22m[I/FAL] Flash Abstraction Layer (V0.5.0) initialize success.[0m
[FlashDB][kv][env] (FlashDB\flashdb\src\fdb_kvdb.c:1638) KVDB size is 1048576 bytes.
[FlashDB][kv][env] (FlashDB\flashdb\src\fdb_kvdb.c:1442) Sector header info is incorrect. Auto format this sector (0x00000000).
[11:35:00.929]收←◆[FlashDB][kv][env] (FlashDB\flashdb\src\fdb_kvdb.c:1442) Sector header info is incorrect. Auto format this sector (0x00001000).
[11:35:00.998]收←◆[FlashDB][kv][env] (FlashDB\flashdb\src\fdb_kvdb.c:1442) Sector header info is incorrect. Auto format this sector (0x00002000).
[11:35:01.068]收←◆[FlashDB][kv][env] (FlashDB\flashdb\src\fdb_kvdb.c:1442) Sector header info is incorrect. Auto format this sector (0x00003000).
[11:35:01.134]收←◆[FlashDB][kv][env] (FlashDB\flashdb\src\fdb_kvdb.c:1442) Sector header info is incorrect. Auto format this sector (0x00004000).
……
[11:35:17.645]收←◆[FlashDB][kv][env] (FlashDB\flashdb\src\fdb_kvdb.c:1442) Sector header info is incorrect. Auto format this sector (0x000FA000).
[11:35:17.712]收←◆[FlashDB][kv][env] (FlashDB\flashdb\src\fdb_kvdb.c:1442) Sector header info is incorrect. Auto format this sector (0x000FB000).
[11:35:17.782]收←◆[FlashDB][kv][env] (FlashDB\flashdb\src\fdb_kvdb.c:1442) Sector header info is incorrect. Auto format this sector (0x000FC000).
[11:35:17.848]收←◆[FlashDB][kv][env] (FlashDB\flashdb\src\fdb_kvdb.c:1442) Sector header info is incorrect. Auto format this sector (0x000FD000).
[11:35:17.914]收←◆[FlashDB][kv][env] (FlashDB\flashdb\src\fdb_kvdb.c:1442) Sector header info is incorrect. Auto format this sector (0x000FE000).
[11:35:17.982]收←◆[FlashDB][kv][env] (FlashDB\flashdb\src\fdb_kvdb.c:1442) Sector header info is incorrect. Auto format this sector (0x000FF000).
[11:35:18.048]收←◆[FlashDB][kv][env] All sector header is incorrect. Set it to default.
[11:35:33.254]收←◆[FlashDB] FlashDB V1.1.0 is initialize success.
[FlashDB] You can get the latest version on GitHub - armink/FlashDB: An ultra-lightweight database that supports key-value and time series data | 一款支持 KV 数据和时序数据的超轻量级数据库 .
[FlashDB][sample][kvdb][basic] ==================== kvdb_basic_sample ====================
[FlashDB][sample][kvdb][basic] get the 'boot_count' value is 0
[11:35:33.517]收←◆[FlashDB][sample][kvdb][basic] set the 'boot_count' value to 1
[FlashDB][sample][kvdb][basic] ===========================================================
[FlashDB][sample][kvdb][string] ==================== kvdb_type_string_sample ====================
[11:35:34.003]收←◆[FlashDB][sample][kvdb][string] create the 'temp' string KV, value is: 36C
[FlashDB][sample][kvdb][string] get the 'temp' value is: 36C
[11:35:34.250]收←◆[FlashDB][sample][kvdb][string] set 'temp' value to 38C
[FlashDB][sample][kvdb][string] delete the 'temp' finish
[FlashDB][sample][kvdb][string] ===========================================================
[FlashDB][sample][kvdb][blob] ==================== kvdb_type_blob_sample ====================
[11:35:34.753]收←◆[FlashDB][sample][kvdb][blob] create the 'temp' blob KV, value is: 36
[FlashDB][sample][kvdb][blob] get the 'temp' value is: 36
[11:35:35.000]收←◆[FlashDB][sample][kvdb][blob] set 'temp' value to 38
[FlashDB][sample][kvdb][blob] delete the 'temp' finish
[FlashDB][sample][kvdb][blob] ===========================================================
[FlashDB][tsl][log] Sector (0x00000000) header info is incorrect.
[11:35:49.385]收←◆[FlashDB][tsl][log] All sector format finished.
[FlashDB][tsl][log] (FlashDB\flashdb\src\fdb_tsdb.c:790) TSDB (log) oldest sectors is 0x00000000, current using sector is 0x00000000.
[FlashDB][sample][tsdb] ==================== tsdb_sample ====================
[FlashDB][sample][tsdb] append the new status.temp (36) and status.humi (85)
[FlashDB][sample][tsdb] append the new status.temp (38) and status.humi (90)
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 1, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 2, temp: 38, humi: 90
[11:35:49.906]收←◆[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 1, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 2, temp: 38, humi: 90
[FlashDB][sample][tsdb] query count is: 2
[FlashDB][sample][tsdb] set the TSL (time 1) status from 2 to 3
[FlashDB][sample][tsdb] set the TSL (time 2) status from 2 to 3
[11:35:50.401]收←◆[FlashDB][sample][tsdb] ===========================================================
msh >
msh >
2.二次启动
\ | /
- RT - Thread Operating System
/ | \ 3.1.3 build Dec 16 2021
2006 - 2019 Copyright by rt-thread team
[SFUD]Find a Winbond W25Q32JV flash chip. Size is 4194304 bytes.
SFUD Flash device reset success.
[SFUD]norflash0 flash device is initialize success.
SUFD SPI 初始化 SUCCESS
[D/FAL] (fal_flash_init:63) Flash device | norflash0 | addr: 0x00000000 | len: 0x00400000 | blk_size: 0x00001000 |initialized finish.
[32;22m[I/FAL] ==================== FAL partition table ====================[0m
[32;22m[I/FAL] | name | flash_dev | offset | length |[0m
[32;22m[I/FAL] -------------------------------------------------------------[0m
[32;22m[I/FAL] | fdb_tsdb1 | norflash0 | 0x00000000 | 0x00100000 |[0m
[32;22m[I/FAL] | fdb_kvdb1 | norflash0 | 0x00100000 | 0x00100000 |[0m
[32;22m[I/FAL] =============================================================[0m
[32;22m[I/FAL] Flash Abstraction Layer (V0.5.0) initialize success.[0m
[FlashDB][kv][env] (FlashDB\flashdb\src\fdb_kvdb.c:1638) KVDB size is 1048576 bytes.
[FlashDB] FlashDB V1.1.0 is initialize success.
[FlashDB] You can get the latest version on GitHub - armink/FlashDB: An ultra-lightweight database that supports key-value and time series data | 一款支持 KV 数据和时序数据的超轻量级数据库 .
[FlashDB][sample][kvdb][basic] ==================== kvdb_basic_sample ====================
[FlashDB][sample][kvdb][basic] get the 'boot_count' value is 4
[FlashDB][sample][kvdb][basic] set the 'boot_count' value to 5
[FlashDB][sample][kvdb][basic] ===========================================================
[FlashDB][sample][kvdb][string] ==================== kvdb_type_string_sample ====================
[FlashDB][sample][kvdb][string] create the 'temp' string KV, value is: 36C
[FlashDB][sample][kvdb][string] get the 'temp' value is: 36C
[FlashDB][sample][kvdb][string] set 'temp' value to 38C
[FlashDB][sample][kvdb][string] delete the 'temp' finish
[FlashDB][sample][kvdb][string] ===========================================================
[FlashDB][sample][kvdb][blob] ==================== kvdb_type_blob_sample ====================
[FlashDB][sample][kvdb][blob] create the 'temp' blob KV, value is: 36
[FlashDB][sample][kvdb][blob] get the 'temp' value is: 36
[FlashDB][sample][kvdb][blob] set 'temp' value to 38
[FlashDB][sample][kvdb][blob] delete the 'temp' finish
[FlashDB][sample][kvdb][blob] ===========================================================
[FlashDB][tsl][log] (FlashDB\flashdb\src\fdb_tsdb.c:790) TSDB (log) oldest sectors is 0x00000000, current using sector is 0x00000000.
[FlashDB][sample][tsdb] ==================== tsdb_sample ====================
[FlashDB][sample][tsdb] append the new status.temp (36) and status.humi (85)
[FlashDB][sample][tsdb] append the new status.temp (38) and status.humi (90)
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 1, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 2, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 3, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 4, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 5, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 6, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 7, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 8, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 9, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 10, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 1, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 2, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 3, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 4, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 5, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 6, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 7, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 8, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 9, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 10, temp: 38, humi: 90
[FlashDB][sample][tsdb] query count is: 2
[FlashDB][sample][tsdb] set the TSL (time 1) status from 3 to 3
[FlashDB][sample][tsdb] set the TSL (time 2) status from 3 to 3
[FlashDB][sample][tsdb] set the TSL (time 3) status from 3 to 3
[FlashDB][sample][tsdb] set the TSL (time 4) status from 3 to 3
[FlashDB][sample][tsdb] set the TSL (time 5) status from 3 to 3
[FlashDB][sample][tsdb] set the TSL (time 6) status from 3 to 3
[FlashDB][sample][tsdb] set the TSL (time 7) status from 3 to 3
[FlashDB][sample][tsdb] set the TSL (time 8) status from 3 to 3
[FlashDB][sample][tsdb] set the TSL (time 9) status from 2 to 3
[FlashDB][sample][tsdb] set the TSL (time 10) status from 2 to 3
[FlashDB][sample][tsdb] ===========================================================
msh >
原作者:游走在01的海洋