如何在STM32F4,Cortex M4上写入/读取FLASH
我想写一个变量,例如一个数字为5的整数到FLASH,然后在电源消失后再次打开设备读取它。
我已经知道为了写一些东西,我首先需要擦除页面然后再写。
在手册中它说:
- 在Flash选项密钥寄存器(FLASH_OPTKEYR)中写入OPTKEY1 = 0x0819 2A3B
- 在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]
来读取您的闪存数据。