【问题标题】:STM32 - writing and reading flashSTM32——读写闪存
【发布时间】:2021-09-23 18:49:57
【问题描述】:

谁能告诉我我做错了什么愚蠢的事情或理解?作为测试,我正在尝试将一个简单的数字写入闪存并检索它。成功后,我会将其扩展为 6 个有符号值。 我的设备是STM32L476RG

uint64_t data = 88;
Erase_Flash();
HAL_FLASH_Unlock();

Address = ADDR_FLASH_PAGE_256;
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FAST, Address, data) != HAL_OK)
    serprintf("Error writing flash.");

HAL_FLASH_Lock();
uint8_t *flash_biases = (uint8_t*) (ADDR_FLASH_PAGE_256);

根据我所阅读的内容,我应该能够像我一样访问闪存。但它没有检索到我期望的值。

Erase_Flash() 函数如下所示:

void Erase_Flash() {
    HAL_FLASH_Unlock();
    /* Clear OPTVERR bit set on virgin samples */
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);

    /* Fill EraseInit structure*/
    EraseInitStruct.TypeErase = FLASH_TYPEERASE_MASSERASE;
    EraseInitStruct.Banks = FLASH_BANK_2;

    if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK) {
        serprintf("Error erasing flash.");
    }
    HAL_FLASH_Lock();
}

【问题讨论】:

  • 您的设备的确切型号是什么?
  • 你能发帖Erase_Flash()吗? Addressuint32_t 类型吗?在调用 HAL_FLASH_Program() 之前,Address 的字节值是多少(应该是 0xFF)?闪存扇区是否受到读/写保护(检查选项字节)?闪存扇区真的没有使用吗(检查链接描述文件)?
  • @rel 已发布!闪存部分未使用。同事编写的另一段代码在该值下运行良好。
  • @Tagli stm32L476RG,并经过编辑以反映它
  • 就像@Tagli 已经在下面的答案中指出的那样,您可以使用FLASH_Program_DoubleWord()HAL_FLASH_Program()FLASH_TYPEPROGRAM_DOUBLEWORD,检查:github.com/STMicroelectronics/STM32CubeL4/blob/master/Drivers/…。在快速编程模式下HAL_FLASH_Program() 将第三个参数解释为指针!相当混乱。并非所有 STM32 变体都提供快速编程...另请参阅:RM0351 参考手册中的3.3.7 Flash main memory programming sequences

标签: c stm32 flash-memory


【解决方案1】:

FLASH_TYPEPROGRAM_FAST 模式用于一次写入 32 个双字,使用此模式时,第三个参数 (data) 成为该 32 个双字数据源的原始起始地址,而不是数据本身。

目前,您的代码从 0x88 开始的地址获取数据并将其(总共 256 个字节)写入闪存。地址 0x88 上似乎有 245。

您需要使用FLASH_TYPEPROGRAM_DOUBLEWORD 写入uint64_t 数据。

【讨论】:

  • 好的,谢谢!这就说得通了。我会调查的!
猜你喜欢
  • 2021-03-10
  • 2019-03-17
  • 2020-01-30
  • 2016-02-26
  • 2021-09-10
  • 2020-12-21
  • 2019-06-06
  • 1970-01-01
  • 2019-01-29
相关资源
最近更新 更多