准备事项
完成了以下两步操作后进行
【FlashDB】第一步 FlashDB 移植到 STM32L475 使用QSPI驱动外部 flash W25Q64之FAL移植
【FlashDB】第二步 FlashDB 移植 STM32L475 使用QSPI驱动外部 flash W25Q64之 SFUD 移植
貌似以上两步顺序搞反了
1. FlashDB 移植
1.1 将FlashDB 相关文件文件依次放入MDK中
FlashDB 库链接
1.2红框中是移植必须文件
- fdb.c 核心文件
- fdb_kvdb.c 键值数据库核心文件
- fdb.tsdb.c 时序数据库核心文件
- fdb.util.c fdb接口文件相关校验文件
1.3 FlashDB 移植
因为 FlashDB 移植所需的接口文件是基于FAL做的,如果我们做好开头两步操作,讲不用关心接口移植
2. FlashDB 测试实例
2.1 键值数据库 初始化
/* KVDB object */
static struct fdb_kvdb kvdb = { 0 };
/*##以下代码放入main中##*/
#ifdef FDB_USING_KVDB
{ /* KVDB Sample */
struct fdb_default_kv default_kv;
default_kv.kvs = default_kv_table;
default_kv.num = sizeof(default_kv_table) / sizeof(default_kv_table[0]);
/* set the lock and unlock function if you want */
fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_LOCK, lock);
fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_UNLOCK, unlock);
/* Key-Value database initialization
*
* &kvdb: database object
* "env": database name
* "fdb_kvdb1": The flash partition name base on FAL. Please make sure it's in FAL partition table.
* Please change to YOUR partition name.
* &default_kv: The default KV nodes. It will auto add to KVDB when first initialize successfully.
* NULL: The user data if you need, now is empty.
*/
result = fdb_kvdb_init(&kvdb, "env", "KVDB", &default_kv, NULL);
if (result != FDB_NO_ERR) {
return -1;
}
/* run basic KV samples */
kvdb_basic_sample(&kvdb);
/* run string KV samples */
kvdb_type_string_sample(&kvdb);
/* run blob KV samples */
kvdb_type_blob_sample(&kvdb);
}
#endif /* FDB_USING_KVDB */
注意:
函数:result = fdb_kvdb_init(&kvdb, “env”, “KVDB”, &default_kv, NULL);
中的第三个参数 “KVDB” 是当前的分区名字,意思就是吧当前的数据库放到哪个分区中
如果使用W25Q的话,设置的分区越大,那么读取和写入的时间越长
2.2 时序数据库 初始化
/* TSDB object */
struct fdb_tsdb tsdb = { 0 };
static void lock(fdb_db_t db)
{
__disable_irq();
}
static void unlock(fdb_db_t db)
{
__enable_irq();
}
static fdb_time_t get_time(void)
{
/* Using the counts instead of timestamp.
* Please change this function to return RTC time.
*/
return ++counts; //这里要返回实际的RTC值得时间戳,使用mktime函数,具体函数用法清查阅 https://blog.csdn.net/shileiwu0505/article/details/123030559
}
/*##以下代码放入main中##*/
#ifdef FDB_USING_TSDB
{ /* TSDB Sample */
/* set the lock and unlock function if you want */
fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_LOCK, lock);
fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_UNLOCK, unlock);
/* Time series database initialization
*
* &tsdb: database object
* "log": database name
* "fdb_tsdb1": The flash partition name base on FAL. Please make sure it's in FAL partition table.
* Please change to YOUR partition name.
* get_time: The get current timestamp function.
* 128: maximum length of each log
* NULL: The user data if you need, now is empty.
*/
result = fdb_tsdb_init(&tsdb, "log", "TSDB", get_time, 128, NULL);
/* read last saved time for simulated timestamp */
fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_GET_LAST_TIME, &counts);
if (result != FDB_NO_ERR) {
return -1;
}
/* run TSDB sample */
tsdb_sample(&tsdb);
}
#endif /* FDB_USING_TSDB */
注意:
函数:result = fdb_tsdb_init(&kvdb, “env”, “KVDB”, &default_kv, NULL);
中的第三个参数 “KVDB” 是当前的分区名字,意思就是吧当前的数据库放到哪个分区中
注意:使用TSDB的话如果使用W25Q的话,设置的分区越大,那么读取和写入的时间越长,实际测试中,分区设置的很大的话要等待一会就有数据提示;如果设置的查询开始时间距离最早的时间过长的话,那么需要等待一小会,如果查询开始时间具体写入最早时间很近的话数据马上就查询出来
3. 实际测试工程
实际测试例程移植到STM32F103VE使用内置Flash 也包含了使用SFUD驱动外置flash W25Q64的例程
SFUD 驱动代码包含了STM32F10X内置Flash驱动和外置W25Q64 QSPI驱动
使用普通的SPI驱动外置flash W25Q64,这个源码没有移植FlashDB,需要自行移植