Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
flashDB
RT-Thread Studio
【12月】RT-Thread Studio学习笔记之部署FlashDB
1.00
发布于 2020-12-10 21:51:11 浏览:5600
订阅该版
[tocm] # 前言 FlashDB 是一款超轻量级的嵌入式数据库。它结合了 Flash 的特性,具有较强的性能及可靠性。 FlashDB提供了键值数据库和时序数据库两种数据库模式,不仅资源占用极低,内存占用几乎为 0,而且存储容量大,非常适合用于物联网产品。 # 移植 根据 [FlashDB开发文档](https://gitee.com/Armink/FlashDB),FlashDB 底层的 Flash 管理及操作依赖于 RT-Thread 的 FAL (Flash Abstraction Layer) Flash 抽象层开源软件包,所以将所用到的 Flash 对接到 FAL ,即可完成整个移植工作。 FlashDB移植的关键是FAL的移植。本文在片外flash上搭建FAL,并移植FlashDB。 下面我们就开始实际操作,从将flash挂载到spi总线上开始,最终完成FlashDB数据库的搭建。新手可以跟着一步一步做,有一些开发经验的朋友可以选择性地阅读。 # 1.开启SPI总线 新建一个空白的RT-Thread项目,本文基于STM32F103芯片。 首先在**drivers**目录下打开`board.h`文件,找到SPI对应部分。根据指导,一步一步做下去。![在这里插入图片描述](https://img-blog.csdnimg.cn/20201204143331118.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) ## 操作步骤 **step1**:打开RT-Thread Settings,点击**更多配置**来到**组件**一栏,勾选如下。![在这里插入图片描述](https://img-blog.csdnimg.cn/20201204144847310.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) **step2**:`board.h`文件中,打开SPI宏定义。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201204145854510.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) **step3**:使用**stm32cubemx**产生初始化函数,将其粘贴于`board.c`文件末尾。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201204152938102.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) 然后选择芯片型号——>填写项目名称,双击IOC文件后如图操作。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201204153731512.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) 复制初始化函数到`board.c`文件。(ps:初始化函数在哪个文件中,名字叫什么,在board.h文件对应部分都是可以找到的哦) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201204154654140.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) **step4**:在**drivers**目录下的`stm32f1xx_hal_conf.h`文件中打开SPI驱动。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201204160217954.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) ## 验证 配置完成,让我们编译下载一下,看看有没有成功。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020120416192982.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) 使用`list_device`指令查看设备,可以看到SPI总线已经存在了。 # 2.挂载片外flash 接下来,我们将片外flash(W25Q128)挂到SPI总线上。 ## 代码 此处,参考RT-Thread[官方开发文档](https://www.rt-thread.org/document/site/),在**application**目录下,新增`flash.c`文件。 ```cpp #include
#include
#include
#include "drv_spi.h" #include "spi_flash.h" #include "spi_flash_sfud.h" #define DBG_TAG "flash" #define DBG_LVL DBG_LOG #include
#define W25Q_SPI_BUS_NAME "spi1" /* 上一步骤 打开的是SPI1,这里也写1,一定要对应*/ #define W25Q_SPI_DEVICE_NAME "spi10" /* SPI1总线上0号设备*/ /*原理见官方文档*/ static int rt_hw_spi_flash_init(void) { rt_hw_spi_device_attach(W25Q_SPI_BUS_NAME, W25Q_SPI_DEVICE_NAME, GPIOA, GPIO_PIN_4); //这提醒我们,一定要从原理图上看清楚自己的flash名 if (RT_NULL == rt_sfud_flash_probe("W25Q128", W25Q_SPI_DEVICE_NAME)) { return -RT_ERROR; }; return RT_EOK; } /* 导出到自动初始化 */ INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init); ``` ## 验证 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201204164850870.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) 经过验证,flash已经挂载成功了,下面开始搭建FAL。 # 3.搭建FAL抽象层 FAL是RT-Thread的一个软件包,主要是用于Flash 抽象层的实现,负责管理 Flash 设备和 Flash 分区。关于FAL的详细功能,大家可以参考RT-Thread软件包[友情链接](http://packages.rt-thread.org/detail.html?package=fal)。文档非常详细,这里也参考了文档中的内容。 ## 3.1添加FAL 打开**RT-Thread Settings**点击立即添加,然后搜索FAL。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201206161335974.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201206161344745.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020120616140293.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201209201814662.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) ## 3.2配置FAL ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020120417304275.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) 因为我们只用到了片外flash,所以可以将`fal_cfg.h`中关于片外flash的部分删除,并且定义自己的分区表。 最终修改`fal_cfg.h`文件如下: ```cpp #ifndef _FAL_CFG_H_ #define _FAL_CFG_H_ #include
#include
#define NOR_FLASH_DEV_NAME "W25Q128" /*一定要改为自己的flash名称*/ /* ===================== Flash device Configuration ========================= */ extern struct fal_flash_dev nor_flash0; /* flash device table(定义设备表,我删掉了片上flash) */ #define FAL_FLASH_DEV_TABLE \ { \ &nor_flash0, \ } /* ====================== Partition Configuration ========================== */ #ifdef FAL_PART_HAS_TABLE_CFG /* partition table ps:可根据需要自行分区*/ #define FAL_PART_TABLE \ { \ {FAL_PART_MAGIC_WORD, "easyflash", NOR_FLASH_DEV_NAME, 0, 1024*1024, 0}, \ {FAL_PART_MAGIC_WORD, "download", NOR_FLASH_DEV_NAME, 1024*1024, 1024*1024, 0}, \ } #endif /* FAL_PART_HAS_TABLE_CFG */ #endif /* _FAL_CFG_H_ */ ``` 其实我并没有做太大改动,只是删掉了片上flash相关部分,大家可以根据需要自行分区、命名。 当出现错误时,建议仔细阅读[FlashDB开发文档](http://armink.gitee.io/flashdb/#/zh-cn/porting)当中的注意事项,讲得非常详细。 ## 3.3初始化FAL 在`main.c`文件中,包含`fal.h`并调用`fal_init()`初始化程序。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201204174654126.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) ## 3.4验证 做到这里已经比较累了,我们来编译下载,感受一下成功的喜悦。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201204175752858.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) # 4.移植FlashDB FlashDB官方有在F103上运行的demo,也为键值数据库、时序数据库提供了相应的示例,这里我们通过运行kvdb基础示例(位于`samples/kvdb_basic_sample.c`)来验证是否移植成功。 ## 4.1添加flashDB软件包 添加方法同FAL包,这里不复述了。添加后右击flashdb,选择详细配置,勾选如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201209095311629.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) ## 4.2配置FlashDB 在`packages——>FlashDB——>inc`目录下通过 `fdb_cfg.h` 对其进行功能配置,这里参考官方demo,修改 `fdb_cfg.h` 文件如下: ```cpp #ifndef _FDB_CFG_H_ #define _FDB_CFG_H_ /* using KVDB feature */ #define FDB_USING_KVDB #ifdef FDB_USING_KVDB /* Auto update KV to latest default when current KVDB version number is changed. @see fdb_kvdb.ver_num */ /* #define FDB_KV_AUTO_UPDATE */ #endif /* using TSDB (Time series database) feature */ #define FDB_USING_TSDB /* the flash write granularity, unit: bit * only support 1(nor flash)/ 8(stm32f2/f4)/ 32(stm32f1) */ //#define FDB_WRITE_GRAN /* @note you must define it for a value */ //注意,上一步我们已经勾选了,这里不要重复配置 /* MCU Endian Configuration, default is Little Endian Order. */ /* #define FDB_BIG_ENDIAN */ /* log print macro. default EF_PRINT macro is printf() */ /* #define FDB_PRINT(...) my_printf(__VA_ARGS__) */ /* print debug information */ #define FDB_DEBUG_ENABLE #endif /* _FDB_CFG_H_ */ //以上所有来源于官方demo ``` ## 4.3验证 配置好之后,我们通过调用官方例程来验证是否移植成功。 KVDB基础示例代码位于 `samples/kvdb_basic_sample.c` ,在 `main.c` 有定义默认的 KV 集合表,在里面有 boot_count KV。通过该 KV 来记录当前系统的启动次数。每次掉电再启动时,该 KV 会自动加一,并保存至 KVDB 中。 简言之就是,能存储、更新启动次数。 **step1**:在**application**目录下,新增`flashdb.c`文件,代码如下: ```cpp #include
#include
#include
#include
#define FDB_LOG_TAG "flashdb" static uint32_t boot_count = 0; struct fdb_kvdb _global_kvdb = {0}; struct fdb_tsdb _global_tsdb = {0}; extern void kvdb_basic_sample(fdb_kvdb_t kvdb); static struct fdb_default_kv_node default_kv_table[] = {{"boot_count", &boot_count, sizeof(boot_count)}}; /* int type KV */ static int flashdb(void) { fdb_err_t result; struct fdb_default_kv default_kv; default_kv.kvs = default_kv_table; default_kv.num = sizeof(default_kv_table) / sizeof(default_kv_table[0]); result = fdb_kvdb_init(&_global_kvdb, "env", "download", &default_kv, NULL); //init函数的第三个参数,是用于存储数据的fal分区,大家根据自己的情况选择 if (result != FDB_NO_ERR) { return -1; } else { kvdb_basic_sample(&_global_kvdb); } return RT_EOK; } INIT_ENV_EXPORT(flashdb); ``` **step2**:开启libc,我也不知道为何,不开就会报莫名其妙错误,暂时先不深究。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201209121728440.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) **step3**:编译下载 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201209122638490.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) 下载后可以看到,已经成功读取、设置启动次数(如果大家是第一次下载,则启动次数会设置为1)。按下复位键,可以看到次数加一。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201209122854593.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L28wMDAxXzAwMDA=,size_16,color_FFFFFF,t_70#pic_center) # 总结 这篇文章着重介绍操作,几乎不涉及原理的讲解,所以一些理论知识还需要大家仔细阅读官方文档。我也是初学这些知识,水平有限,若有错误,还望大家批评指正。
4
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
TXXG_9583
这家伙很懒,什么也没写!
文章
1
回答
0
被采纳
0
关注TA
发私信
相关文章
1
rt_thread studio 啥时候能用呢
2
RT_Thread使用反馈帖子
3
RTT studio 下的 AT指令问题。
4
什么时候RTT Sdudio支持Ubuntu,Deepin和UOS操作系统
5
rt thread Studio 关于J-LINK下载问题
6
RT-Thread studio 调试设置问题
7
RTT-Studio 如何设置调试配置参数?
8
rt_thread studio 软件包配置
9
RT-Studio目前只能开发STM32的项目吗?
10
rtt studio 生成hex名字修改
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部