好的,我在ST 论坛上找到了答案,感谢clive1
. 此示例适用于 STM32F405xG。
首先我们需要修改链接脚本文件(.ld 文件)中的内存布局
修改现有的 FLASH 并为 DATA 添加一个新行。在这里,我已经分配了所有section 11
.
MEMORY
{
FLASH (RX) : ORIGIN = 0x08000000, LENGTH = 1M-128K
DATA (RWX) : ORIGIN = 0x080E0000, LENGTH = 128k
...
...
}
在源软件网站上编辑链接器文件的手册
在同一个文件中,我们需要添加:
.user_data :
{
. = ALIGN(4);
*(.user_data)
. = ALIGN(4);
} > DATA
这会创建一个我们可以在程序代码中处理的section
调用。.user_data
最后,在您的 .c 文件中添加:
__attribute__((__section__(".user_data"))) const uint8_t userConfig[64]
这指定我们希望将userConfig
变量存储在.user_data
节中并const
确保地址userConfig
保持静态。
现在,要在运行时写入此闪存区域,您可以使用 stm32f4 stdlib 或 HAL 闪存驱动程序。
在你可以写入闪存之前,它必须被擦除(所有字节设置为 0xFF)HAL 库的指令出于某种原因没有说明这样做......
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_11, VOLTAGE_RANGE_3);
HAL_FLASH_Program(TYPEPROGRAM_WORD, &userConfig[index], someData);
HAL_FLASH_Lock();