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->CR 里的 PSIZE设置错误。

3. Debug

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

在这里插入图片描述
发现在上电后初始化时钟时, 即执行到 HAL_Init();,FLASH->SR 的 bit6&7 就会被置位,而到此时,执行的都是 cubemx自动生成的 HAL库代码。

3.2 追踪FLASH->CR

在这里插入图片描述
上电之后, FLASH->CR只有bit31置位,其他均为0.查看FLASH->CR寄存器说明
在这里插入图片描述
在这里插入图片描述
PSIZE = 0 时对应的是8位, 而STM32F429是32位,所以应该将 PSIZE设置为 0b10。
设置后继续debug
在这里插入图片描述
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->CR的 PSIZE 和 PG,则消除 FLASH->SR的 bit6&7 错误。

注:上述未经过稳定性测试。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Preface....................................................................................................................................... 14 1 Introduction ....................................................................................................................... 17 1.1 Overview..................................................................................................................... 18 1.1.1 CPU and Memory ................................................................................................. 21 1.1.2 Clocks and Power Management ................................................................................ 21 1.1.3 Peripherals ......................................................................................................... 21 1.1.4 Radio................................................................................................................ 23 1.2 Applications ................................................................................................................. 23 2 8051 CPU........................................................................................................................... 24 2.1 8051 CPU Introduction .................................................................................................... 25 2.2 Memory ...................................................................................................................... 25 2.2.1 Memory Map ....................................................................................................... 25 2.2.2 CPU Memory Space .............................................................................................. 27 2.2.3 Physical Memory .................................................................................................. 28 2.2.4 XDATA Memory Access.......................................................................................... 33 2.2.5 Memory Arbiter ..............................................

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值