OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8350|回复: 6

请问为什么FLASH擦除后不能写

[复制链接]

40

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
金钱
308
注册时间
2014-11-21
在线时间
22 小时
发表于 2015-10-2 10:23:02 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true] if(number<12) { FLASH_Unlock(); FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存 //FLASH_EraseSector(STMFLASH_GetFlashSector(0x08040000+number*0x800),VoltageRange_3);//VCC=2.7~3.6V之间!! for(temp=0;temp<1024;temp++) { appoint_address=0x08040000+number*0x800+temp*2; wait_write=prog_write_buffer[temp*2]+prog_write_buffer[temp*2+1]*0X100; FLASH_ProgramHalfWord(appoint_address,wait_write); } FLASH_DataCacheCmd(ENABLE); //FLASH擦除结束,开启数据缓存 FLASH_Lock(); } }[/mw_shl_code] [mw_shl_code=c,true]请问为什么FLASH擦除后不能写[/mw_shl_code] [mw_shl_code=c,true]0x08040000初始化为0xFFFF注释擦除代码就可以写,不注释擦除代码就不能写了[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

搞了几天了终于发现问题了,  #define flash_start_address 0x8010000  //梯形图保存地址 改成#define flash_start_address 0x8020000就可以了,可能是代码超过0x8010000,擦的时候把代码擦了。 Program Size: Code=69936 RO-data=64328 RW-data=208 ZI-data=54476     这个代码到底有没超过0x8010000 F103一样的代码都没问题,难道是F407编译后的代码要多些。
打倒A莫,打倒小日本
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

40

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
金钱
308
注册时间
2014-11-21
在线时间
22 小时
 楼主| 发表于 2015-10-2 10:23:03 | 显示全部楼层
搞了几天了终于发现问题了,
 #define flash_start_address 0x8010000  //梯形图保存地址
改成#define flash_start_address 0x8020000就可以了,可能是代码超过0x8010000,擦的时候把代码擦了。
Program Size: Code=69936 RO-data=64328 RW-data=208 ZI-data=54476     这个代码到底有没超过0x8010000
F103一样的代码都没问题,难道是F407编译后的代码要多些。
打倒A莫,打倒小日本
回复

使用道具 举报

13

主题

303

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2272
金钱
2272
注册时间
2015-2-3
在线时间
561 小时
发表于 2015-10-2 10:38:07 | 显示全部楼层
先擦除芯片再写数据   不然里面有数据的时候(里面的内容不是0xff的时候) 是不能写数据进去的
STM32/LPC1788/51
回复

使用道具 举报

40

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
金钱
308
注册时间
2014-11-21
在线时间
22 小时
 楼主| 发表于 2015-10-2 12:48:04 | 显示全部楼层
[mw_shl_code=c,true]都擦了就是写不进,初始化为0xFFFF,但不擦除就可以写,擦了就不能写了[/mw_shl_code] [mw_shl_code=c,true]void write_block(u16 number) {u16 temp,wait_write; u32 appoint_address; if(number<12) { FLASH_Unlock(); FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存 FLASH_EraseSector(STMFLASH_GetFlashSector(flash_start_address+number*0x800),VoltageRange_3);//VCC=2.7~3.6V之间!! for(temp=0;temp<1024;temp++) { appoint_address=flash_start_address+number*0x800+temp*2; wait_write=prog_write_buffer[temp*2]+prog_write_buffer[temp*2+1]*0X100; FLASH_ProgramHalfWord(appoint_address,wait_write); } FLASH_DataCacheCmd(ENABLE); //FLASH擦除结束,开启数据缓存 FLASH_Lock(); } }[/mw_shl_code]


打倒A莫,打倒小日本
回复

使用道具 举报

40

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
金钱
308
注册时间
2014-11-21
在线时间
22 小时
 楼主| 发表于 2015-10-2 12:49:32 | 显示全部楼层
回复【3楼】逆行者:
---------------------------------
用原子哥的代码就可以,我的是微雪的F407IGT6
打倒A莫,打倒小日本
回复

使用道具 举报

40

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
金钱
308
注册时间
2014-11-21
在线时间
22 小时
 楼主| 发表于 2015-10-2 23:55:48 | 显示全部楼层
Program Size: Code=71060 RO-data=64260 RW-data=216 ZI-data=54468     F103的
Program Size: Code=69936 RO-data=64328 RW-data=208 ZI-data=54476      F407的
晕了,,编译后F103的代码还多些都不会擦掉
打倒A莫,打倒小日本
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2018-8-24
在线时间
7 小时
发表于 2018-10-26 15:27:17 | 显示全部楼层
时隔3年了,我用的F1也遇到和楼主类似的问题,后面我在for循环里面  写入数据之前添加了一句给flash解锁的语句后,就成功了。
也不知道是什么原因,虽然在进入子函数就解锁了,不知道为什么非要在这里再加一句解锁。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 14:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表