flash api库

简介

SPV1x的flash api库,提供擦写程序flash的相关功能。该库对内置flash和外挂程序flash的场景都能适用。

相关的数据结构说明

enum spi_baud_t

操作flash时,spi的时钟频率配置。

  • Spi_Baud_1M: 配置spi的SCK频率为1MHz。

  • Spi_Baud_2M: 配置spi的SCK频率为2MHz。

  • Spi_Baud_4M: 配置spi的SCK频率为4MHz。

  • Spi_Baud_8M: 配置spi的SCK频率为8MHz。

  • Spi_Baud_12M: 配置spi的SCK频率为12MHz。

  • Spi_Baud_16M: 配置spi的SCK频率为16MHz。

  • Spi_Baud_24M: 配置spi的SCK频率为24MHz。

  • Spi_Baud_48M: 配置spi的SCK频率为48MHz。

enum spi_chx_t

操作flash时,spi的通道选择。

  • Spi_Ch0: 选择SPI0。

  • Spi_Ch1: 选择SPI1。

API说明

int32_t flash_op_init(spi_chx_t chx, spi_baud_t spi_baud)

flash操作初始化。

参数
  • chx – 选择用于操作flash的spi通道。

  • spi_baud – 选择spi的SCK信号频率。

返回

返回0表示成功;其他值表示错误。

int32_t flash_op_erase(uint32_t addr, uint32_t size)

对flash进行擦除。

参数
  • addr – 擦除地址,需要4K对齐。

  • size – 擦除的区域大小,需要是4K的整数倍。

返回

返回0表示成功;其他值表示错误。

int32_t flash_op_write(uint32_t addr, uint8_t *pbuf, uint32_t len)

对flash进行写入。

参数
  • addr – 写入地址,无对齐要求。

  • pbuf – 指向写入的数据,数据必须在SRAM中。

  • len – 要写入的数据长度,最小为1byte。

返回

返回0表示成功;其他值表示错误。

int32_t flash_op_read_id(uint32_t *id_out)
读取flash ID。ID格式如下:
  • 最高字节:固定为0x00;

  • 次高字节:Manufacturer ID;

  • 次低字节:Memory Type ID;

  • 最低字节:Capacity ID。

参数
  • id_out – 指向用于容纳ID的变量。

返回

返回0表示成功;其他值表示错误。

void flash_op_deinit(void)

flash操作去初始化。

:param : 无。 :returns: 无。

flash api库使用方法

  1. 包含头文件: #include “flash_api.h”

  2. 调用 flash_op_init(chx,spi_baud) ,初始化flash api库。chx选择spi通道,spi_baud选择spi速率。

  3. 调用 flash_op_erase(addr,size) ,擦除flash区域,如果后续要写入的区域已经是擦除过的,则不用再擦除。flash以4K扇区为擦除单位,所以addr需要对齐到4096,size需要是4096的整数倍。

  4. 调用 flash_op_write(addr,pbuf,len) ,写入数据到flash。写入时没有地址对齐要求,len最小可以是1个byte。

  5. 调用 flash_op_deinit() ,去初始化flash api库。

备注

建议程序对flash api的返回值进行检查。常见的错误码列表如下:
  • 0:操作成功。

  • -1:初始化SPI时,等待NORC空闲过程超时。

  • -2:SPI发送数据超时。

  • -3:SPI接收数据超时。

  • -4:等待flash空闲过程超时。

  • -5:SPI通道参数错误,参数不在 spi_chx_t 中。

  • -6:SPI速度参数错误,参数不在 spi_baud_t 中。

  • -7:SPI通道参数不支持,flash接线不支持当前请求的SPI通道。

注意事项

  1. flash api库和其他场景库(播放库/录音库/识别库)存在资源重叠。在使用flash api库的时候,需要先将其他场景库去初始化。待flash api库使用完成并去初始化后,再重新初始化其他场景库。

  2. 如果程序flash接在GPIO00~GPIO03上,则只能选 Spi_Ch0 。如果程序flash接在GPIO10~GPIO13上,则 Spi_Ch0Spi_Ch1 都可选。

  3. flash在擦写过程中,CPU会停止其他代码的执行,直到擦写过程完成。

  4. 如果要从flash读取数据,直接使用NORC的地址空间访问即可。比如要访问flash地址0x1234处存储的int型数据,则按如下代码访问:

int data = *((int *)(NORC_DATA_UNCACHE_SINGLE_ADDR(0x1234)));
  1. flash擦写寿命有限,软件可以做磨损均衡,以减少扇区的擦写频率。