STM32的Flash存储器:读写、擦除与保护机制

网络安全侦探 2019-03-28 ⋅ 18 阅读

STM32

引言

STM32是一系列由STMicroelectronics开发的32位单片机(MCU)系列芯片。这些芯片中的一项重要功能是Flash存储器,用于存储程序代码和数据。本文将介绍STM32的Flash存储器的读写、擦除和保护机制。

Flash存储器的基本原理

Flash存储器是一种非易失性存储器,可以在断电情况下保持存储的数据。STM32的Flash存储器由多个扇区组成,每个扇区的大小可以根据具体的芯片型号而有所不同。每个扇区又由多个存储单元(或称页)组成,每个存储单元的大小通常为2KB或4KB。

读写Flash存储器

读取Flash存储器中的数据很简单,只需将数据所在的地址作为指针来访问即可。例如,以下代码将Flash存储器中地址为0x08010000的存储单元的数据读取到变量data中:

uint32_t *flash_address = (uint32_t *)0x08010000;
uint32_t data = *flash_address;

写入数据到Flash存储器稍微复杂一些。首先,需要把存储单元的写保护位(WRP)清零以允许写操作。然后,必须对要写入的数据进行擦除操作,将存储单元的内容擦除为全1。最后,才能将新数据写入存储单元。

以下是将数据0x12345678写入地址为0x08010000的存储单元的示例代码:

FLASH->CR |= FLASH_CR_PG;  // 开启Flash编程

while(FLASH->SR & FLASH_SR_BSY);  // 等待Flash空闲

*(volatile uint32_t *)0x08010000 = 0;  // 清零存储单元的写保护位

FLASH->CR |= FLASH_CR_PER;  // 设置Flash为擦除模式
FLASH->AR = 0x08010000;  // 设置要擦除的存储单元地址
FLASH->CR |= FLASH_CR_STRT;  // 开始擦除

while(FLASH->SR & FLASH_SR_BSY);  // 等待Flash擦除完成

FLASH->CR &= ~FLASH_CR_PER;  // 关闭Flash擦除模式

FLASH->CR |= FLASH_CR_PG;  // 再次开启Flash编程

*(volatile uint32_t *)0x08010000 = 0x12345678;  // 写入数据

while(FLASH->SR & FLASH_SR_BSY);  // 等待Flash写入完成

FLASH->CR &= ~FLASH_CR_PG;  // 关闭Flash编程

扇区擦除

通过上面的示例代码,我们可以看到写入数据之前需要对存储单元进行擦除。但是,如果需要擦除一个扇区(例如,擦除8KB的存储空间),那么就可以使用扇区擦除操作。扇区擦除操作将会擦除整个扇区,因此在执行扇区擦除之前,所有要保存的数据必须提前备份。

以下是擦除存储器地址范围为0x08010000-0x0801FFFF的扇区的示例代码:

FLASH_EraseInitTypeDef erase;
erase.TypeErase = FLASH_TYPEERASE_SECTORS;
erase.Sector = FLASH_SECTOR_4;  // 第5个扇区
erase.NbSectors = 1;
erase.VoltageRange = FLASH_VOLTAGE_RANGE_3;

uint32_t page_error = 0;
HAL_FLASHEx_Erase(&erase, &page_error);

Flash存储器保护机制

为了防止误擦除和未经授权的写入Flash存储器,STM32芯片提供了一个保护机制。通过设置相应的Flash操作使能位(OPTCR)和写保护位(WRP),可以实现对Flash存储器的保护。

例如,以下代码将启用Flash存储器的读保护和写保护:

FLASH->OPTKEYR = 0x08192A3B;
FLASH->OPTCR |= FLASH_OPTCR_RDP;  // 使能读保护
FLASH->OPTCR |= 0xA5;  // 设置写保护(例如,第8到第15个页进行写保护)

要注意的是,一旦写入了写保护位,将不能再对写保护位进行修改。因此,在设置写保护之前,请确保已正确设置了保护范围。

结论

STM32的Flash存储器是一种非易失性存储器,用于存储程序代码和数据。通过简单的读取和复杂的写入操作,可以对存储单元进行读写操作。此外,扇区擦除操作可以擦除扇区中的所有存储单元。最后,通过设置Flash操作使能位和写保护位,可以实现Flash存储器的保护。

希望本文对您理解STM32的Flash存储器的读写、擦除和保护机制有所帮助。如有任何问题或意见,请随时留言。谢谢!


全部评论: 0

    我有话说: