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);
}