登录/注册

stm32读写内部flash

stm32读写内部flash

更多

在STM32中读写内部Flash(闪存)需遵循特定步骤,以下是详细流程和注意事项(以标准外设库/HAL库为例):


关键步骤

1. 解锁Flash(解除写保护)

Flash默认被锁定以防止误操作,需先解锁:

   // 标准库
   FLASH_Unlock();

   // HAL库
   HAL_FLASH_Unlock();

2. 擦除目标页/扇区

Flash只能将1写成0,写入前需擦除(将整页恢复为0xFF):

   // 标准库(以STM32F1为例)
   FLASH_Status status = FLASH_ErasePage(FLASH_ADDR); // 按页擦除
   if (status != FLASH_COMPLETE) { /* 错误处理 */ }

   // HAL库(以STM32F4为例)
   FLASH_EraseInitTypeDef eraseConfig;
   uint32_t sectorError;
   eraseConfig.TypeErase = FLASH_TYPEERASE_SECTORS;   // 按扇区擦除
   eraseConfig.Sector = FLASH_SECTOR_7;              // 目标扇区编号
   eraseConfig.NbSectors = 1;                        // 擦除数
   eraseConfig.VoltageRange = FLASH_VOLTAGE_RANGE_3; // 电压范围(3.3V)
   if (HAL_FLASHEx_Erase(&eraseConfig, &sectorError) != HAL_OK) {
       /* 错误处理 */
   }

3. 写入数据

半字(16位)字(32位) 写入(不支持单字节写入):

   // 标准库(半字写入)
   for (uint16_t i = 0; i < dataSize; i += 2) {
       FLASH_Status status = FLASH_ProgramHalfWord(targetAddr, *(uint16_t*)(data + i));
       if (status != FLASH_COMPLETE) { /* 错误处理 */ }
       targetAddr += 2;
   }

   // HAL库(字写入)
   for (uint16_t i = 0; i < dataSize; i += 4) {
       if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, targetAddr, *(uint32_t*)(data + i)) != HAL_OK) {
           /* 错误处理 */
       }
       targetAddr += 4;
   }

4. 重新锁定Flash

操作完成后重新上锁:

   // 标准库
   FLASH_Lock();

   // HAL库
   HAL_FLASH_Lock();

5. 读取数据

直接指针访问(无需解锁):

   uint32_t readData = *(__IO uint32_t*)FLASH_ADDR; // 读取32位数据

注意事项

  1. 地址对齐

    • 起始地址必须是偶数(半字写入)或4的倍数(字写入)。
    • 跨页写入时需确保每页已提前擦除。
  2. 中断与超时

    • 擦除/写入期间CPU会阻塞,HAL库默认使用中断超时等待。
    • 复杂场景建议关闭中断(__disable_irq())后再操作Flash。
  3. Flash寿命

    • 典型擦写寿命约 10,000次,避免频繁写入。
  4. 内存屏障
    操作关键寄存器前插入内存屏障:

    __HAL_FLASH_DATA_CACHE_DISABLE(); // 禁用数据缓存(F4/F7/H7需考虑)
    __ISB(); // 指令屏障
  5. 目标地址范围

    • 必须位于用户Flash区域(参考芯片手册)。
    • 避开启动代码区与向量表(通常从0x08000000开始)。
  6. 硬件限制

    • 不同系列Flash结构不同(F1按页,F4/F7按扇区)。
    • 部分型号支持双Bank(可边读边写)。

完整示例(STM32F1 HAL库)

#include "stm32f1xx_hal.h"

#define FLASH_TARGET_START ((uint32_t)0x0800F000) // 末尾页地址(需根据具体型号调整)

void Flash_Write(uint32_t offset, uint16_t *data, uint16_t size) {
    HAL_FLASH_Unlock();

    // 计算目标页地址(STM32F1每页1KB)
    uint32_t pageAddr = FLASH_TARGET_START + (offset & 0xFFFFFC00);

    // 擦除页
    FLASH_EraseInitTypeDef eraseConfig = {
        .TypeErase = FLASH_TYPEERASE_PAGES,
        .PageAddress = pageAddr,
        .NbPages = 1
    };
    uint32_t pageError;
    HAL_FLASHEx_Erase(&eraseConfig, &pageError);

    // 写入数据(半字)
    uint32_t addr = FLASH_TARGET_START + offset;
    for (uint16_t i = 0; i < size; i++) {
        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr, data[i]);
        addr += 2;
    }

    HAL_FLASH_Lock();
}

void Flash_Read(uint32_t offset, uint16_t *buf, uint16_t size) {
    uint32_t addr = FLASH_TARGET_START + offset;
    for (uint16_t i = 0; i < size; i++) {
        buf[i] = *(__IO uint16_t*)addr;
        addr += 2;
    }
}

常见问题

  1. HardFault异常
    • 地址非法(超出Flash范围)。
    • 未擦除直接写入。
  2. 数据错误
    • 写入时未对齐地址。
    • 跨页写入未处理分页边界。
  3. 擦写失败
    • 未解锁Flash或电压范围配置错误。

提示:具体细节需查阅对应型号的《参考手册》和《Flash编程手册》,重点关注:

  • 页/扇区大小
  • 擦写时间参数
  • 寄存器操作时序

STM32CUBEMX开发GD32F303(17)----内部Flash读写

本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发板内进行验证。 本例程主要讲解如何对芯片自带Flash

2023-07-27 09:35:54

STM32CUBEIDE(16)----内部Flash读写

本例程主要讲解如何对芯片自带Flash进行读写,用芯片内部Flash可以

2023-07-27 09:24:48

读写STM32内部FLASH问题解析

不是那种读写外挂FLASH芯片的,而是读写STM32

2023-01-09 16:46:24

STM32 内部Flash读写 程序源码 [已验证]

由于STM32 系列Flash的Erase功能都是按Page擦除,所以想往Flash写入某一段数据,又想保持其他数据不变的话,就要做缓存

资料下载 佚名 2021-12-02 12:06:10

STM32F4内部Flash读写

之前的文章中介绍过STM32F0列的内部Flash读写《

资料下载 佚名 2021-12-02 11:36:25

STM32读写内部flash注意点

STM32读写内部flash注意点先说注意点怎么写怎么读的总结先说注意点

资料下载 佚名 2021-12-02 11:21:41

STM32内部Flash读写问题

STM32Flash读写之Flash调试技巧文章目录先熟悉所用MCU的Flash

资料下载 佚名 2021-12-01 20:21:14

如何进行CPU内部Flash读写的实例资料说明

本文档的主要内容详细介绍的是如何进行CPU内部Flash读写的实例资料说明。

资料下载 佚名 2019-05-29 17:36:32

STM32CUBEMX(10)--Flash读写

本例程主要讲解如何对芯片自带Flash进行读写,用芯片内部Flash可以

2022-11-14 16:36:42

STM32F1内部Flash读写介绍

之前的文章中介绍过STM32F0列的内部Flash读写《

2022-01-26 06:40:54

如何对STM32内部Flash进行读写

如何对STM32内部的Flash进行读写呢?其程序是怎样去实现的?

2021-11-02 07:14:09

通过对stm32内部flash读写可以实现对stm32的编程操作

一、Flash简介  通过对stm32内部的flash的

2021-08-05 07:56:53

stm32内部flash读写

stm32内部flash读写,

2021-08-05 07:23:19

STM32_ SPI读写Flash

STM32_SPI读写Flash

2020-04-08 10:26:16

STM32片上Flash读写一些重要知识

STM32片上Flash读写的一些重要知识

2020-03-06 14:54:24

7天热门专题 换一换
相关标签