问答

汇集网友智慧,解决技术难题

21ic问答首页 - GD32F450ZGT6 擦写Flash bank1 sector11失败

嵌入式 国产芯片

GD32F450ZGT6 擦写Flash bank1 sector11失败

sanbeicha2023-05-23
如题所述,在使用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();

请问这个问题该怎么解决呢?
回答 +关注 14
2185人浏览 3人回答问题 分享 举报
3 个回答
  • sanbeicha 发表于 2023-5-23 14:19
    自己答复一下,原因是bank1的sector12,用CTL_SN转换为实际地址错误,正确配置应该如下:
    /* erase all se ...

    为啥转换后地址会错误?
  • 看看我写的接口,暂时没发现问题:
    /*!
        \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); } } 我这个连续擦除扇区 擦除第二个扇区后死机了 返回值正常 能帮分析一下么 大佬 
  • 自己答复一下,原因是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;
            }
      }   

您需要登录后才可以回复 登录 | 注册