1452|4

92

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

读《RT-Thread设备驱动开发指南》---  第四篇 [复制链接]

 
本帖最后由 xiaolinen 于 2023-9-27 15:36 编辑

读《RT-Thread设备驱动开发指南》---  FAL组件,ulog日志,flashDB组件的使用

前言:

        本次测试是基于国民技术的N32WB452LEQ6芯片开展的,前期工作主要是在RT-Thread4.1.1版本上增加了该芯片的BSP。

第一部分:ulog日志

       1.1) ulog日志组件架构图,如下:

        前端:我们在应用程序中调用到的一些函数接口。
        核心:这一部分对传进来的日志进行出来,根据开发者的设置,进行过滤和格式化。
        后端:这里就是记录或者显示日志的地方,可以通过串口打印处理,也可以通过SPI写入外置的FLASH芯片中。
        1.2)配置
            使能ulog组件
        配置部分选项
注:本次使用需要使用RTC功能,故使用了软件RTC,开启如下:

        1.3)常用API接口

第二部分:SFUD

        2.1)SFUD是一款开源的串行 SPI Flash 通用驱动库,具有支持SPI/QSPI接口,面向对象(同时支持多个flash对象),可灵活性裁剪,拓展性强的特性。且Fal硬件抽象层基于SFUD万能驱动库实现!!!

        2.2)使能和配置如下

        2.3)具体使用

#define LOG_TAG     "flash" 
#define LOG_LVL     LOG_LVL_DBG 
#include <ulog.h>   

#include "ph_public.h"

static int rt_hw_spi_flash_init(void)
{
	static struct rt_spi_device *spi_device = RT_NULL;
    spi_device = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device));
    if(spi_device == RT_NULL){
        LOG_E("Failed to malloc the spi device!\r\n");
        return -RT_ENOMEM;
    }
	
	static struct n32_spi_cs  spi_cs;
    spi_cs.GPIOx = GPIOA;
    spi_cs.GPIO_Pin = GPIO_PIN_4;

    if(rt_spi_bus_attach_device(spi_device,SPI_FLASH_DEVICE_NAME,SPI_BUS_NAME,(void*)&spi_cs) != RT_EOK){//在SPI总线上附加一个设备
        LOG_E("Failed to attach the %s device!\r\n",SPI_BUS_NAME);
        return -RT_ERROR;
    }
    
	return RT_EOK;
}
INIT_DEVICE_EXPORT(rt_hw_spi_flash_init);

static int rt_hw_spi_flash_with_sfud_init(void)
{
    if (RT_NULL == rt_sfud_flash_probe(SPI_FLASH_CHIP, SPI_FLASH_DEVICE_NAME))
    {
        return RT_ERROR;
    };

    return RT_EOK;
}
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_with_sfud_init);

第三部分:FAL

        3.1)FAL是对 Flash 及基于 Flash 的分区进行管理、操作的抽象层,对上层统一了 Flash 及 分区操作的 API (框架图如下所示),并具有以下特性:

            3.1.1)支持静态可配置的分区表,并可关联多个 Flash 设备;

            3.1.2)分区表支持自动装载 。避免在多固件项目,分区表被多次定义的问题;

            3.1.3)代码精简,对操作系统无依赖 ,可运行于裸机平台,比如对资源有一定要求的 Bootloader;

            3.1.4)统一的操作接口。保证了文件系统、OTA 等对 Flash 有一定依赖的组件,底层 Flash 驱动的可重用性;

            3.1.5)自带基于 Finsh/MSH 的测试命令,可以通过 Shell 按字节寻址的方式操作(读写擦) Flash 或分区,方便开发者进行调试、测试;

        3.2)使能和配置

        3.3)主要工作:

            3.1.1)定义flash设备,包括片内flash和片外的spi flash.

            3.1.2)定义flash设备表,在fal_dfg.h记录。

            3.1.3)定义flash分区表:

