内部FLASH
参考资料:
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 内存布局
二、内部FALSH介绍
2.1 STM32内存分布
2.2 FALSH分布
三、 函数调用
2.1 写数据
1 | HAL_StatusTypeDef HAL_FLASH_Program(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.6VFLASH_VOLTAGE_RANGE_2
:2.1V~2.7V
2.2.3 擦除多个扇区
1 | HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError); |
- pEraseInit:
FLASH_EraseInitTypeDef
结构体的指针- FLASH_EraseInitTypeDef
TypeErase
:擦除类型(扇区擦除或块擦除)FLASH_TYPEERASE_SECTORS
:擦除扇区FLASH_TYPEERASE_MASSERASE
:全片擦除
Banks
:在双 Bank 架构的芯片(如 STM32F7/H7)中选择操作的 Bank,单 Bank 芯片(如 F1/F4)可忽略此参数FLASH_BANK_1
:操作 Bank 1FLASH_BANK_2
:操作 Bank 2FLASH_BANK_BOTH
:操作 Bank 12
Sector
:指定擦除的起始扇区编号NbSectors
:指定连续擦除的扇区数量,值必须 ≥ 1VoltageRange
:电压范围(影响擦除时间)FLASH_VOLTAGE_RANGE_1
:1.8V 以下FLASH_VOLTAGE_RANGE_2
:1.8V~2.1VFLASH_VOLTAGE_RANGE_3
:2.1V~2.7VFLASH_VOLTAGE_RANGE_4
:2.7V~3.6V
- FLASH_EraseInitTypeDef
- SectorError:记录擦除失败的扇区号
2.3 FALSH开关锁
擦写数据之前要进行开关锁操作
1 | HAL_StatusTypeDef HAL_FLASH_Unlock(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 | HAL_StatusTypeDef HAL_FLASH_OB_Unlock(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 1FLASH_BANK_2
:操作 Bank 2FLASH_BANK_BOTH
:操作 Bank 12
RDPLevel:读保护级别
OB_RDP_LEVEL_0
:无保护OB_RDP_LEVEL_1
:启用保护OB_RDP_LEVEL_2
:永久保护(不可逆!)
BORLevel:电压跌落复位阈值
USERConfig:用户配置
2.7 应用已修改的选项字节
1 | 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); |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 The personal blog of DWen_666!