跳转至

FLASH读写管理(FLASH CONTROL)


1、简介

flash_control组件用于统一管理软件对FLASH的读写操作,避免软件读写FLASH与XIP取指冲突。所有对FLASH的擦写操作在独立的FLASH控制任务中执行,任务间通过请求/释放接口互斥;擦写执行时自动将FLASH从XIP模式切换到普通模式,完成后切回XIP模式。

应用层对FLASH的读写、擦除统一使用本组件接口(post_write_flash 等),不要直接调用底层驱动(flash_write / flash_erase),否则可能与运行中的代码取指冲突。


2、API

函数名 描述
flash_ctl_init flash_control组件初始化(创建FLASH控制任务)
requset_flash_ctl 请求FLASH控制权(任务级互斥)
release_flash_ctl 释放FLASH控制权
post_write_flash 请求写flash,并等待写完成
post_read_flash 请求读flash,并等待读取完成
post_erase_flash 请求擦除flash,并等待擦除完成(最小4K)
post_read_flash_unique_id 请求读flash unique id,并等待读取完成
flash_init_to_xip flash初始化成xip模式
flash_config_to_normal flash从xip模式切换到普通模式
flash_config_to_xip flash从普通模式切换到xip模式
set_asr_run_flag 设置ASR运行标志(擦写调度参考)
set_asr_stop_flag 设置ASR停止标志

3、示例

1) 以下代码向用户数据区写入数据(擦除后写入):

#include "flash_rw_process.h"

#define USER_DATA_ADDR  (0x7F0000)  //用户数据区地址(以实际分区为准)

char write_buf[16] = "flash control";

void flash_write_demo(void)
{
    //先擦除4K扇区
    post_erase_flash(USER_DATA_ADDR, 4096);

    //写入16字节数据(阻塞至写入完成)
    post_write_flash(write_buf, USER_DATA_ADDR, 16);
}

2) 以下代码读取FLASH的unique id(用于产测/授权):

#include "flash_rw_process.h"

uint8_t unique_id[8] = {0};

void flash_uid_demo(void)
{
    post_read_flash_unique_id(unique_id);
    mprintf("flash uid: %x %x %x %x\n",
            unique_id[0], unique_id[1], unique_id[2], unique_id[3]);
}

3) 以下代码在自研流程中手动管理FLASH模式切换(慎用):

#include "flash_rw_process.h"

void flash_mode_demo(void)
{
    //请求FLASH控制权
    requset_flash_ctl();

    //切换到普通模式,此时CPU取指需避开XIP(代码已在RAM中)
    flash_config_to_normal();

    //直接调用底层驱动进行擦写
    flash_erase(DTRC, 0x7F0000, 4096);

    //切回XIP模式
    flash_config_to_xip();

    //释放控制权
    release_flash_ctl();
}

4、其它

  • post_erase_flash 擦除大小最小为4K(一个扇区),地址需扇区对齐。
  • NV数据(cinv_*)内部即基于本组件实现,应用层使用NVDATA接口即可,无需再单独管理。
  • 擦写期间XIP取指被暂停,实时性敏感的任务(如正在播放的音频)建议避开FLASH擦写窗口;set_asr_run_flag / set_asr_stop_flag 用于配合ASR运行状态调度擦写时机。

5、API 参考

本模块接口声明于 components\flash_control\flash_control_inc\flash_rw_process.h,实现位于 components\flash_control\src\flash_rw_process.c。