STM32F429使用RT-THREAD+FAL+SFUD管理FLASH(一)
SFUD(Serial Flash Universal Driver)串行 Flash 万能驱动库,有了它,不用单独再去写SPI的驱动啦,当然,MCU引脚的初始化工作还是要做(可以使用CUBEMX生成初始化代码放到工程中去,也可以自己手写)。4.1 FAL (Flash Abstraction Layer) Flash 抽象层,是对 Flash 及基于 Flash 的分区进行管理、操作的抽象层,对
1:FLASH分为片上FLASH和片内FLASH。
区别:片内FLASH,大部分使用最小系统板时,程序就是直接烧写入片内FLSH中,扩展了外部FLASH后,程序可以烧写到片外FLASH中,并通过设置“中断向量表”可以实现启动片外程序。
2:片内FLASH
FLASH是分扇区来管理的,意味着初始化时会以扇区为单元进行格式化。具体可以参考各型号芯片的芯片手册这里引用一个文章讲解的很祥细

可以看到0x080000到0x080f ffff是flash主存储器的地址,也就是片内FLASH的可操作地址。
STM32F429IGT6的FLASH是1M,地址也就是从0x08000000~0x080F FFFF(不含)
前128K分成了4个16K,1个64K,后面的都是128K一个扇区。
3:外部FLASH
3.1 SFUD
SFUD(Serial Flash Universal Driver) 串行 Flash 万能驱动库,有了它,不用单独再去写SPI的驱动啦,当然,MCU引脚的初始化工作还是要做(可以使用CUBEMX生成初始化代码放到工程中去,也可以自己手写)。
3.2 外部FLASH使用偏移地址直接操作就行,比如从0x00000000读100个字节,可以用上FAL来读写,也可以自己写接口驱动,当然也可以使用文件系统操作。
3.3 外部FLASH使用的时候需要把SPI设备与SFUD设备进行关联,操作方式如下:
#include <rtthread.h>
#include "drv_spi.h"
#include "spi_flash_sfud.h"
#define SPI_BUS_NAME "spi5"
#define W25Q_SPI_DEVICE_NAME "spi50"
//#define W25Q_FLASH_NAME "W25Q128"
static int rt_hw_spi_flash_init()
{
rt_err_t ree = RT_EOK;
ree = rt_hw_spi_device_attach(SPI_BUS_NAME, W25Q_SPI_DEVICE_NAME, GPIOF, GPIO_PIN_6);
//ree = rt_hw_spi_device_attach(SPI_BUS_NAME, W25Q_SPI_DEVICE_NAME, GPIOB, GPIO_PIN_6);
/* 使用 SFUD 探测 spi10 从设备,并将 spi10 连接的 flash 初始化为块设备,名称 W25Q128 */
if (RT_NULL == rt_sfud_flash_probe(FAL_USING_NOR_FLASH_DEV_NAME, W25Q_SPI_DEVICE_NAME))
{
return -RT_ERROR;
}
return ree;
}
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
上图把SPI5口挂载到了SPI5这个SFUD的SPI5,0号设备上也就是SPI50.注意这里是rt-thread5.0以下的操作,5.0有新操作接口。
4:完成挂载后,就可以使用应用层的库来操作FLASH了,比如使用FAL,FAT等文件系统。
4.1 FAL (Flash Abstraction Layer) Flash 抽象层,是对 Flash 及基于 Flash 的分区进行管理、操作的抽象层,对上层统一了 Flash 及 分区操作的 API (框架图如下所示)

使用FAL分区示例:
#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_
#include <rtconfig.h>
#include <board.h>
#define RT_APP_PART_ADDR 0x08000000
#ifndef FAL_USING_NOR_FLASH_DEV_NAME
#define NOR_FLASH_DEV_NAME "norflash0"
#else
#define NOR_FLASH_DEV_NAME FAL_USING_NOR_FLASH_DEV_NAME
#endif
#define FLASH_SIZE_GRANULARITY_16K (4 * 16 * 1024)
#define FLASH_SIZE_GRANULARITY_64K (64 * 1024)
#define FLASH_SIZE_GRANULARITY_128K (7 * 128 * 1024)
#define STM32_FLASH_START_ADRESS_16K STM32_FLASH_START_ADRESS
#define STM32_FLASH_START_ADRESS_64K (STM32_FLASH_START_ADRESS_16K + FLASH_SIZE_GRANULARITY_16K)
#define STM32_FLASH_START_ADRESS_128K (STM32_FLASH_START_ADRESS_64K + FLASH_SIZE_GRANULARITY_64K)
/* ===================== Flash device Configuration ========================= */
extern const struct fal_flash_dev stm32_onchip_flash_16k;
extern const struct fal_flash_dev stm32_onchip_flash_64k;
extern const struct fal_flash_dev stm32_onchip_flash_128k;
/* ===================== Flash device Configuration ========================= */
extern const struct fal_flash_dev stm32_onchip_flash;
extern struct fal_flash_dev nor_flash0;
/* flash device table */
#define FAL_FLASH_DEV_TABLE \
{ \
&stm32_onchip_flash_16k, \
&stm32_onchip_flash_64k, \
&stm32_onchip_flash_128k, \
&nor_flash0, \
}
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
#define FAL_PART_TABLE \
{ \
{FAL_PART_MAGIC_WROD, "bootloader","onchip_flash_16k",0,128 * 1024, 0}, \
{FAL_PART_MAGIC_WROD,"app","onchip_flash_128k",128 * 1024,896 * 1024, 0}, \
{FAL_PART_MAGIC_WROD,"download", NOR_FLASH_DEV_NAME,0,1024 * 1024, 0}, \
{FAL_PART_MAGIC_WROD,"factory", NOR_FLASH_DEV_NAME,1024,1024 * 1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */
#endif /* _FAL_CFG_H_ */
本文先了解FLASH操作相关的基础知识,下一篇文章将会提供一个配置流程及操作实例。
更多推荐



所有评论(0)