请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32g473 flash擦除失败

[复制链接]
aglinux 提问时间:2022-7-28 19:08 / 未解决
在跑ucosii的时候进行OTA升级擦除失败,关掉系统调度可以擦除成功。单独建立一个裸机工程,跑page擦除程序,Jlink单步调试概率性出现擦除失败,上电一直跑可以擦除成功。这是芯片的限制么,还是flash在擦除的时候有需要注意的点没有注意到。

单步调试有时一进入HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError),就会引起SR寄存器报下面的错误:
      PGSERR:编程顺序错误
  SIZERR:尺寸错误
  PGAERR:编程对齐错误
感觉这些不是导致错误出现的主因,而是别的错误发生了从而置位了SR寄存器。下面贴一下我的初始化代码
  while(status != HAL_OK)
  {
    status = HAL_FLASH_Unlock();
  }

  /* Clear OPTVERR bit set on virgin samples */
  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);

  while(addr + offset < addr + len)
  {
    bank = GetBank(addr + offset);
    EraseInitStruct.Banks = bank;
    EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
    EraseInitStruct.Page = GetPage(addr + offset);
    //EraseInitStruct.Page = (addr + offset)/FLASH_PAGE_SIZE;
    EraseInitStruct.NbPages = 1;
    offset += FLASH_PAGE_SIZE;
    status = HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError);
    if (status != HAL_OK)
    {
      printf("flash erase fail, addr:0x%x, len:0x%x, errpage:%d, errcode:%d, ret:%d\r\n", \
                addr, len, PAGEError, pFlash.ErrorCode, status);
      ret = -1;
      goto lock;
    }
  }


这段代码就是单步调试会返回错误的程序了,返回的错误就是上述的PGSERRSIZERRPGAERR。个人仔细检查了初始化参数,应该是没有问题的。而且工程中并没有看门狗操作,一开始觉得有可能是在flash未解锁情况下操作了flash,后续测试也是排除了这个可能。希望有经验的大哥可以解答一下小弟的困惑。


收藏 1 评论4 发布时间:2022-7-28 19:08

举报

4个回答
butterflyspring 回答时间:2022-7-29 11:34:56
通常擦除和写入时只要连续运行结果正确都不去调试它。 因为如果正在擦除时,单步调试相当于去访问同一总线地址,此时会影响总线工作,因而造成烧录错误。而这类芯片的擦除需要一次性连续固定数量的完成。
aglinux 回答时间:2022-7-29 14:48:02
butterflyspring 发表于 2022-7-29 11:34
通常擦除和写入时只要连续运行结果正确都不去调试它。 因为如果正在擦除时,单步调试相当于去访问同一总线 ...


好的,感谢解答,关于这个问题现在重定位向量表和程序到sram空间,如果不能复现那大概率就是这个问题了
aglinux 回答时间:7 天前

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版