1. STM32内部FLASH基础认知
在嵌入式开发中,FLASH存储器扮演着关键角色。与RAM不同,FLASH属于非易失性存储器,断电后数据不会丢失。STM32系列微控制器内部集成了FLASH模块,开发者可以直接通过程序对其进行读写操作,这为参数存储、固件升级等场景提供了便利。
STM32的FLASH存储器通常分为主存储区和信息块。主存储区用于存放用户程序代码,信息块则包含选项字节和系统存储器。以STM32F103系列为例,其FLASH容量从16KB到512KB不等,页大小一般为1KB或2KB。不同型号的STM32,其FLASH结构和参数可能有所差异,在使用前务必查阅对应型号的参考手册。
重要提示:对FLASH进行写操作前,必须确保目标地址处于擦除状态。FLASH只能将1写成0,不能将0写成1,这是由其物理特性决定的。
FLASH的编程和擦除操作通过特定的寄存器接口完成。STM32提供了标准外设库、HAL库以及LL库等多种方式来操作FLASH。无论使用哪种方式,都需要遵循严格的时序要求,并处理好中断和总线冲突等问题。
2. FLASH操作前的准备工作
2.1 硬件连接与调试工具
在进行FLASH操作前,需要确保硬件连接正确。如果使用ST-Link调试器,应正确连接SWD或JTAG接口。ST-Link Utility工具可以方便地进行FLASH的读写和擦除操作,但本文主要关注通过代码实现这些功能。
2.2 开发环境配置
以Keil MDK开发环境为例,需要正确配置目标芯片型号和FLASH算法。在Options for Target -> Target选项卡中,确保选择了正确的芯片型号。在Debug选项卡中,选择正确的调试器并勾选"Reset and Run"选项,这样在下载程序后会自动复位运行。
2.3 关键宏定义与地址确定
在代码中,我们需要定义一些关键参数:
c复制#define FLASH_PAGE_SIZE ((uint16_t)0x400) // 1KB页大小
#define FLASH_USER_START_ADDR ((uint32_t)0x0800F000) // 用户数据起始地址
#define FLASH_USER_END_ADDR ((uint32_t)0x0800FFFF) // 用户数据结束地址
选择FLASH操作地址时,必须避开程序代码区域。通常建议从芯片FLASH的末尾开始向前使用,这样可以避免与应用程序代码冲突。具体可用地址范围需要参考芯片手册。
3. FLASH的擦除操作详解
3.1 扇区擦除与整片擦除
STM32的FLASH擦除操作可以分为扇区擦除和整片擦除两种方式。扇区擦除针对特定区域,而整片擦除则会清除整个FLASH内容(包括程序代码)。
以下是扇区擦除的典型代码实现:
c复制FLASH_Status FLASH_ErasePage(uint32_t Page_A
