你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Flash的擦除问题

[复制链接]
manhuami2007 提问时间:2017-4-18 14:36 /
产品使用STM32F103VCT6,在使用自己的IAP程序升级固件时,碰到Flash擦除不成功的问题,具体步骤如下:
1、调用库函数的擦除块指令FLASH_ErasePage(),返回了成功 FLASH_COMPLETE;
2、向块中写入数据FLASH_ProgramHalfWord(),返回了失败 FLASH_ERROR_PG, 这个标志的意思是FLash->SR 的PGERR位,表示要写入的位置的值不为0xFFFF。也就是说,上面调用的FLASH_ErasePage()并没有将Flash擦除成功。
3、反复测试一直都没有成功;
4、使用jlink调试,看到Flash中的内容确实还在;
5、怀疑是Flash解锁没有成功,使用jlink查看FLASH->CR 的LOCK位,已经解锁了。系统时钟HSI也正常。
6、并不是所有的产品都出这种问题,偶尔的几块板子会出现这个问题,并且重新下载IAP程序也就没问题了。

不知道各位碰到过这个问题吗?这个是为什么呢?

1 收藏 1 评论16 发布时间:2017-4-18 14:36

举报

16个回答
大陶 回答时间:2018-7-12 14:00:23
先解锁 有个自己写的函数 你可以参考一下
void Writeflash(u32 addr,u16 data)
{
        volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;

        FLASH_Unlock();
        FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
  FLASHStatus = FLASH_ErasePage(addr);

        if(FLASHStatus == FLASH_COMPLETE)
        {
                FLASH_ProgramHalfWord(addr,data);
        }
        FLASH_Lock();
}

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

tovax 回答时间:2018-7-12 14:16:34
七夜-2003106 发表于 2017-8-24 15:27
你说的清除标志位,是什么意思?擦除之前,不就是FLASH_Unlock();一句就行了么? ...

找到答案了:
/* Clear All pending flags */
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | LASH_FLAG_WRPRTERR);

请参考这篇帖子:
http://blog.csdn.net/robinson_911/article/details/16118967

我遇到这种异常情况是因为在上电后,在擦除之前进行了写入操作,我以为只要全是0xFF就不用擦除了,结果来看好像不是这样。两种方法,要么写入之前一定进行擦除,要么按上边那样清除标志位。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3 结帖奖励

查看全部评分

tovax 回答时间:2018-7-12 14:18:42
dataozi 发表于 2018-7-12 14:00
先解锁 有个自己写的函数 你可以参考一下
void Writeflash(u32 addr,u16 data)
{

十分感谢你的回复,按你的方法测试了,完全没问题,再次感谢!
wanyisq 回答时间:2017-4-25 08:47:38
先解锁 清除标志位 再整页擦除

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

cldym 回答时间:2017-4-25 10:26:25
同意楼上的
wudianjun2001 回答时间:2017-4-25 11:19:20

先解锁 清除标志位 再整页擦除

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

无薪税绵 回答时间:2017-4-25 17:03:08
建议解锁后,适当增加延时,并重复检查一下解锁位是否正确。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

中山无雪 回答时间:2017-4-25 20:28:24
原田夜舞love 回答时间:2017-4-25 23:34:19
需要先解锁

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

wofei1314 回答时间:2017-4-26 10:11:45
本帖最后由 wofei1314 于 2017-4-26 10:13 编辑

是否设置Flash延迟...
读写Flash之前,加上这个  
FLASH_SetLatency(FLASH_ACR_LATENCY_2);//<=24M,为0,<=48M,为1,<=72M,为2;

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

枕上梦 回答时间:2017-8-22 10:31:05
先解锁 清除标志位 再整页擦除
成功调试通过,谢谢
七夜-2003106 回答时间:2017-8-24 15:27:19
枕上梦 发表于 2017-8-22 10:31
先解锁 清除标志位 再整页擦除
成功调试通过,谢谢

你说的清除标志位,是什么意思?擦除之前,不就是FLASH_Unlock();一句就行了么?
tovax 回答时间:2018-7-12 13:44:42
请问“清除标志位”指的是什么标志位?
大陶 回答时间:2018-7-12 15:07:22
tovax 发表于 2018-7-12 14:18
十分感谢你的回复,按你的方法测试了,完全没问题,再次感谢!

别客气 别客气 帮到你 就行
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版