GD32F103在IAP时擦除失败,要怎么解决?

[复制链接]
224|6
 楼主 | 2019-5-26 08:02 | 显示全部楼层 |阅读模式
GD32F103C8T6的芯片,低16K为Boot,剩余为APP
不开启读保护,更新正常,Boot和APP可以相互更新
开启读保护后,通过Boot更新APP正常,用APP更新Boot时擦除0x08000000时失败

相关代码
        //        循环擦除
        fmc_unlock();
        while (pErase->wEarseSize)
        {
                uint8_t                bStatus = fmc_page_erase(pErase->dwAddress);
                //        出错,返回错误码与地址
                if (bStatus != FMC_READY)
                {
                        pCmdSend->bStatus = bStatus | 0x80;
                        pEraseRet->dwAddress = pErase->dwAddress;
                        break;
                }
                pErase->dwAddress += PageSize;
                pErase->wEarseSize -= PageSize;
        }
        fmc_lock();


fmc_page_erase返回值为3=FMC_WPERR

检查选项字是没有启用页保护的
0x1FFFF800开始的数据为00 FF FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00

哪位大神帮忙解决一下,多谢

使用特权

评论回复
| 2019-5-26 15:33 | 显示全部楼层
不太理解 为什么会擦除失败, 擦写的时候  你掉电了?  我用的不多 也有1个项目用 感觉不太会把。擦写函数代码 遵守firelib里的样本

使用特权

评论回复
 楼主 | 2019-5-27 09:24 | 显示全部楼层
lvben5d 发表于 2019-5-26 15:33
不太理解 为什么会擦除失败, 擦写的时候  你掉电了?  我用的不多 也有1个项目用 感觉不太会把。擦写函数 ...

没有掉电,更新的时候我是先更新的Boot后面的数据区,然后再更新的代码区。
最神奇的地方在于不加读保护完全正常,设置选项字后数据区更新也正常,就是更新到Flash开始位置就失败了,提示页保护错误。而选项字中只开启了读保护,没开启也保护的。

使用特权

评论回复
| 2019-5-27 10:49 | 显示全部楼层
请问 iap是什么模式

使用特权

评论回复
| 2019-5-27 11:32 | 显示全部楼层
那就手动关闭一下

使用特权

评论回复
| 2019-5-27 12:06 | 显示全部楼层
是不是哪里误操作了呢

使用特权

评论回复
 楼主 | 2019-5-27 15:01 | 显示全部楼层
已找到原因,文档里面说了,开启读保护后,Flash前4K会自动写保护。
只能把前面放个空壳,真正的Boot放4K以后了,要不没法更新了

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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