STM32 FLASH error: FLASH_FLAG_PGPERR & FLASH_FLAG_PGSERR

这篇具有很好参考价值的文章主要介绍了STM32 FLASH error: FLASH_FLAG_PGPERR & FLASH_FLAG_PGSERR。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0. 简介

在STM32F429 上用FLASH 模拟 EEPROM,工程是STM32CubeIDE里面创建和生成的。调试时发现第一次写FLASH时总是出错,第二次及之后再写FLASH则没问题。

1. 问题原因

写FLASH之前会擦除FLASH Sector,第一次擦除时出错。进一步跟踪,发现是调用FLASH_WaitForLastOperation 时返回错误。以下是HAL库里FLASH_WaitForLastOperation的源码。

HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout)
{ 
  uint32_t tickstart = 0U;
  
  /* Clear Error Code */
  pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
  
  /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset.
     Even if the FLASH operation fails, the BUSY flag will be reset and an error
     flag will be set */
  /* Get tick */
  tickstart = HAL_GetTick();

  while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) != RESET) 
  { 
    if(Timeout != HAL_MAX_DELAY)
    {
      if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout))
      {
        return HAL_TIMEOUT;
      }
    } 
  }

  /* Check FLASH End of Operation flag  */
  if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET)
  {
    /* Clear FLASH End of Operation pending bit */
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
  }
#if defined(FLASH_SR_RDERR)  
  if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \
                           FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET)
#else
  if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \
                           FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET)  // **这里出错**
#endif /* FLASH_SR_RDERR */
  {
    /*Save the error code*/
    FLASH_SetErrorCode();
    return HAL_ERROR;
  }

  /* If there is no error flag set */
  return HAL_OK;
  
}  

发现在__HAL_FLASH_GET_FLAG 时, FLASH_FLAG_PGPERR 和 FLASH_FLAG_PGSERR置位了。所以会返回擦除失败。
但是 FLASH_SetErrorCode 里又会reset 这两位,所以第二次擦除成功。

2. FLASH_FLAG_PGPERR & FLASH_FLAG_PGSERR 错误含义

在查看STM32F4参考手册发现:
FLASH_FLAG_PGSERR : Programming sequence error
FLASH_FLAG_PGPERR : Programming parallelism error
flash_waitforlastoperation错误,stm32
flash_waitforlastoperation错误,stm32
原因可能是 FLASH->CR 里的 PSIZE设置错误。

3. Debug

3.1 上电debug 查找 FLASH->SR何时被置位

flash_waitforlastoperation错误,stm32
发现在上电后初始化时钟时, 即执行到 HAL_Init();,FLASH->SR 的 bit6&7 就会被置位,而到此时,执行的都是 cubemx自动生成的 HAL库代码。

3.2 追踪FLASH->CR

flash_waitforlastoperation错误,stm32
上电之后, FLASH->CR只有bit31置位,其他均为0.查看FLASH->CR寄存器说明
flash_waitforlastoperation错误,stm32
flash_waitforlastoperation错误,stm32
PSIZE = 0 时对应的是8位, 而STM32F429是32位,所以应该将 PSIZE设置为 0b10。
设置后继续debug
flash_waitforlastoperation错误,stm32
FLASH->SR bit6 的错误没了,但 bit7错误 Programming sequence error 还在。
PGSERR: Programming sequence error
Set by hardware when a write access to the Flash memory is performed by the code while the
control register has not been correctly configured.

FLASH->CR配置不正确,查看下来只有 CR 的 bit0 有可能。

3.3 问题解决

将 FLASH->CR bit0 置1.
flash_waitforlastoperation错误,stm32
以上,在初始化时,正确配置 FLASH->CR的 PSIZE 和 PG,则消除 FLASH->SR的 bit6&7 错误。

注:上述未经过稳定性测试。文章来源地址https://www.toymoban.com/news/detail-766113.html

