引言
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存储器的读写、擦除和保护机制有所帮助。如有任何问题或意见,请随时留言。谢谢!
本文来自极简博客,作者:网络安全侦探,转载请注明原文链接:STM32的Flash存储器:读写、擦除与保护机制