参考资料

1.STM32系列芯片命名规则——简明_stm32命名规则-CSDN博客

一、存储单位介绍

1.1 内存单位换算

单位 缩写 大小关系
Bit 基本单位
字节 Byte 1Byte = 1024 Bit
千字节 KB 1 KB = 1024 Byte
兆字节 MB 1 MB = 1024 KB = 1024 × 1024 B
吉字节 GB 1 GB = 1024 MB = 1024 × 1024 × 1024 B
太字节 TB 1 TB = 1024 GB = 1024 × 1024 × 1024 × 1024 B
拍字节 PB 1 PB = 1024 TB
单位 缩写 大小关系
字节 Byte 基本单位
半字 B 2字节
KB 4字节

1.2 内存布局

image-20250513153603543

二、内部FALSH介绍

2.1 STM32内存分布

image-20250513170648680

2.2 FALSH分布

image-20250513161524133

三、 函数调用

2.1 写数据

1
2
3
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);

HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data);
  • TypeProgram:指定编程模式(即写入的位宽)

    • FLASH_TYPEPROGRAM_BYTE:8 位写入
    • FLASH_TYPEPROGRAM_HALFWORD:16 位写入
    • FLASH_TYPEPROGRAM_WORD:32 位写入
    • FLASH_TYPEPROGRAM_DOUBLEWORD:64 位写入
  • TypeProgram:要写入的 Flash 地址

  • Data:要写入的数据

2.2 擦除数据

2.2.1 擦除单个扇区

1
void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange);
  • Sector:要擦除的扇区编号
  • VoltageRange:根据供电电压选择擦除时序
    • FLASH_VOLTAGE_RANGE_3:2.7V~3.6V
    • FLASH_VOLTAGE_RANGE_2:2.1V~2.7V

2.2.3 擦除多个扇区

1
2
3
HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError);

HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit);
  • pEraseInitFLASH_EraseInitTypeDef结构体的指针
    • FLASH_EraseInitTypeDef
      • TypeErase:擦除类型(扇区擦除或块擦除)
        • FLASH_TYPEERASE_SECTORS:擦除扇区
        • FLASH_TYPEERASE_MASSERASE:全片擦除
      • Banks:在双 Bank 架构的芯片(如 STM32F7/H7)中选择操作的 Bank,单 Bank 芯片(如 F1/F4)可忽略此参数
        • FLASH_BANK_1:操作 Bank 1
        • FLASH_BANK_2:操作 Bank 2
        • FLASH_BANK_BOTH:操作 Bank 12
      • Sector:指定擦除的起始扇区编号
      • NbSectors:指定连续擦除的扇区数量,值必须 ≥ 1
      • VoltageRange:电压范围(影响擦除时间)
        • FLASH_VOLTAGE_RANGE_1:1.8V 以下
        • FLASH_VOLTAGE_RANGE_2:1.8V~2.1V
        • FLASH_VOLTAGE_RANGE_3:2.1V~2.7V
        • FLASH_VOLTAGE_RANGE_4:2.7V~3.6V
  • SectorError:记录擦除失败的扇区号

2.3 FALSH开关锁

擦写数据之前要进行开关锁操作

1
2
HAL_StatusTypeDef HAL_FLASH_Unlock(void);//开锁,可以擦写
HAL_StatusTypeDef HAL_FLASH_Lock(void);//关锁,不可以擦写

2.4 回调函数

2.4.1 擦写成功回调函数

Flash 编程或擦除操作成功完成时

1
void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue);
  • 0xFFFFFFFF:表示操作成功
  • 其它值:失败时的错误地址

2.4.2 擦写失败回调函数

Flash 操作(擦除或编程)发生硬件错误时

1
void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue);
  • ReturnValue:出错时的 Flash 地址或错误标志
  • 具体地址:说明该地址的操作失败
  • 0xFFFFFFFF:表示错误与特定地址无关(如全局错误)

2.5 选项字节开关锁

1
2
HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void);
HAL_StatusTypeDef HAL_FLASH_OB_Lock(void);

2.6 编程(修改)选项字节

1
HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit);
  • OptionType:指定要修改的选项类型(可组合)

    • OPTIONBYTE_WRP:写保护
    • OPTIONBYTE_RDP:保护
    • OPTIONBYTE_USER:用户配置
    • OPTIONBYTE_BOR:电压跌落复位
  • WRPState:写保护状态

    • OB_WRPSTATE_DISABLE:禁用保护
    • OB_WRPSTATE_ENABLE:启用保护
  • WRPSector:写保护扇区

  • Banks:在双 Bank 架构的芯片(如 STM32F7/H7)中选择操作的 Bank,单 Bank 芯片(如 F1/F4)可忽略此参数

    • FLASH_BANK_1:操作 Bank 1
    • FLASH_BANK_2:操作 Bank 2
    • FLASH_BANK_BOTH:操作 Bank 12
  • RDPLevel:读保护级别

    • OB_RDP_LEVEL_0:无保护
    • OB_RDP_LEVEL_1:启用保护
    • OB_RDP_LEVEL_2:永久保护(不可逆!)
  • BORLevel:电压跌落复位阈值

  • USERConfig:用户配置

2.7 应用已修改的选项字节

1
2
HAL_StatusTypeDef HAL_FLASH_OB_Launch(void);

2.8 获取当前的选项字节配置

1
HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit);

2.9 等待一个 Flash 操作

1
HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout);