求助:为何不能擦除const 修饰的变量的区域

2019-10-15 22:25发布

本帖最后由 SCREA 于 2016-12-20 15:04 编辑

比如F103ZET6.程序体在0x0800 0000 ~ 0x0800 FFFF内
[mw_shl_code=c,true]const u8 TEXT_Buffer[]={"STM32 FLASH TEST"};
const u8 buf[100] @ 0x0801 0000 = {1,2,3,4,5};
const u8 *p = buf;

STMFLASH_Write((u32)p,(u32*)TEXT_Buffer,100);[/mw_shl_code]
Debug发现 怎么也不能擦除复写buf区域----那100个字节。


============
上传原子工程,感兴趣的可以试试,const修饰的变量绝对不是想擦哪就擦哪(当前只试过F103、407、L0XX)
若是你没试过,就不要凭感觉回答否定我的结论

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
SCREA
1楼-- · 2019-10-16 09:09
zc123 发表于 2016-12-20 11:17
//设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
代码注释里面写的很 ...

你试试工程再说吧。
SCREA
2楼-- · 2019-10-16 11:55
憨厚诚实大叔 发表于 2016-12-20 13:37
楼主喜欢就好,都打算改变还用const。
自己写一个擦除的函数就知道可不可以擦除了。

boot 和 APP 公用的ifo信息在那里存的。。。。

那么写肯定是有原因的
憨厚诚实大叔
3楼-- · 2019-10-16 15:04
本帖最后由 憨厚诚实大叔 于 2016-12-21 12:02 编辑
SCREA 发表于 2016-12-20 15:00
boot 和 APP 公用的ifo信息在那里存的。。。。

那么写肯定是有原因的

你可以另外拿一页存的,你这样写const数据会和代码放一起,擦了也会出问题的。就算让你擦除成功,已经擦了一页了,一页的代码数据都给你擦除了。
能告诉我这样写的原因么。我实在想不出为什么要这样擦除代码区的数据。
zc123
4楼-- · 2019-10-16 20:54
 精彩回答 2  元偷偷看……
513393302@qq.co
5楼-- · 2019-10-16 22:45
不太明白楼主的问题   
如果想指定CONST数组的地址    请这样表示
const u8 TEXT_Buffer[100]  __attribute__((at(0x08010000)))  ={"STM32 FLASH TEST"};  
如果想擦除这个数组所在的数据,需要如下操作
1、得到需要擦除的扇区的地址   (绝对地址)
2、FLASH解锁
3、调用FLASH外设库中 STMFLASH_EraseSector(ADDR) 函数  ,用于擦除这个扇区
4、FLASH加锁


注意:在执行擦除FLASH及编程FLASH函数时,必须先执行FLASH解锁,否则会出现编程错误且FLASH不再允许擦除及编程操作,直到下次复位。当执行复位时FLASH的编程错误标记会清零

正点原子
6楼-- · 2019-10-16 22:53
zc123 发表于 2016-12-20 11:17
//设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
代码注释里面写的很 ...

你这个flash数据,很可能和代码有重叠,你擦除,很容易把代码都给擦了...
所以检查下是不是这个问题吧

一周热门 更多>