参考文档(国内):FAL 参考文档

  

一、概述

  FAL (Flash Abstraction Layer) ,即 Flash 抽象层,是对 Flash 及基于 Flash 的分区进行管理、操作的抽象层,对上层统一了 Flash 及 分区操作的 API。


  对于 FAL 的依赖来说,对 RT-Thread 无依赖,也可用于裸机。但是,测试命令功能需要依赖 RT-Thread FinSH/MSH。

  

二、FAL 的使用

  对于 FAL 的使用,详细介绍可以查看上面的参考手册,这里只是做一个简单的分析。
  使用的开发板是正点原子的潘多拉开发板,所以下面的分析也是以这个开发板的 bsp 源码为基础,仅供参考。

  

1、 定义 Flash 设备

  对于要定义的 Flash 设备。可以是片内 flash, 也可以是片外的 spi flash。
  简单来说,就是定义具体的 Flash 设备对象,用户需要根据自己的 Flash 情况分别实现 init、 read、 write、 erase 这些操作函数。

  

1.1、 片内 Flash

  对于 STM32L475 的片内 Flash 驱动,RT-Thread 为我们移植好了源码,只需要打开 “Enable on-chip FLASH” 选项即可。

/* bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_l4.c */const struct fal_flash_dev stm32_onchip_flash =
{ "onchip_flash",                 /* Flash 设备的名字 */STM32_FLASH_START_ADRESS,      /* 对 Flash 操作的起始地址:0x08000000 */ STM32_FLASH_SIZE,               /* Flash 的总大小:512 KB */FLASH_PAGE_SIZE,              /* Flash 块/扇区大小:2048 *//* Flash 的操作函数 */{    NULL,                       /* init 函数 */fal_flash_read,            /* read 函数 */fal_flash_write,           /* write 函数 */fal_flash_erase               /* erase 函数 */}
};/* 这里的分析以 write 函数为例 */
static int fal_flash_write(long offset, const rt_uint8_t *buf, size_t size)
{/*** RT-Thread 已经为我们实现了 stm32_flash_write 函数* 这个函数也是调用了 stm32 HAL 库提供的接口 **/return stm32_flash_write(stm32_onchip_flash.addr + offset, buf, size);
}

  

1.2、 片外 Flash

  在前面的文章中,我们提到了 SFUD,所以对于片外的 Flash 来说,可以使用 SFUD 驱动来进行相关操作的。
  这里的 nor_flash 就是 W25Q128。

const struct fal_flash_dev nor_flash0 =
{ "nor_flash",            /* Flash 设备的名字 */0,                         /* 对 Flash 操作的起始地址:0x08000000 */ (16 * 1024 * 1024),     /* Flash 的总大小:16 MB */4096,                  /* Flash 块/扇区大小:4096 */{fal_sfud_init,       /* init 函数 */read,              /* read 函数 */write,                 /* write 函数 */erase             /* erase 函数 */}
};sfud_flash sfud_norflash0;static int fal_sfud_init(void)
{sfud_flash_t sfud_flash0 = NULL;/*** 根据 QSPI 设备获取 sfud_flash 对象,用于后续操作 * 其实就是将 uer_data 中保存的 sfud_flash 结构体给取出来**/sfud_flash0 = (sfud_flash_t)rt_sfud_flash_find("qspi10");if (NULL == sfud_flash0){return -1;}sfud_norflash0 = *sfud_flash0;return 0;
}/* 这里的分析以 write 函数为例 */
static int write(long offset, const uint8_t *buf, size_t size)
{/* 调用 SFUD 驱动提供的接口 */if (sfud_write(&sfud_norflash0, nor_flash0.addr + offset, size, buf) != SFUD_SUCCESS){return -1;}return size;
}

  

2、 定义 Flash 设备表

  Flash 设备表定义在 fal_cfg.h 头文件中,定义分区表前需新建 fal_cfg.h 文件(如果没有的话),请将该文件统一放在对应 BSP 或工程目录的 port 文件夹下,并将该头文件路径加入到工程。

