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

14

我试图使用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个回答

24

好的,我在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_datasection,我们可以在程序代码中访问它。

最后,在您的.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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接