硬汉嵌入式论坛

 找回密码
 立即注册
查看: 642|回复: 6
收起左侧

[有问必答] STM32G0B1CB使用片内flash,擦除失败

[复制链接]

38

主题

91

回帖

205

积分

高级会员

积分
205
发表于 2023-7-28 11:59:24 | 显示全部楼层 |阅读模式
STM32G0B1CB使用片内flash,擦除失败,HAL_FLASHEx_Erase返回错误码HAL_ERROR,


    /* Unlock the Flash to enable the flash control register access *************/
    HAL_FLASH_Unlock();
    //__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);

    /* Get the 1st page to erase */
    FirstPage = GetPage(FLASH_USER_START_ADDR);

    /* Get the number of pages to erase from 1st page */
    NbOfPages = GetPage(FLASH_USER_END_ADDR) - FirstPage + 1;

    /* Fill EraseInit structure*/
    EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
    EraseInitStruct.Page        = FirstPage;
    EraseInitStruct.NbPages     = NbOfPages;

    errcode = HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
    if (errcode != HAL_OK)
    {
        return ;
    }

    Address = FLASH_USER_START_ADDR;

    while (Address < FLASH_USER_END_ADDR)
    {
        if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, DATA_64) == HAL_OK)
        {
            Address = Address + 8;
        }
        else
        {
            PageError = 0xEEEEEEEEU;
        }
    }

    /* Lock the Flash to disable the flash control register access (recommended
     to protect the FLASH memory against possible unwanted operation) *********/
    HAL_FLASH_Lock();

回复

使用道具 举报

3

主题

122

回帖

131

积分

初级会员

积分
131
发表于 2023-7-28 13:53:33 | 显示全部楼层
这一句为啥注释掉:__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
在擦除函数之前加这个试试,这个是hal库里扒的

void WaitForLastOperation(void)
{
   while ((FLASH->SR & FLASH_SR_BSY1))
   {
   }
   FLASH->SR = FLASH_SR_CLEAR;
   while ((FLASH->SR & FLASH_SR_CFGBSY) != 0x00U)
   {
   }
}



回复

使用道具 举报

3

主题

122

回帖

131

积分

初级会员

积分
131
发表于 2023-7-28 13:57:09 | 显示全部楼层
取消注释清标志的那句,还有检查擦除页大小
回复

使用道具 举报

38

主题

91

回帖

205

积分

高级会员

积分
205
 楼主| 发表于 2023-7-28 16:29:45 | 显示全部楼层
取消注释清标志,擦除页也没有错,问题依旧,错误码是0xA0;
微信图片_20230728162805.png
微信图片_20230728162902.png
回复

使用道具 举报

38

主题

91

回帖

205

积分

高级会员

积分
205
 楼主| 发表于 2023-7-28 16:38:26 | 显示全部楼层
这个函数入口增加如下语句有效,这样做可能存在风险。
  /* Clear SR register */
  FLASH->SR = FLASH_SR_CLEAR;
回复

使用道具 举报

22

主题

67

回帖

133

积分

初级会员

积分
133
发表于 2023-10-10 14:30:13 | 显示全部楼层
我也遇到了 我感觉是g0的bug 其他的芯片都没事
回复

使用道具 举报

0

主题

99

回帖

99

积分

初级会员

积分
99
发表于 2023-10-11 09:03:37 | 显示全部楼层
可以参考一下的STM32Cube_FW_G0_V1.6.1\Projects\NUCLEO-G0B1RE\Examples\FLASH\FLASH_EraseProgram\Src\main.c,按这个流程做IAP或保存参数没发现过问题。

  /* Unlock the Flash to enable the flash control register access *************/
  HAL_FLASH_Unlock();

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

  /* Erase the user Flash area
    (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/

  /* Get the 1st page to erase */
  FirstPage = GetPage(FLASH_USER_START_ADDR);

  /* Get the number of pages to erase from 1st page */
  NbOfPages = GetPage(FLASH_USER_END_ADDR) - FirstPage + 1;

  /* Get the bank */
  BankNumber = GetBank(FLASH_USER_START_ADDR);

  /* Fill EraseInit structure*/
  EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
  EraseInitStruct.Banks       = BankNumber;
  EraseInitStruct.Page        = FirstPage;
  EraseInitStruct.NbPages     = NbOfPages;

  /* Note: If an erase operation in Flash memory also concerns data in the data or instruction cache,
     you have to make sure that these data are rewritten before they are accessed during code
     execution. If this cannot be done safely, it is recommended to flush the caches by setting the
     DCRST and ICRST bits in the FLASH_CR register. */
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-1 11:24 , Processed in 0.175556 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表