GD32F450ZGT6 擦写Flash bank1 sector11失败

[复制链接]
2966|4
 楼主| sanbeicha 发表于 2023-5-23 11:27 | 显示全部楼层 |阅读模式
如题所述,在使用GD32450Z-EVAL开发板时,应用程序需要擦除Flash bank1,调试发现调用固件fmc_sector_erase返回擦除成功,实际查看Flash空间并未擦除成功,擦除接口代码如下:

        fmc_unlock();
        for (sectorIdx = first_sector; sectorIdx <= last_sector; sectorIdx++)
        {       
            if(fmc_sector_erase(CTL_SN(sectorIdx)) != FMC_READY)
            {
                result = BLT_FALSE;
                break;
            }
        }
        fmc_lock();

请问这个问题该怎么解决呢?
 楼主| sanbeicha 发表于 2023-5-23 14:19 | 显示全部楼层
自己答复一下,原因是bank1的sector12,用CTL_SN转换为实际地址错误,正确配置应该如下:
/* erase all sectors one by one */
for (sectorIdx = first_sector; sectorIdx <= last_sector; sectorIdx++)
{       
       if((sectorIdx >= 12)&&(sectorIdx <= 23))
        {
              eraseIdx = sectorIdx + 4;
        }
        else if((sectorIdx >= 24)&&(sectorIdx <= 27))
        {
              eraseIdx = sectorIdx - 12;
        }
            
        if(fmc_sector_erase(CTL_SN(eraseIdx)) != FMC_READY)
        {
              /* could not perform erase operation */
              result = BLT_FALSE;

               /* error detected so don't bother continuing with the loop */
               break;
        }
  }   
caizhiwei 发表于 2023-6-18 11:28 | 显示全部楼层
看看我写的接口,暂时没发现问题:
  1. /*!
  2.     \brief      连续擦除多个扇区
  3.     \param[in]  sec_num 起始扇区号( FLASH_Sector_0 ~ FLASH_Sector_23)
  4.     \param[in]  sec_count 扇区数量
  5.     \retval     none
  6. */
  7. ErrStatus BSP_fmc_erase_sectors(uint32_t sec_num, int sec_count)
  8. {
  9.         uint8_t index = 0;
  10.         fmc_unlock();
  11.         /* clear pending flags */
  12.         fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_OPERR | FMC_FLAG_WPERR\
  13.                                    | FMC_FLAG_PGMERR | FMC_FLAG_PGSERR);
  14.         index = Fmc_get_Sector_index( sec_num );

  15.         for(int i = 0; i < sec_count; i++)
  16.         {
  17.                 fmc_sector_erase(CTL_SN(index + i));
  18.                 //printf("Erase sector index = %d!\r\n", (index+i));
  19.         }
  20.         /* lock the flash program erase controller */
  21.         fmc_lock();
  22.     return SUCCESS;
  23. }

评论

for (sector_num = 0; sector_num < 5; sector_num++) { ram_fmc_state = ram_fmc_sector_erase(CTL_SN(sector_num)); fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_OPERR | FMC_FLAG_WPERR | FMC_FLAG_PGMERR | FMC_FLAG_PGSERR); if(ram_fmc_state!=FMC_  发表于 2023-10-9 11:35
LLGTR 发表于 2023-6-21 15:31 | 显示全部楼层
sanbeicha 发表于 2023-5-23 14:19
自己答复一下,原因是bank1的sector12,用CTL_SN转换为实际地址错误,正确配置应该如下:
/* erase all se ...

为啥转换后地址会错误?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部