到了这里,关于STM32 FLASH error: FLASH_FLAG_PGPERR & FLASH_FLAG_PGSERR的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • STM32内部Flash

    STM32内部Flash

    目录 一、内部Flash简介 二、内部Flash构成 1. 主存储器 2. 系统存储区 3. 选项字节 三、内部Flash写入过程 1. 解锁 2. 页擦除 3. 写入数据 四、工程空间分布 某工程的ROM存储器分布映像: 1. 程序ROM的加载与执行空间 2. ROM空间分布表         STM32芯片内部有一个Flash存储器,主要

    2024年02月19日
    浏览(12)
  • STM32笔记 Flash

    STM32笔记 Flash

    笔记来源于江科协议的视频 芯片采用与stm32F103C8T6 •STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程,系统存储器里面存储的是BootLoader,是不允许修改的。 •读写FLASH的用途: 利

    2024年01月18日
    浏览(9)
  • STM32CubeMX学习笔记16--- STM32内部FLASH

    STM32CubeMX学习笔记16--- STM32内部FLASH

    1. 内部FLASH简介         之前的文章中介绍过STM32F1利用SPI与外部FLASH(W25QXX芯片)通讯的例程,本例程将介绍STM32F1的内部FLASH,通过内部FLASH实现数据读写操作。 不同型号的STM32,其FLASH容量也有所不同,最小的只有16K字节,最大的则达到了1024K字节。此处我们使用的是ST

    2024年04月09日
    浏览(16)
  • STM32 FLASH 读写数据

    STM32 FLASH 读写数据

    2.1 修改代码后编译,会有提示信息 KEIL,计算出来代码总共 61076 Byte 2.2 如果什么都没有改,直接编译是没有这个提示信息的 0x08000000 是存放代码的起始地址,我们保存的数据要和代码分开,放在代码区域后面,所以后面加了个80000, 比keil 编译里面算出来的和要大将近2 万个

    2024年02月12日
    浏览(9)
  • STM32 Flash学习(二)

    STM32F1的官方固件库操作FLASH的几个常用函数。这些函数和定义分布在源文件stm32f1xx_hal_flash.c/stm32f1xx_hal_flash_ex.c以及头文件stm32f1xx_hal_flash.h/stm32f1xx_hal_flash_ex.h中。 对FLASH进行写操作前必须先解锁,解锁操作:在FLASH_KEYR写入特定的序列(KEY1和KEY2),HAL库实现很简单: 写操作完

    2024年02月19日
    浏览(6)
  • STM32—Flash读写详解

    STM32—Flash读写详解

    目录 前言 介绍 STM32 FLASH 闪存的编程和擦除 Flash读写的标准库函数 软件设计 FLASH的读取 直接读取某一地址的内容 读取选定位置的选定大小的内容 FLASH的写入 直接使用标准库写入 写入选定位置的选定大小的内容 如何在Keil 5中查看Flash某地址的内容 本文主要介绍STM32多种的内

    2024年02月09日
    浏览(28)
  • FLASH_STM32

    FLASH_STM32

    STM32F1系列的FLASH包含 程序存储器、系统存储器和选项字节 三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程。 程序存储器(主存储器):存储程序代码;起始地址:0x0800 0000 系统存储器:存储Bootloader,用于串口下载;起始地址:0x1FFF F

    2024年02月22日
    浏览(11)
  • stm32读写内部Flash

    stm32读写内部Flash

    因为我的stm32f407的内部flash是1M的所以块2不存在,但他的地址仍然存在,只是没有作用,这是stm32的整体框架。    一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域,它是存储用户应用程序的空间,芯片型号说明中的 1M FLASH、2M FLASH 都是指这个区域的大小。 主存储

    2024年02月01日
    浏览(11)
  • STM32的FLASH操作

    STM32的FLASH操作

    时间记录:2024/2/19 (1)flash大小64K,地址0x08000000-0x08010000 (2)此芯片内存大小属于中容量产品,根据数据手册可知中容量产品一个扇区的大小为1K (3)我们在这里需要知道的点就是,可以将数据保存在flash中实现掉电保存 (1)写数据操作(一种方法) 1.解除写保护,向K

    2024年02月21日
    浏览(7)
  • (39)STM32——FLASH闪存

    (39)STM32——FLASH闪存

    目录 学习目标 成果展示  介绍 组成 主存储器 系统存储器 OTP 区域 选项字节 读取  编程 寄存器 步骤 擦除 扇区擦除 批量擦除 寄存器 代码  总结          本节我们要来介绍一下关于FLASH闪存的知识,也是有关存储部分的知识,和之前学的EEPROM类似。FLASH结合了ROM和RAM的

    2024年02月08日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包