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