教程較長,按需閱讀
- 前言
- 移植
- 1.開啟SPI總線
- 操作步驟
- 驗證
- 2.掛載片外flash
- 代碼
- 驗證
- 3.搭建FAL抽象層
- 3.1添加FAL
- 3.2配置FAL
- 3.3初始化FAL
- 3.4驗證
- 4.移植FlashDB
- 4.1添加flashDB軟體包
- 4.2配置FlashDB
- 4.3驗證
- 總結
前言
FlashDB 是一款超輕量級的嵌入式資料庫,它結合了 Flash 的特性,具有較強的性能及可靠性,
FlashDB提供了鍵值資料庫和時序資料庫兩種資料庫模式,不僅資源占用極低,記憶體占用幾乎為 0,而且存盤容量大,非常適合用于物聯網產品,
移植
根據 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對應部分,根據指導,一步一步做下去,
操作步驟
step1:打開RT-Thread Settings,點擊更多配置來到組件一欄,勾選如下,
step2:board.h檔案中,打開SPI宏定義,

step3:使用stm32cubemx產生初始化函式,將其粘貼于board.c檔案末尾,

然后選擇芯片型號——>填寫專案名稱,雙擊IOC檔案后如圖操作,

復制初始化函式到board.c檔案,(ps:初始化函式在哪個檔案中,名字叫什么,在board.h檔案對應部分都是可以找到的哦)

step4:在drivers目錄下的stm32f1xx_hal_conf.h檔案中打開SPI驅動,

驗證
配置完成,讓我們編譯下載一下,看看有沒有成功,

使用list_device指令查看設備,可以看到SPI總線已經存在了,
2.掛載片外flash
接下來,我們將片外flash(W25Q128)掛到SPI總線上,
代碼
此處,參考RT-Thread官方開發檔案,在application目錄下,新增flash.c檔案,
#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>
#include "drv_spi.h"
#include "spi_flash.h"
#include "spi_flash_sfud.h"
#define DBG_TAG "flash"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#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);
驗證

經過驗證,flash已經掛載成功了,下面開始搭建FAL,
3.搭建FAL抽象層
FAL是RT-Thread的一個軟體包,主要是用于Flash 抽象層的實作,負責管理 Flash 設備和 Flash 磁區,關于FAL的詳細功能,大家可以參考RT-Thread軟體包友情鏈接,檔案非常詳細,這里也參考了檔案中的內容,
3.1添加FAL
打開RT-Thread Settings點擊立即添加,然后搜索FAL,




3.2配置FAL

因為我們只用到了片外flash,所以可以將fal_cfg.h中關于片外flash的部分洗掉,并且定義自己的磁區表,
最終修改fal_cfg.h檔案如下:
#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_
#include <rtconfig.h>
#include <board.h>
#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開發檔案當中的注意事項,講得非常詳細,
3.3初始化FAL
在main.c檔案中,包含fal.h并呼叫fal_init()初始化程式,

3.4驗證
做到這里已經比較累了,我們來編譯下載,感受一下成功的喜悅,

4.移植FlashDB
FlashDB官方有在F103上運行的demo,也為鍵值資料庫、時序資料庫提供了相應的示例,這里我們通過運行kvdb基礎示例(位于samples/kvdb_basic_sample.c)來驗證是否移植成功,
4.1添加flashDB軟體包
添加方法同FAL包,這里不復述了,添加后右擊flashdb,選擇詳細配置,勾選如下:

4.2配置FlashDB
在packages——>FlashDB——>inc目錄下通過 fdb_cfg.h 對其進行功能配置,這里參考官方demo,修改 fdb_cfg.h 檔案如下:
#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檔案,代碼如下:
#include <stdio.h>
#include <board.h>
#include <flashdb.h>
#include <stm32f1xx_hal.h>
#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,我也不知道為何,不開就會報莫名其妙錯誤,暫時先不深究,

step3:編譯下載

下載后可以看到,已經成功讀取、設定啟動次數(如果大家是第一次下載,則啟動次數會設定為1),按下復位鍵,可以看到次數加一,

總結
這篇文章著重介紹操作,幾乎不涉及原理的講解,所以一些理論知識還需要大家仔細閱讀官方檔案,我也是初學這些知識,水平有限,若有錯誤,還望大家批評指正,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/232522.html
標籤:其他
