gpt4 book ai didi

embedded - (STM32) 删除闪存并写入闪存会导致 HAL_FLASH_ERROR_PGP 错误(使用 HAL)

转载 作者:行者123 更新时间:2023-12-04 07:27:15 26 4
gpt4 key购买 nike

尝试写入闪存以存储一些配置。我正在使用 STM32F446ze我想使用最后一个 16kb 扇区作为存储。
我指定了 VOLTAGE_RANGE_3当我已删除 我的部门。 VOLTAGE_RANGE_3映射到:

#define FLASH_VOLTAGE_RANGE_3        0x00000002U  /*!< Device operating range: 2.7V to 3.6V                */
使用 FLASH_TYPEPROGRAM_WORD 写入闪存时出现错误.错误是 HAL_FLASH_ERROR_PGP .阅读引用手册我读到这与使用错误的并行度/电压电平有关。
从引用手册我可以阅读
enter image description here
此外,在引用手册中,我可以阅读:

Programming errors


It is not allowed to program data to the Flashmemory that would cross the 128-bit row boundary. In such a case, thewrite operation is not performed and a program alignment error flag(PGAERR) is set in the FLASH_SR register. The write access type (byte,half-word, word or double word) must correspond to the type ofparallelism chosen (x8, x16, x32 or x64). If not, the write operationis not performed and a program parallelism error flag (PGPERR) is setin the FLASH_SR register


所以我认为:
  • 我删除了电压范围 3
  • 中的扇区
  • 这给了我 2.7 到 3.6v 的规范
  • 这给了我 x32 并行大小
  • 我应该能够将 WORD 写入闪存。

  • 但是,这一行给了我一个错误(解锁闪光灯后)
        uint32_t sizeOfStorageType = ....; // Some uint I want to write to flash as test

    HAL_StatusTypeDef flashStatus = HAL_FLASH_Program(TYPEPROGRAM_WORD, address++, (uint64_t) sizeOfStorageType);
    auto err= HAL_FLASH_GetError(); // err == 4 == HAL_FLASH_ERROR_PGP: FLASH Programming Parallelism error flag

    while (flashStatus != HAL_OK)
    {
    }
    但是当我开始写字节时,一切顺利。
        uint8_t *arr = (uint8_t*) &sizeOfStorageType;
    HAL_StatusTypeDef flashStatus;
    for (uint8_t i=0; i<4; i++)
    {
    flashStatus = HAL_FLASH_Program(TYPEPROGRAM_BYTE, address++, (uint64_t) *(arr+i));
    while (flashStatus != HAL_OK)
    {
    }
    }
    我的问题:
  • 我是否正确理解删除扇区后,我可以只有写一篇 TYPEPROGRAM ?因此,删除后我可以 只有写字节、或、半字、或、字、或双字?
  • 在上述上下文中我错过了什么/做错了什么。为什么我只能写字节,而我用VOLTAGE_RANGE_3删除?
  • 最佳答案

    这看起来像是数据对齐错误,但 不是 与引用手册中提到的 128 位闪存行相关的一个。那一个可能仅与双字写入有关,与您的情况无关。
    如果你想一次编程 4 个字节,你的 address需要字对齐,这意味着它需要被 4 整除。此外,address不是 uint32_t* (指针),这是一个原始 uint32_t所以address++将其增加 1,而不是 4。据我所知,Cortex M4 内核会自动将总线上的未对齐访问转换为多个较小大小的对齐访问,但这违反了闪存并行规则。
    顺便说一句,只要正确对齐,执行字节、半字和字写入的混合是完全有效的。此外,与 F0、F1 和 F3 系列的闪存硬件不同,您可以尝试覆盖先前写入的位置而不会导致错误。 0->1 位更改将被忽略。

    关于embedded - (STM32) 删除闪存并写入闪存会导致 HAL_FLASH_ERROR_PGP 错误(使用 HAL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68151043/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com