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

STM32F103的Flash擦除问题

[复制链接]
aude5420 提问时间:2016-8-30 18:26 /
代码如下:

volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;/*FLASH擦除完成标志*/

int main(void)
{        
        /*解锁FLASH*/
        FLASH_Unlock();

  /* 清除所有挂起标志位 */
        FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);        
  /* 擦除FLASH 页*/
        FLASHStatus = FLASH_ErasePage((uint32_t)0x08000000);
        
        while(FLASHStatus != FLASH_COMPLETE)
                ;
/* 锁定FLASH  */
        FLASH_Lock();
               
  while (1);
}

程序就一直停在FLASHStatus = FLASH_ErasePage((uint32_t)0x08000000);这条代码上,但是我通过Watch window看0x08000000到0x080007FF都已经擦除,这个空间内都是FF。
还有一个问题,就是芯片重启之后,在0x08000000到0x080007F空间内,又恢复到未擦除状态,里面好像是随机码。
请问这都是什么情况?

赞 收藏 1 评论17 发布时间:2016-8-30 18:26

举报

17个回答
moyanming2013 回答时间:2016-9-2 10:59:42
1.不可能实现存放代码的flash扇区被自己擦除!擦除时的代码还要运行,擦除了运行哪里呢?!
2.你大概是要IAP吧。就是程序既可以运行也可以烧录新固件,那么此时需要参考如下官方的推荐方式:
分配一个IAP代码区和一个用户代码区,每个区都有向量表和代码。其实,每个区都是一个独立的MCU程序,只是功能不一样。
IAP代码区执行的是截获用户的一些特殊操作,然后烧录用户代码;否则执行用户代码。这里面的关键是使用了向量表的重定位功能。
你参考下图吧(参考AN4657):
QQ截图20160902105356.jpg

评分

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

查看全部评分

ppaaddss 回答时间:2016-9-2 08:22:22
本帖最后由 ppaaddss 于 2016-9-2 09:31 编辑

你这么做,应带都不是停在FLASHStatus = FLASH_ErasePage((uint32_t)0x08000000);这个函数了
而是直接进入了硬件错误中断中了。
因为编译器编译程序源码后的区域应该都是不可写入的。
具体程序是存储在什么地方,存储了多大的空间。。。这个需要根据编译器配置和程序的大小。。。余下的空间只要不超过片内FLASH的最大存储量应该都是可以擦除的。

评分

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

查看全部评分

凤羽呈祯 回答时间:2016-9-1 10:41:59
楼主这个不是自己擦除自己么  不行的  运行的程序要弄个偏移量  工程里还要设置一下  然后再设置向量偏移

评分

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

查看全部评分

#define 回答时间:2016-9-1 08:45:24
参考 官方代码                       
lulugl 回答时间:2016-9-1 08:57:34
我还没学过103
z258121131 回答时间:2016-9-1 09:40:48
xuexixuexi
埃斯提爱慕 回答时间:2016-9-1 09:50:38
提示: 作者被禁止或删除 内容自动屏蔽
废鱼 回答时间:2016-9-1 10:22:52
楼主可否换个地址测试,这个地址如果被擦了。程序起不来了。
johnson_gong 回答时间:2016-9-1 10:25:32
学习一下
Bolly Wei 回答时间:2016-9-1 11:11:49
你的程序就运行在那个地址,不能擦除的,如果执行擦除就肯定会出错的
wudianjun2001 回答时间:2016-9-1 12:01:18
不能擦除程序空间的吧,自己把自己给擦了,不行吧
无薪税绵 回答时间:2016-9-1 13:22:56
建议楼主更改一下删除地址。
例如:由0x08000000改为0x08010000。
qunda 回答时间:2016-9-1 16:23:59
FLASH_ErasePage((uint32_t)0x08000000)感觉地址不对劲。
huaiqiao 回答时间:2016-9-1 21:45:14
这个有个st的官方的flash编程手册,下载下来好好看看恩。没搞过这个。。。
feixiang20 回答时间:2016-9-1 22:13:16
确认循环对嘛
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版