【问题标题】:Write to STM32 internal flash fails写入 STM32 内部闪存失败
【发布时间】:2021-03-10 13:38:34
【问题描述】:

在我的 stm32 单片机上没有 eeprom。所以,我使用内部闪存来保存一个字节的用户数据,以便在电源循环之间保留它。我正在按照以下方式进行操作,

  1. 在链接描述文件的内存中添加数据部分
MEMORY { 
   RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 8K 
   FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 64K 
   DATA (xrw) : ORIGIN = 0x800F800, LENGTH = 2K //Allocated one full flash page 
}
  1. 创建用户数据部分
    .user_data : 
     { . = ALIGN(4); 
       *(.user_data)
       . = ALIGN(4);
     } >DATA
  1. 创建要存储在闪存中的变量
    attribute((section(".user_data"))) const uint8_t userConfig[10]
  1. 使用以下函数写入数据,
    HAL_FLASH_Unlock();
    
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
    
    FLASH_PageErase(FLASH_PAGE_31);
    
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, (uint32_t)&userConfig[index], someData);
    
    HAL_FLASH_Lock();

当我尝试写入闪存时,它失败并设置了 PGSERR 标志。

【问题讨论】:

  • 哪个stm32都不一样
  • @old_timer 我正在使用 stm32G031K8
  • 格式化您的问题以方便读者阅读。我对其进行了编辑以向您展示一个示例
  • 感谢@P__JsupportswomeninPoland。编辑了我的问题以提高可读性
  • 不要更改问题,因为答案不再有意义。为问题添加一些解释,但不要更改它!

标签: memory stm32 flash-memory


【解决方案1】:
  1. 0x0800 3800 - 0x0800 3FFF 是银行 7 而不是银行 11。

  2. &userConfig[index] 通常是错误的,因为内存是在这个微控制器中以 64 位字编程的,并且地址必须与 8 字节边界对齐。

在对微控制器进行编程之前,请务必阅读文档。使用 ma​​gic 库并不能让您免于了解自己的硬件。

【讨论】:

  • 1.那是一个错字。在问题 2 中更正它。正确的方法是什么?
猜你喜欢
  • 2021-09-23
  • 2021-05-01
  • 2021-09-10
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 2019-04-12
  • 2017-11-07
  • 2020-12-21
相关资源
最近更新 更多