c - STM32F411VET6 将数据存储在 R/W 闪存中

标签 c memory stm32

我正在尝试将数据存储在 STM32F411VET6 的闪存中。我希望即使在重新启动 MC 后内存也能存储并保留在那里。我看过this , this , thisthis示例,但我仍然不确定我是否正确地执行了此操作。我能够在内存中创建一个位置(我 checkin 了 map 文件),并将其用作我的分散文件:

LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00060000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  USER_CONFIG 0x08060000 0x0001FFFF  {
   userConfig.o (+RW)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

这适用于我的代码(改编自 this 示例):

__attribute__((__section__("USER_CONFIG"))) const char userValues[64];

void Write_Flash(uint32_t data[], uint8_t flashTypeProgram)
{
  uint8_t addressGap;
  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_7, VOLTAGE_RANGE_3);
  int ii = 0;
  for (ii = 0; ii < 64 / pow(2, flashTypeProgram); ii++)
  {
    addressGap = pow(2, flashTypeProgram) * ii;
    HAL_FLASH_Program(flashTypeProgram, userValues[0] + addressGap, data[ii]);
  }
  HAL_FLASH_Lock();
}

但是每当我构建代码时,我都会收到错误“没有部分与模式 userConfig.o 匹配”。

是否有什么我设置不正确的地方,或者为什么我在某处漏接电话?

最佳答案

Kamil Cuk 的帮助下我得到了解决方案这帮助我解决了一些问题。我在使用分散文件时遇到的问题之一是我的加载和执行地址不相同,导致链接器无法按预期工作(this link 中有很好的解释)。我将 .sct 文件修改为以下内容:

LR_IROM1 0x08000000 0x00060000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00060000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

LR_IROM2 0x08060000 0x00020000 {  ; load region size_region
  USER_CONFIG 0x08060000 0x00020000  {
   *(.user_data)
  }
}

创建附加加载区域的这种实现将导致我的加载地址和异常地址相同。

然后,如果有人也来这里寻求帮助,这是我的闪烁代码:

__attribute__((section(".user_data"))) const char userConfig[64];

[...]

void Write_Flash(uint32_t data[], uint8_t flashTypeProgram)
{
  uint8_t addressGap;
  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_7, VOLTAGE_RANGE_3);
  int ii = 0;
  for (ii = 0; ii < 64 / pow(2, flashTypeProgram); ii++)
  {
    addressGap = pow(2, flashTypeProgram) * ii;
    HAL_FLASH_Program(flashTypeProgram, (uint32_t) &userConfig[0] + addressGap, data[ii]);
  }
  HAL_FLASH_Lock();
}

该程序允许我将数据存储在内部闪存中,即使在硬重启(断开所有电源然后重新连接到主板)后,这些数据仍会保留存储状态。

关于c - STM32F411VET6 将数据存储在 R/W 闪存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54789317/

相关文章:

c - winsock编译错误

bluetooth-lowenergy - 我可以通过信标发送传感器(几个字节)吗?

c - C什么时候创建变量?

在c语言中可以创建一个只有一位的变量吗?

c - udp 套接字中接收缓冲区/队列的最大大小

c# - 报表查看器在使用 X 关闭后静默挂起

Python如何在处理完类对象后释放内存?

c - 如何在不使用 gdb 的情况下找到谁在 c (linux) 中破坏堆栈?

embedded - 与 stm32 接口(interface)的网络摄像头

python - 在没有库的python中自定义crc32计算