【STM32】嵌入式(片上)Flash的读写(以STM32F407ZGT6为例,HAL库)
一、嵌入式Flash的主要特性以及模块构成
1.主要特性
图源:STM32F4xx中文参考手册 p59
在参考手册中,我们可以了解到,Flash由四部分构成:主存储器块,系统存储器,OTP与选项字节。根据自举模式的选择,可以将程序下载到主存储器块或系统存储器块。
所以,当我们选择主Flash或系统存储器作为自举空间时,程序都会保存到嵌入式Flash中,并在其上运行。
为了提高Flash读取指令的效率,嵌入式Flash提供了自适应实时存储器加速器 (ART Accelerator™)。该加速器通过预读取128位指令的方式,提升程序运行的速度。
图源:STM32F4xx中文参考手册 p62
在CubeMX生成的代码中,HAL_Init已经帮我们实现了这项功能。
2.模块构成
下表展示了嵌入式Flash四个块的空间大小以及地址。(注意,不同型号的嵌入式Flash会有不同。例如,F103型号的嵌入式Flash的读写最小单位是页,总内存是64KB或128KB)
图源:STM32F4xx中文参考手册 p59
当选择主Flash为自举空间时,程序就会下载到主存储器中。然而,主存储器共有1MB的内存,只存储程序会造成空间的浪费。因此,当RAM不够用时,可以将常量存在主存储器中(注意,这里必须是常量,因为只有常量区和代码区才存储在Flash中。有关这部分的内容,可以看我的另一篇文章);也可以将主存储器视为EEPROM,自己向主存储区中读写数据(区别在于EEPROM通过电路结构实现擦除,而读写嵌入式Flash需要自行擦除)。
二、嵌入式Flash的读写函数(HAL库)
1.读写函数涉及到的结构体
/*stm32f4xx_hal_flash_ex.h*/
/*** @brief FLASH Erase structure definition*/
typedef struct
{uint32_t TypeErase; /*!< Mass erase or sector Erase.This parameter can be a value of @ref FLASHEx_Type_Erase */uint32_t Banks; /*!< Select banks to erase when Mass erase is enabled.This parameter must be a value of @ref FLASHEx_Banks */uint32_t Sector; /*!< Initial FLASH sector to erase when Mass erase is disabledThis parameter must be a value of @ref FLASHEx_Sectors */uint32_t NbSectors; /*!< Number of sectors to be erased.This parameter must be a value between 1 and (max number of sectors - value of Initial sector)*/uint32_t VoltageRange;/*!< The device voltage range which defines the erase parallelism