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。