【HC32L196】RT-Thread FAL 应用笔记

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)

环境搭建

  1. 克隆 RT-Thread 源码

    git clone https://github.com/RT-Thread/rt-thread.git
    
  2. 导入 HC32L196 BSP

    将 HC32L196 BSP 拷贝到 bsp 目录下:

    cp -r path_to_hc32l196_bsp rt-thread/bsp/hc32l196
    
  3. 使用 IAR 打开工程

    使用 IAR Embedded Workbench 打开 rt-thread/bsp/hc32l196 目录下的工程文件。

FAL 配置

  1. 启用 FAL 组件

    board/Kconfig 文件中增加FAL配置:

        config BSP_USING_ON_CHIP_FLASH
        bool "Enable on-chip FLASH"
        default y
    
  2. 配置 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

  1. 初始化 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);    /* 使用组件自动初始化机制 */   
  1. 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创建数据库


如果你有任何问题或建议,请随时联系我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值