在Flash中为用户数据分配内存(STM32F4 HAL)

时间:2015-02-13 16:09:38

标签: microcontroller stm32 stm32f4discovery flash-memory

我正在尝试使用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]

但我得到的结果相同..

1 个答案:

答案 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