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

标签 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]

但我得到了相同的结果..

最佳答案

好的,我在 the ST forums 上找到了答案感谢 clive1 .此示例适用于 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.user_data我们可以在程序代码中解决。

最后,在您的 .c 文件中添加:
__attribute__((__section__(".user_data"))) const uint8_t userConfig[64]

这指定我们希望存储 userConfig .user_data 中的变量部分和 const确保 userConfig 的地址保持静态。

现在,要在运行时写入该闪存区域,您可以使用 stm32f4 stdlib 或 HAL 闪存驱动程序。

在您可以写入闪存之前,它必须被删除(所有字节设置为 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();

关于microcontroller - 在 Flash 中为用户数据分配内存 (STM32F4 HAL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28503808/

相关文章:

c - STM32f10x -- ADS1115 -- I2C -- AF 标志始终设置

c - 使用 UART 发送结构

c - union 和结构中的偏移量

linux - 实现 SDIO 接口(interface) SPI 设备

c - STM32F4微 Controller 串行线调试不工作

c - mikroC for ARM 在定义 char 变量时显示错误

c++ - arm-none-eabi-g++ 忽略表达式 stm32f4 中的无效字符 `#'

c - KEIL uVision 4问题

c - 是否可以通过 C 变量而不是使用 GPIO_Pin_N 值读取和/或写入端口?

c - stm32l476v TIM15 CH2 PWM 无法从 cubeMx 工作