这是最新(主)开发分支的文档。如果您正在查找以前版本的文档,使用左侧的下拉菜单选择所需的版本。

FLASH

简介

FLASH 存储器,也称为闪存,是一种非易失性存储技术,能够在断电的情况下保持数据不丢失,并支持电子方式进行数据的擦除和写入,同时提供快速的数据读取能力。

功能列表

  • 读数据

  • 写数据

  • 擦除数据

  • 设备信息查询

  • 支持内部和 flash 和外接 SPI-flash 共存

功能概述

实现了读、写、擦除、设备查询等功能

  • 支持两种方式写:写入前手动擦除、写入前自动擦除

  • 支持三种方式擦除:从指定偏移量开始擦除、按扇区为单位擦除、擦除整个 Flash 芯片上的所有数据

如何添加外部 FLASH

外接flash操作步骤如下

  • 通过 SPI 接上 flash,SPI 的接线参考 SPI Master

  • 在设备描述符中添加该 flash

  • 在 wm_drv_eflash_chips.h 中仿造 wm_external_flash_chip_p25q,添加对应 flash 的支持

主要功能

写数据到 flash

起始条件:

  • 使用前初始化 flash

相关时序 API:

  • 调用 wm_drv_flash_init 来初始化flash, 如果设备已经初始化,则通过 wm_dt_get_device_by_name 函数来获取设备指针

  • 根据需求,调用 wm_drv_flash_write 向 Flash 的指定地址写入数据,写入前需要先擦除该区域

  • 根据需求,调用 wm_drv_flash_write_with_erase 向 Flash 的指定地址写入数据,写入前自动擦除该区域

警告

写入数据之前,如果没有先对该区域进行擦除,写入的数据可能会不正确

读取flash数据

起始条件:

  • 使用前初始化 flash

相关时序 API:

  • 调用 wm_drv_flash_init 来初始化flash, 如果设备已经初始化,则通过 wm_dt_get_device_by_name 函数来获取设备指针

  • 调用 wm_drv_flash_read 从 Flash 的指定地址读取数据到提供的缓冲区

擦除 flash 上的数据

起始条件:

  • 使用前初始化 flash

相关时序 API:

  • 调用 wm_drv_flash_init 来初始化 flash, 如果设备已经初始化,则通过 wm_dt_get_device_by_name 函数来获取设备指针

  • 根据需求,调用 wm_drv_flash_erase_region 擦除 Flash 中从指定偏移量开始的指定长度的区域

  • 根据需求,调用 wm_drv_flash_erase_sector 按扇区为单位擦除 Flash,从指定的扇区索引开始,擦除指定数量的扇区

  • 根据需求,调用 wm_drv_flash_erase_chip 擦除整个 Flash 芯片上的所有数据

获取 flash 基本信息

起始条件:

  • 使用前初始化 flash

相关时序API:

  • 调用 wm_drv_flash_init 来初始化flash, 如果设备已经初始化,则通过 wm_dt_get_device_by_name 函数来获取设备指针

  • 调用 wm_drv_flash_get_device_info 获取Flash设备的相关信息,并存储在提供的结构体中

结果:

  • 返回设备信息, flash 总大小,每个页的大小,每个段的大小,厂商 ID,设备 ID

注意事项

  • 传入的 flash address 不能含有基地址

  • 操作 flash 之前,需先获取到对应的设备指针

  • 操作 flash 之前可先了解 flash 分区情况,分区表具体操作见 分区表 章节

应用实例

wm_device_t  *flash_dev = NULL;
uint32_t  write_addr = 0x5000;
uint8_t  *write_buf = NULL;
uint32_t  write_len = 256;
uint32_t read_addr  =  0x5000;
uint32_t  read_len  =  256;
uint8_t  *read_buf = NULL;
uint32_t erase_addr  =  0x5000;
uint32_t  erae_len  =  256;


write_buf  =  (uint8_t *)wm_os_malloc(write_len);
if (write_buf) {
    read_buf  =  (uint8_t *)wm_os_malloc(write_len);
    if (read_buf) {
        flash_dev = wm_drv_flash_init(“internal_flash”);
        wm_drv_flash_write(flash_dev, write_addr,  write_buf,  write_len);
        wm_drv_flash_read(flash_dev, read_addr,  read_buf,  read_len);
        wm_drv_flash_erase_region(flash_dev, erase_addr, erase_len);

        wm_os_free(read_buf);
    }
    wm_os_free(write_buf);
}

API参考

Flash API