extern const struct fal_flash_dev stm32l4_onchip_flash;
extern const struct fal_flash_dev nor_flash0;/*** Flash 设备表* Flash 设备表中,有两个 Flash 对象* 一个为 STM32L4 的片内 Flash ,一个为片外的 Nor Flash**/
#define FAL_FLASH_DEV_TABLE                                          \
{                                                                    \&onchip_flash,                                                   \&nor_flash0,                                                     \
}

  

3、 定义 Flash 分区表

  分区表也定义在 fal_cfg.h 头文件中。Flash 分区基于 Flash 设备,每个 Flash 设备又可以有 N 个分区,这些分区的集合就是分区表。
  在配置分区表前,务必保证已定义好 Flash 设备及设备表。

#ifdef FAL_PART_HAS_TABLE_CFG#define FAL_PART_TABLE                                                                                              \
{                                                                                                                   \{FAL_PART_MAGIC_WROD, "bootloader", "onchip_flash",                                    0,        64 * 1024, 0}, \{FAL_PART_MAGIC_WROD,        "app", "onchip_flash",                            64 * 1024,       448 * 1024, 0}, \{FAL_PART_MAGIC_WROD,  "easyflash",    "nor_flash",                                    0,       512 * 1024, 0}, \{FAL_PART_MAGIC_WROD,   "download",    "nor_flash",                           512 * 1024,      1024 * 1024, 0}, \{FAL_PART_MAGIC_WROD, "wifi_image",    "nor_flash",                  (512 + 1024) * 1024,       512 * 1024, 0}, \{FAL_PART_MAGIC_WROD,       "font",    "nor_flash",            (512 + 1024 + 512) * 1024,  7 * 1024 * 1024, 0}, \{FAL_PART_MAGIC_WROD, "filesystem",    "nor_flash", (512 + 1024 + 512 + 7 * 1024) * 1024,  7 * 1024 * 1024, 0}, \
}
#endif

  其中:
  1)分区名保证不能重复。
  2)关联的 Flash 设备务必已经在 Flash 设备表中定义好 ,并且名称一致 ,否则会出现无法找到 Flash 设备的错误。
  3)分区的起始地址和大小 不能超过 Flash 设备的地址范围 ,否则会导致包初始化错误。

  

3、 FAL 分区的使用

  从前面的分区可以知道,片外 Flash 有多个分区,如果要使用 filesystem 分区来挂载 elm FAT 系统,那么可以进行下面的操作。(别的分区后续会使用到,比如 easyflash 分区)

#include <fal.h>
#include <dfs_fs.h>/* 挂载初始化 */
void mnt_init(void)
{struct rt_device *rootfs = RT_NULL;/* 使用 filesystem 分区创建块设备,块设备名称为 filesystem */rootfs = fal_blk_device_create("filesystem");if(rootfs == RT_NULL)return;/* 将 elm fat 文件系统挂载 W25Q128 的 filesystem 分区 */if (dfs_mount("filesystem", "/", "elm", 0, 0) == 0){rt_kprintf("file system initialization done!\n");}else{if(dfs_mkfs("elm", "filesystem") == 0){if (dfs_mount("filesystem", "/", "elm", 0, 0) == 0){rt_kprintf("file system initialization done!\n");}else{rt_kprintf("file system initialization failed!\n");}}}
}

