首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >(STM32)擦除闪存和写入闪存会导致HAL_FLASH_ERROR_PGP错误(使用HAL)

(STM32)擦除闪存和写入闪存会导致HAL_FLASH_ERROR_PGP错误(使用HAL)
EN

Stack Overflow用户
提问于 2021-06-27 12:12:54
回答 1查看 1.8K关注 0票数 2

试图写入闪存以存储某些配置。我使用的是一个STM32F446ze,其中我想使用最后的16 an扇区作为存储。

当我擦除VOLTAGE_RANGE_3扇区时,我指定了VOLTAGE_RANGE_3映射到:

代码语言:javascript
运行
复制
#define FLASH_VOLTAGE_RANGE_3        0x00000002U  /*!< Device operating range: 2.7V to 3.6V                */

当我使用FLASH_TYPEPROGRAM_WORD写闪存时,我收到了一个错误。错误是HAL_FLASH_ERROR_PGP。阅读参考手册,我读到,这与使用错误的并行/电压级别有关。

从参考手册上我可以读到

此外,在参考手册中,我可以读到:

编程错误:不允许将数据编程到跨越128位行边界的Flash内存中。在这种情况下,不执行写操作,并且在FLASH_SR寄存器中设置程序对齐错误标志(PGAERR)。写访问类型(字节、半字、字或双字)必须对应所选择的并行性类型(x8、x16、x32或x64)。如果不执行,则不执行写入操作,并在FLASH_SR寄存器中设置程序并行错误标志(PGPERR)。

所以我想:

  • 我在电压范围3中擦除了扇区
  • 这给了我2.7到3.6v的规格
  • 这给了我x32并行化的大小
  • 我应该能写单词来闪现。

但是,这一行给了我一个错误(在解锁闪存之后)。

代码语言:javascript
运行
复制
    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)
    {
    }

但是当我开始写字节的时候,它会变的很好。

代码语言:javascript
运行
复制
    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擦除
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-27 12:50:58

这看起来像是一个数据对齐错误,但是--参考手册中提到的与128位闪存行相关的错误。这个词可能只与双字书写有关,与你的情况无关。

如果您想一次编程4个字节,那么您的address需要对齐字,这意味着它需要被4整除。此外,address不是一个uint32_t* (指针),它是一个原始uint32_t,因此address++将它增加1,而不是4。据我所知,Cortex M4核心会将总线上未对齐的访问自动转换为多个较小大小的对齐访问,但这违反了闪存并行规则。

顺便说一句,只要正确对齐,执行字节、半字和字写的混合操作是完全有效的。另外,与F0、F1和F3系列的flash硬件不同,您可以尝试覆盖以前编写的位置,而不会导致错误。0->1位更改被忽略.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68151043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档