打印

GD32F450ZGT6 擦写Flash bank1 sector11失败

[复制链接]
2256|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 | 只看该作者
看看我写的接口,暂时没发现问题:
/*!
    \brief      连续擦除多个扇区
    \param[in]  sec_num 起始扇区号( FLASH_Sector_0 ~ FLASH_Sector_23)
    \param[in]  sec_count 扇区数量
    \retval     none
*/
ErrStatus BSP_fmc_erase_sectors(uint32_t sec_num, int sec_count)
{
        uint8_t index = 0;
        fmc_unlock();
        /* clear pending flags */
        fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_OPERR | FMC_FLAG_WPERR\
                                   | FMC_FLAG_PGMERR | FMC_FLAG_PGSERR);
        index = Fmc_get_Sector_index( sec_num );

        for(int i = 0; i < sec_count; i++)
        {
                fmc_sector_erase(CTL_SN(index + i));
                //printf("Erase sector index = %d!\r\n", (index+i));
        }
        /* lock the flash program erase controller */
        fmc_lock();
    return SUCCESS;
}

使用特权

评论回复
评论
wangkl11 2023-10-9 11:35 回复TA
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_READY) { while(1); } } 我这个连续擦除扇区 擦除第二个扇区后死机了 返回值正常 能帮分析一下么 大佬 
地板
LLGTR| | 2023-6-21 15:31 | 只看该作者
sanbeicha 发表于 2023-5-23 14:19
自己答复一下,原因是bank1的sector12,用CTL_SN转换为实际地址错误,正确配置应该如下:
/* erase all se ...

为啥转换后地址会错误?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