【RTT】SPI Flash 与文件系统(2):FAL相关推荐

  1. 【RTT】SPI Flash 与文件系统(3):DFS 和 EasyFlash

       参考文档(国内):DFS 参考文档 参考文档(国内):EasyFlash 参考文档    一.DFS 概述   DFS 是 RT-Thread 提供的虚拟文件系统组件,全称为 Device Fi ...

  2. STM32CubeMX学习笔记(25)——FatFs文件系统使用(操作SPI Flash)

    一.FatFs简介 FatFs 是面向小型嵌入式系统的一种通用的 FAT 文件系统.它完全是由 ANSI C 语言编写并且完全独立于底层的 I/O 介质.因此它可以很容易地不加修改地移植到其他的处理器 ...

  3. 在RT-Thread STM32F407平台下配置SPI flash为U盘

    记录下SPI Flash U盘实现过程中踩过的坑,与您分享. 前提条件是,需要先将SPI Flash 配置到elm fal文件系统,并挂载成功.如下图 然后开始配置USB 1,在CubeMX,选择SU ...

  4. RT-Thread使用 SFUD 操作 Flash挂载文件系统

    在智龙上使用 SFUD 操作 Flash并挂载文件系统 参考在潘多拉上使用 SFUD 操作 Flash 及在 STM32F429 上应用文件系统 SFUD 是一款开源的串行 SPI Flash 通用驱 ...

  5. flash挂载到系统 spi_jffs2根文件系统挂载不上spi flash

    这几天一直在弄jffs2,让jffs2挂载到spi flash上,所以在内核中对spi flash进行了分区,给uboot了1M的空间,给kernel 4M的空间,给jffs2了11M的空间,因为我们 ...

  6. 基于spi FLASH的嵌入式文件系统 littlefs(转)

    基于spi FLASH的嵌入式文件系统 littlefs 转载于:https://www.cnblogs.com/LittleTiger/p/10737640.html

  7. ZYNQ开机挂载SPI FLASH中的jffs2文件系统

    目录 写在前面 Vivado工程建立 petalinux工程建立 下载程序,开机测试 没成功的话看这里 写在前面   做类嵌入式开发很久了,从51到STM32,Arduino,ESP8266,ESP3 ...

  8. ADSP-SC589开发板更换SPI FLASH并从flash引导内核与文件系统

    前情提要:目前本人正在用ADSP-SC589开发板做开发,希望实现内核与文件系统都从SPI FLASH启动,但板子上原来的SPI FLASH太小了,于是更换了镁光的MT25QU01GBBB FLASH ...

  9. NUC972 SPI Flash启动+内核+Cramfs文件系统

    NUC972 作为一个低成本linux方案,有片内SDRAM,又有茫茫多的外设,简直工控神U. 为了追究更低成本,考虑放弃使用NAND,把uboot, 内核,文件系统都放在SPI FLASH.这样画板 ...

最新文章

  1. 127.0.0.1 php,关于php -fpm 出现127.0.0.1:9000已经被占用
  2. idle不是python自带的开发工具_Python的开发工具
  3. chrome解决跨域(CORS)问题---chrome插件
  4. python中 yield 的用法详解——最简单,最清晰的解释(排序节省内存消耗)
  5. Get Network Utilization
  6. Spring源码学习笔记:经典设计模式之代理模式
  7. 编译原理第三版清华pdf_清华网络科学与网络空间研究院考研经验分享
  8. Android系统里面的服务器和客户端的概念解析
  9. Redis 客户端哪家强? Lettuce手下见真香!
  10. How to reassign lifecycle in Windchill
  11. 码云上开源JAVA项目收藏
  12. c语言 多元一次方程,C++实现的求解多元一次方程示例
  13. `SpringBoot`+`axios`结合发送`ajax`请求
  14. Stm8 串口重定向及问题解决
  15. Mentor Graphics ModelSim SE 10.5官方原版+完美破解
  16. NetAlly网络测试仪
  17. 美容美发商家的痛点说明
  18. 微信小程序开发者工具-使用技巧(更新中~)
  19. 前端经典面试500题【下】
  20. 【闲谈项目管理】项目经理极简主义神器:一页纸项目管理

热门文章

  1. Win32 Api函数
  2. 细思极恐——你真的会写Java吗?
  3. 【数学】下一个更大元素
  4. 奥特曼生日祝福视频制作教程(附高清教程下载)
  5. java微波炉程序代码,单片机微波炉控制系统仿真与源程序
  6. 汇编笔记Linux(x86-64)
  7. 【BZOJ2300】【HAOI2011】防线修建
  8. hive中的时间处理函数
  9. SketchUp Pro for mac 2023 v23.0.396 草图大师 - 专业的3D建模软件
  10. python编程与t5哪个难_R和Python谁更好?这次让你「鱼与熊掌」兼得