RT-Thread FAL 应用笔记
简介
本文档介绍了如何在【HC32L196】芯片上使用 RT-Thread 的 Flash Abstraction Layer(FAL)进行 Flash 操作。FAL 是 RT-Thread 中用于管理和操作 Flash 设备的抽象层,使得不同硬件平台上的 Flash 操作具有一致的接口。
主要参考以下官方文档:
FAL 组件 (rt-thread.org)
准备工作
硬件准备
- HC32L196 开发板
- USB 转串口工具
- 连接线若干
软件准备
- RT-Thread 最新源码
- IAR Embedded Workbench
- HC32L196 的 BSP(Board Support Package)
环境搭建
-
克隆 RT-Thread 源码:
git clone https://github.com/RT-Thread/rt-thread.git
-
导入 HC32L196 BSP:
将 HC32L196 BSP 拷贝到
bsp
目录下:cp -r path_to_hc32l196_bsp rt-thread/bsp/hc32l196
-
使用 IAR 打开工程:
使用 IAR Embedded Workbench 打开
rt-thread/bsp/hc32l196
目录下的工程文件。
FAL 配置
-
启用 FAL 组件:
在
board/Kconfig
文件中增加FAL配置:config BSP_USING_ON_CHIP_FLASH bool "Enable on-chip FLASH" default y
-
配置 Flash 设备:
在
fal_cfg.h
文件中配置 Flash 设备,参考:rt-thread-5.1.0\components\fal\samples\porting\fal_cfg.h
HC32L196片上Flash为256K,按照以下大小分配
/* partition table */ #define FAL_PART_TABLE \ { \ {FAL_PART_MAGIC_WORD, "bl", ONCHIP_FLASH_DEV_NAME, 0, 16 * 1024, 0}, \ {FAL_PART_MAGIC_WORD, "app", ONCHIP_FLASH_DEV_NAME, 16 * 1024, 110 * 1024, 0}, \ {FAL_PART_MAGIC_WORD, "easyflash", ONCHIP_FLASH_DEV_NAME, 126 * 1024, 20 * 1024, 0}, \ {FAL_PART_MAGIC_WORD, "download", ONCHIP_FLASH_DEV_NAME, 146 * 1024, 110 * 1024, 0}, \ }
并在
drv_flash.c
中驱动 Flash 设备,参考文件:rt-thread-5.1.0\components\fal\samples\porting\fal_flash_stm32f2_port.c
第二个占据大多数工作量,有以下点需要注意
1. hc32l196读写函数都需要在32768地址内,需要手动指定icf编译文件 2. 擦写函数,传入地址要求四字节对齐 3. 自带的库函数,有一些while循环等待,需要单独处理一下 4. 初始化函数,用rtthread的自动初始化机制进行初始化
使用 FAL
-
初始化 FAL:
初始化函数,用rtthread的自动初始化机制进行初始化:
/*******************************************************************************
* 确保初始化正确执行后方能进行FLASH编程操作,FLASH初始化(编程时间,休眠模式配置)
* @param void
* @return 0:success, -1:failed
******************************************************************************/
static int init(void)
{
uint32_t i = (Sysctrl_GetHClkFreq() / 1000 / 1000 / 4);
while (Ok != Flash_Init(i, TRUE))
{
return -1;
}
return 0;
}INIT_BOARD_EXPORT(init); /* 使用组件自动初始化机制 */
-
MSH 测试命令:
使用 FAL 提供的接口进行 Flash 读写操作,例如:
/* 写数据到 Flash */ fal_partition_write(fal_partition_find("partition_name"), offset, data, size); /* 从 Flash 读取数据 */ fal_partition_read(fal_partition_find("partition_name"), offset, buffer, size);
示例代码
以下是一个完整的 FAL 应用示例:
#include <rtthread.h>
#include <fal.h>
#define TEST_PARTITION_NAME "download"
int fal_demo(void)
{
const struct fal_partition *part = fal_partition_find(TEST_PARTITION_NAME);
uint8_t write_data[256];
uint8_t read_data[256];
/* 初始化写入数据 */
for (int i = 0; i < sizeof(write_data); i++)
{
write_data[i] = i;
}
/* 写数据到 Flash */
fal_partition_erase(part, 0, sizeof(write_data));
fal_partition_write(part, 0, write_data, sizeof(write_data));
/* 从 Flash 读取数据 */
fal_partition_read(part, 0, read_data, sizeof(read_data));
/* 验证数据 */
for (int i = 0; i < sizeof(read_data); i++)
{
if (read_data[i] != write_data[i])
{
rt_kprintf("Data mismatch at %d\n", i);
return -1;
}
}
rt_kprintf("FAL demo successful!\n");
return 0;
}
/* 导出到 msh 命令列表 */
MSH_CMD_EXPORT(fal_demo, fal demo);
结论
本文介绍了如何在 HC32L196 平台上使用 RT-Thread 的 FAL 组件进行 Flash 操作。通过 FAL,可以方便地管理和操作不同类型的 Flash 设备,简化了嵌入式开发中的存储操作。
后续还需要使用EasyFlash创建数据库
如果你有任何问题或建议,请随时联系我。