microcontroller - 在 Flash的用户数据( STM32F4 HAL ) 中,分配内存

  显示原文与译文双语对照的内容
0 0

我正在尝试使用STM32F405的内部 Flash 来存储在重新引导后保存的一系列用户可以设置字节。

我正在使用:

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 。 Great !

然而,当我重新启动时,再看看这个位置,它不再是 0x42 了。

我在哪里出错了? 我也尝试过:

#pragma location = 0x0800C00 volatile const uint8_t userConfig[64]

但我得到了同样的结果。

时间: 原作者:

0 0

好的,我在的论坛上找到了一个答案,谢谢。 本示例适用于 STM32F405xG 。

首先,我们需要修改链接器脚本文件( 。ld文件) 中的内存布局

修改现有的Flash 并为数据添加新行。 在这里我分配了所有的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,或者 HAL Flash 驱动程序。

在写入 Flash 之前,必须删除( 所有字节设置为 0 xFF ) 库说明,对于某些原因,这些说明没有任何说明。


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();

原作者:
...