#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
#define FAL_PART_TABLE                                                               \
{                                                                                    \
    {FAL_PART_MAGIC_WORD,  "bootload",     "n32_onchip",        0,   	   128*1024, 0}, \
    {FAL_PART_MAGIC_WORD,  "app",          "n32_onchip",   		128*1024,  384*1024, 0}, \
    {FAL_PART_MAGIC_WORD,  "download", 		NOR_FLASH_DEV_NAME, 0, 		   256*1024, 0}, \
    {FAL_PART_MAGIC_WORD,  "factory", 		NOR_FLASH_DEV_NAME, 256*1024,  256*1024, 0}, \
    {FAL_PART_MAGIC_WORD,  "cmb_log",		NOR_FLASH_DEV_NAME, 512*1024,  1024*1024, 0}, \
    {FAL_PART_MAGIC_WORD,  "kvdb_param", 	NOR_FLASH_DEV_NAME, 1536*1024, 1024*1024, 0}, \
    {FAL_PART_MAGIC_WORD,  "tsdb_data", 	NOR_FLASH_DEV_NAME, 2560*1024, 4096*1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */

第四部分:flashDB

        4.1)FlashDB是一款可以运行在MCU上的轻量级的开源嵌入式数据库,专注于提供嵌入式产品的数据存储方案,有键值数据库和时序数据库两种,可以用来保存产品参数,也可以用来保存传感器的采集数据,比如温度和湿度。

        4.2)使能和配置

        4.3)具体使用

/************** FLASHDB相关结构体 ***************/
struct DATA_STORE_TIME
{
	int tem;//温度
	int hum;//湿度
};

static struct fdb_kvdb kvdb = { 0 };
struct DATA_STORE_TIME sensor_value = {0,0};

// 数据库 数据表单
static struct fdb_default_kv_node default_kv_table[] = {
    {"data_store_time", &sensor_value, sizeof(struct DATA_STORE_TIME)},    /* int array type KV */
};

/*
功能:flashdb相关初始化
*/
int ph_flashdb_init(void)
{
    fal_init();

    fdb_err_t result = FDB_NO_ERR;
	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(&kvdb, "deviceparam", "kvdb_param", &default_kv, NULL);
    if (result != FDB_NO_ERR){
        LOG_E("fdb_kvdb_init error,please check ...\n");
        return RT_ERROR;
    }

    return RT_EOK;
}
INIT_APP_EXPORT(ph_flashdb_init);

/*
功能:flashdb测试
*/
void ph_flashdb_test(void)
{
    fdb_err_t result = FDB_NO_ERR;
    struct fdb_blob kvdb_blob;

	fdb_kv_get_blob(&kvdb, "data_store_time", fdb_blob_make(&kvdb_blob, &sensor_value, sizeof(struct DATA_STORE_TIME)));
    if(kvdb_blob.saved.len > 0){
        LOG_I("get the 'data_store_time' value is: sensor_value.tem = %d,sensor_value.hum = %d \n", sensor_value.tem,sensor_value.hum);
    }else{
        LOG_E("================== ph_read_data_collection_time_from_db error ==================\n");
    }
	
    sensor_value.tem++;
    sensor_value.hum += 2;

    result = fdb_kv_set_blob(&kvdb, "data_store_time", fdb_blob_make(&kvdb_blob, &sensor_value, sizeof(struct DATA_STORE_TIME)));
    if (result != FDB_NO_ERR){
        LOG_E("================= ph_write_data_collection_TIME error =====================\n");
    }
}

第五部分:效果打印

[14:03:38]01-01 08:00:00 I/flash main: get the 'data_store_time' value is: sensor_value.tem = 10,sensor_value.hum = 19 

[14:03:45]01-01 08:00:00 I/flash main: get the 'data_store_time' value is: sensor_value.tem = 11,sensor_value.hum = 21 

[14:03:46]01-01 08:00:00 I/flash main: get the 'data_store_time' value is: sensor_value.tem = 12,sensor_value.hum = 23 

[14:03:47]01-01 08:00:00 I/flash main: get the 'data_store_time' value is: sensor_value.tem = 13,sensor_value.hum = 25 

整体工程如下,欢迎多多指正!!!

n32wb452.rar (39.84 MB, 下载次数: 13)

 

最新回复

直接实践了,效果相当不错      详情 回复 发表于 2023-9-28 08:48
点赞 关注
 

回复
举报

6828

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

FlashDB数据库看来是个重点

点评

确实是一个重点,以前公司用easyflash,现在转到flashdbl   详情 回复 发表于 2023-9-28 09:12
 
 
 

回复

6534

帖子

10

TA的资源

版主

板凳
 

直接实践了,效果相当不错   

点评

实践出真知嘛  详情 回复 发表于 2023-9-28 09:13
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复

92

帖子

0

TA的资源

一粒金砂(高级)

4
 
Jacktang 发表于 2023-9-28 07:39 FlashDB数据库看来是个重点

确实是一个重点,以前公司用easyflash,现在转到flashdbl 

 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(高级)

5
 
秦天qintian0303 发表于 2023-9-28 08:48 直接实践了,效果相当不错   

实践出真知嘛

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表