如何在STM32F4,Cortex M4上写入/读取FLASH

我想写一个变量,例如一个数字为5的整数到FLASH,然后在电源消失后再次打开设备读取它。

我已经知道为了写一些东西,我首先需要擦除页面然后再写。

在手册中它说:

  1. 在Flash选项密钥寄存器(FLASH_OPTKEYR)中写入OPTKEY1 = 0x0819 2A3B
  2. 在Flash选项密钥寄存器(FLASH_OPTKEYR)中写入OPTKEY2 = 0x4C5D 6E7F

我该如何执行此任务?

扇区0的块地址从0x0800 0000到0x0800 3FFF,这是我想写的地方。

这里是手册的链接,第71页: STM32手册

您可以使用以下代码将数据写入使用HAL库进行闪存。

 void Write_Flash(uint8_t data) { HAL_FLASH_Unlock(); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR ); FLASH_Erase_Sector(FLASH_SECTOR_6, VOLTAGE_RANGE_3); HAL_FLASH_Program(TYPEPROGRAM_WORD, FlashAddress, data); HAL_FLASH_Lock(); } 

您应该更新链接器脚本,如下所示。 在MEMORY添加DATA并在SECTIONS添加.user_data

 MEMORY { RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 320K CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K DATA (rwx) : ORIGIN = 0x08040000, LENGTH = 128k } /* Define output sections */ SECTIONS { .user_data : { . = ALIGN(4); KEEP(*(.user_data)) . = ALIGN(4); } > DATA 

您应该在主代码上添加以下属性,以便在打开电源后读取数据

 __attribute__((__section__(".user_data"))) const char userConfig[64]; 

完成所有这些后,您可以通过调用userConfig[0]来读取您的闪存数据。