登录/注册

STM32FLASH读写源码

STM32FLASH读写源码

更多

以下是使用STM32标准外设库(适用于STM32F1/F4等系列)进行FLASH读写的示例代码。代码包含解锁、擦除、写入和读取操作,并进行了详细的中文注释:

#include "stm32f10x.h" // 根据实际型号包含对应头文件

// FLASH操作状态定义
typedef enum {
  FLASH_COMPLETE = 0,
  FLASH_ERROR
} FLASH_Status;

// FLASH起始地址(示例使用扇区5)
#define FLASH_START_ADDR     ((uint32_t)0x08020000)  // 对应128KB型号的扇区5起始地址
#define FLASH_SECTOR_TO_USE  FLASH_Sector_5         // 选择使用的扇区

// 解锁并初始化FLASH
FLASH_Status FLASH_Init(void) {
  // 1. 解锁FLASH
  FLASH_Unlock();

  // 2. 清除所有错误标志位
  FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);

  return FLASH_COMPLETE;
}

// 擦除指定扇区
FLASH_Status FLASH_EraseSector(uint32_t Sector) {
  FLASH_Status status = FLASH_COMPLETE;

  // 等待上次操作完成
  if(FLASH_GetStatus() != FLASH_BUSY) {
    // 执行扇区擦除
    status = FLASH_ErasePage(Sector); // 对于F1系列使用FLASH_ErasePage()
    // F4系列使用 FLASH_EraseSector(Sector, VoltageRange_3);
  }
  return status;
}

// 写入数据到FLASH(半字/字操作)
FLASH_Status FLASH_Write(uint32_t addr, const uint8_t *data, uint32_t len) {
  FLASH_Status status = FLASH_COMPLETE;

  // 确保地址和长度有效
  if((addr < FLASH_START_ADDR) || (len == 0)) 
    return FLASH_ERROR;

  // 写入数据(以半字为单位)
  for(int i = 0; i < len; i += 2) {
    uint16_t val = *(uint16_t*)(&data[i]); // 组合两个字节

    // 执行写入操作
    if(FLASH_ProgramHalfWord(addr + i, val) != FLASH_COMPLETE) {
      status = FLASH_ERROR;
      break;
    }

    // 验证写入(可选)
    if(*(volatile uint16_t*)(addr + i) != val) {
      status = FLASH_ERROR;
      break;
    }
  }
  return status;
}

// 从FLASH读取数据
void FLASH_Read(uint32_t addr, uint8_t *buf, uint32_t len) {
  const uint8_t *flash_ptr = (const uint8_t*)addr;
  for(int i = 0; i < len; i++) {
    buf[i] = flash_ptr[i];
  }
}

/* 使用示例 */
int main() {
  // 初始化FLASH
  if(FLASH_Init() != FLASH_COMPLETE) {
    // 错误处理
    while(1);
  }

  // 擦除扇区
  if(FLASH_EraseSector(FLASH_SECTOR_TO_USE) != FLASH_COMPLETE) {
    // 错误处理
    while(1);
  }

  // 准备测试数据
  uint8_t write_data[] = "STM32 FLASH Test";
  uint8_t read_data[sizeof(write_data)];

  // 写入数据
  if(FLASH_Write(FLASH_START_ADDR, write_data, sizeof(write_data)) 
      != FLASH_COMPLETE) {
    // 错误处理
  }

  // 读取验证
  FLASH_Read(FLASH_START_ADDR, read_data, sizeof(write_data));

  // 比较数据(省略比较代码)

  // 操作完成后锁定FLASH
  FLASH_Lock();

  while(1);
}

关键注意事项:

  1. 扇区选择

    • STM32F1系列:扇区0-3=16KB,扇区4=64KB,扇区5-11=128KB(具体参考手册)
    • STM32F4系列:扇区大小不一致(0-3=16KB, 4=64KB, 5-11=128KB)
  2. 写入对齐

    • 写入操作必须是 半字(16位)或字(32位) 对齐
    • 地址必须是 2 或 4 的倍数(F1系列要求半字对齐)
  3. 临界操作

    • 擦除和写入期间禁止中断(操作前关闭全局中断)
      __disable_irq();  // 开始操作前禁用中断
      // FLASH操作
      __enable_irq();   // 操作完成后恢复中断
  4. 库版本差异

    • F4系列使用 HAL_FLASH_Program() 替代 FLASH_ProgramHalfWord()
    • F4擦除接口为 HAL_FLASHEx_Erase()
  5. 重要安全措施

    • 绝对避免擦除运行中的代码扇区(通常保留最后几个扇区存储数据)
    • 操作前校验地址范围是否合法
    • 写入后建议进行数据校验

常见问题处理:

具体实现请参考对应型号的《参考手册》和《Flash programming manual》文档,不同系列操作细节存在差异。建议使用CubeMX生成初始化代码,再添加擦写功能。

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

本例程主要讲解如何对芯片自带Flash进行读写,用芯片内部Flash可以对一些需要断电保存的数据进行保存,无需加外部得存储芯片,本例程采用的是

2023-07-27 09:24:48

使用带有-S选项的stm32flash但得到错误信息是为什么?

使用 stm32flash -a0x51 -w binary.bin -S 0x3000 /dev/i2c-4但回来无法在地址 0x00003000 写入内存对于 0x8003000,我得到擦除记忆

2023-01-05 07:38:50

STM32CUBEMX(10)--Flash读写

本例程主要讲解如何对芯片自带Flash进行读写,用芯片内部Flash可以对一些需要断电保存的数据进行保存,无需加外部得存储芯片,本例程采用的是

2022-11-14 16:36:42

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

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

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

STM32F4内部Flash读写

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

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

STM32内部Flash读写问题

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

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

STM32FLASH实验-SPI

STM32FLASH实验-SPI(嵌入式开发考研考什么)-FLASH实验-SPI学习目标:1、学会STM32硬件SPI2、学会对EN25Q64进

资料下载 佚名 2021-08-04 12:58:51

STM32F单片机FLASH读写函数资料免费下载

本文档的主要内容详细介绍的是STM32F单片机FLASH的读写函数资料免费下载。

资料下载 djelje 2019-07-17 17:38:00

STM32内部Flash读写程序源码相关资料下载

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

2022-01-26 07:05:32

stm32内部flash读写

stm32内部flash读写,stm32内部

2021-08-05 07:23:19

STM32Flash读写Flash调试技巧

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

2021-07-22 07:34:45

STM32_ SPI读写Flash

STM32_SPI读写Flash

2020-04-08 10:26:16

STM32F0xx_SPI读写(Flash) 配置详细过程

STM32F0xx_SPI读写(Flash)配置详细过程

2020-04-07 11:40:28

STM32F10x_SPI (硬件接口 + 软件模拟)读写Flash(25Q16)

STM32F10x_SPI(硬件接口 + 软件模拟)读写Flash(25Q16)

2020-03-25 13:59:46

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

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

2020-03-06 14:54:24

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