STM32 读写内部 Flash 的详细过程:
一、STM32 内部 Flash 的基础知识
- 存储结构
- STM32 的内部 Flash 通常被划分为多个扇区,不同型号的 STM32 芯片其 Flash 的容量和扇区大小各不相同。例如,STM32F103 系列的某些型号可能具有 128KB 或 256KB 的 Flash,扇区大小通常为 1KB 或 2KB 等。
- 地址范围
- 内部 Flash 有其固定的地址范围,编程时需要根据芯片的数据手册来确定具体的地址范围。比如,STM32F103 系列的内部 Flash 起始地址通常为 0x08000000。
二、编程前的准备工作
- 开启相关时钟
- 在操作内部 Flash 之前,需要确保 Flash 接口时钟已经开启。对于 STM32F103 系列,可以通过设置 RCC 寄存器来开启。例如:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_FLASH, ENABLE);
三、写入数据到内部 Flash
- 解锁 Flash
- 为了防止误操作,STM32 在对 Flash 进行写入操作之前需要先解锁。解锁操作通常需要按照特定的顺序向 FLASH_KEYR 寄存器写入两个特定的值。例如:
FLASH_Unlock();
- 擦除扇区
- Flash 的写入操作只能将数据从 1 变为 0,而不能从 0 变为 1。因此,在写入新数据之前,如果扇区内有需要从 0 变为 1 的数据,就需要先对整个扇区进行擦除操作。擦除操作是按照扇区进行的,并且需要检查擦除操作是否完成。例如:
FLASH_ErasePage(Page_Address);
while (FLASH_GetStatus()!= FLASH_COMPLETE);
其中Page_Address
是要擦除的扇区的起始地址。
- 写入数据
- 擦除完成后,可以开始写入数据。写入操作是通过将数据按字(32 位)写入指定的 Flash 地址来实现的,并且需要检查写入操作是否完成。例如:
*(__IO uint32_t*)Address = Data;
while (FLASH_GetStatus()!= FLASH_COMPLETE);
其中Address
是写入数据的目标地址,Data
是要写入的 32 位数据。
- 锁定 Flash
- 写入操作完成后,为了保证数据的安全性,需要对 Flash 进行锁定。例如:
FLASH_Lock();
四、从内部 Flash 读取数据
- 直接读取
- 从内部 Flash 读取数据相对简单,只需要直接从指定的 Flash 地址读取数据即可。由于 Flash 是按字(32 位)进行读取的,因此需要根据数据的存储方式和地址对齐要求进行相应的处理。例如,如果要读取一个字节的数据,可以先按字读取,然后再进行字节提取。
uint32_t dataRead = *(__IO uint32_t*)readAddress;
其中readAddress
是读取数据的起始地址。