首页/外设速查/Flash
💾

Flash 片内程序存储

存储外设
存程序与掉电数据,IAP 在线升级、参数存储都离不开它,先擦后写是铁律。
🧩 核心原理
📈 时序 / 工作过程图
Flash 擦写流程(IAP 基础)解锁 → 擦除 → 编程 → 校验/锁定① 解锁FLASH_KEYR 写密钥② 擦除扇区先擦后写(按扇区/页)③ 编程写入半字/字写入擦除后全为 0xFF;只能把 1 写成 0,不能反向 → 必须先擦后写寿命:擦写约 1 万次(EEPROM 约 100 万次)· IAP 升级 = 从 Boot 区擦写 App 区
⚙️ 配置 / 使用要点
  1. 解锁 FLASH:写 KEYR 密钥
  2. 擦除目标扇区/页
  3. 编程:HAL_FLASH_Program(type, addr, data)
  4. 完成后锁定 + 校验读取
🛠️ 项目示例
Flash 存储参数(掉电保存校准值)
// 存:校准值写到 App 区末尾 1 页
HAL_FLASH_Unlock();
FLASH_EraseInitTypeDef fe = {
  .TypeErase = FLASH_TYPEERASE_PAGES,
  .PageAddress = APP_END_PAGE_ADDR,   // 如 0x0803F800
  .NbPages = 1
};
uint32_t err = 0;
HAL_FLASHEx_Erase(&fe, &err);
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, APP_END_PAGE_ADDR, calib_value);
HAL_FLASH_Lock();

// 读:直接指针访问
uint32_t saved = *(volatile uint32_t*)APP_END_PAGE_ADDR;
❓ 面试高频
为什么Flash必须先擦后写?
Flash单元只能从1变为0,擦除把所有位变1(0xFF),编程只能写0,所以写之前必须擦
Flash和EEPROM区别?
Flash按扇区擦除、寿命~1万次、容量大;EEPROM按字节擦写、寿命百万次、容量小
IAP升级原理?
Boot区在启动时检查升级标志→从外部源(串口/U盘/网络)收固件→擦写App区→跳转运行
✅ 自查清单 (点击勾选,本地保存)
0/0
知道先擦后写原因
知道扇区/页/编程粒度
知道寿命与磨损
理解IAP升级原理
会写参数存储流程