我正在尝试使用STM32F405的内部闪存来存储一堆用户可设置的字节,这些字节在重新启动后仍然存在。
我正在使用:
uint8_t userConfig[64] __attribute__((at(0x0800C000)));
为我想要存储的数据分配内存。
当程序启动时,我检查第一个字节是否设置为0x42
,如果没有,我用它设置:
HAL_FLASH_Unlock();
HAL_FLASH_Program(TYPEPROGRAM_BYTE, &userConfig[0], 0x42);
HAL_FLASH_Lock();
之后我检查userConfig[0]
中的值,然后看到0x42
......很棒!
然而,当我点击重置时,再次查看该位置,它不再是0x42
...
知道我哪里出错了吗?我也试过了:
#pragma location = 0x0800C00
volatile const uint8_t userConfig[64]
但我得到的结果相同..
答案 0 :(得分:20)
好的,由于clive1
,我在the ST forums找到了答案。此示例适用于STM32F405xG。
首先,我们需要修改链接描述文件(.ld文件)中的内存布局
修改现有FLASH并为DATA添加新行。在这里,我已经分配了所有section 11
。
MEMORY
{
FLASH (RX) : ORIGIN = 0x08000000, LENGTH = 1M-128K
DATA (RWX) : ORIGIN = 0x080E0000, LENGTH = 128k
...
...
}
Manual for editing linker files on the sourceware website
在同一个文件中,我们需要添加:
.user_data :
{
. = ALIGN(4);
*(.user_data)
. = ALIGN(4);
} > DATA
这会创建一个名为section
的{{1}},我们可以在程序代码中解决这个问题。
最后,在你的.c文件中添加:
.user_data
这指定我们希望将__attribute__((__section__(".user_data"))) const uint8_t userConfig[64]
变量存储在userConfig
部分中,并.user_data
确保const
的地址保持静态。
现在,要在运行时写入闪存的这个区域,可以使用stm32f4 stdlib或HAL闪存驱动程序。
在写入闪存之前,必须将其擦除(所有字节都设置为0xFF)HAL库的说明由于某种原因而没有说明这一点......
userConfig