OpenEdv-开源电子网

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

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

[复制链接]

28

主题

140

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2013-10-18
在线时间
72 小时
发表于 2016-12-19 21:37:18 | 显示全部楼层 |阅读模式
22金钱
本帖最后由 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)
若是你没试过,就不要凭感觉回答否定我的结论

实验34 FLASH模拟EEPROM实验.rar

1.31 MB, 下载次数: 346

F103

实验34 FLASH模拟EEPROM实验.rar

302.54 KB, 下载次数: 327

F407

最佳答案

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

IAR下解决,把那个勾上去就可以了;Keil暂没有时间验证; 1. 因为是自己建立的工程,默认是不勾选的。 总之,与代码没有问题,是最后一步下载的问题。 2. 不知道为何新建工程(默认是不勾选那个选项的)的情况下const修饰的变量为何不能擦除, 但库提供的工程也是默认不勾选的,他就可以擦除const修饰的变量 3. 建议大家点击Edit进去看下地址范围,防止越界
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

140

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2013-10-18
在线时间
72 小时
 楼主| 发表于 2016-12-19 21:37:19 | 显示全部楼层
正点原子 发表于 2016-12-25 23:29
你这个flash数据,很可能和代码有重叠,你擦除,很容易把代码都给擦了...
所以检查下是不是这个问题吧

IAR下解决,把那个勾上去就可以了;Keil暂没有时间验证;
1. 因为是自己建立的工程,默认是不勾选的。 总之,与代码没有问题,是最后一步下载的问题。
2. 不知道为何新建工程(默认是不勾选那个选项的)的情况下const修饰的变量为何不能擦除,
    但库提供的工程也是默认不勾选的,他就可以擦除const修饰的变量
3. 建议大家点击Edit进去看下地址范围,防止越界
QQ截图20161226101837.png
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-12-20 09:20:17 | 显示全部楼层
const 写在flash里面  不能更改     改flash的话一擦一页
回复

使用道具 举报

28

主题

140

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2013-10-18
在线时间
72 小时
 楼主| 发表于 2016-12-20 09:25:42 | 显示全部楼层
止天 发表于 2016-12-20 09:20
const 写在flash里面  不能更改     改flash的话一擦一页

问题是擦都不能擦,你试试?
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-12-20 10:41:46 | 显示全部楼层
    FLASH_ErasePage(ADDR);

用这个擦出    谁一般把变量设置成常数都不会去更改的
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1766
金钱
1766
注册时间
2015-6-11
在线时间
312 小时
发表于 2016-12-20 11:17:37 | 显示全部楼层
本帖最后由 zc123 于 2016-12-20 11:20 编辑

//设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
代码注释里面写的很清楚啊,当然不能随便擦除了,你定义的const就是在代码区域了,擦除相当于破坏了code区域,能运行才奇怪吧?
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-12-20 13:37:12 | 显示全部楼层
楼主喜欢就好,都打算改变还用const。
自己写一个擦除的函数就知道可不可以擦除了。
回复

使用道具 举报

28

主题

140

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2013-10-18
在线时间
72 小时
 楼主| 发表于 2016-12-20 14:59:17 | 显示全部楼层
zc123 发表于 2016-12-20 11:17
//设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
代码注释里面写的很 ...

你试试工程再说吧。
回复

使用道具 举报

28

主题

140

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2013-10-18
在线时间
72 小时
 楼主| 发表于 2016-12-20 15:00:23 | 显示全部楼层
憨厚诚实大叔 发表于 2016-12-20 13:37
楼主喜欢就好,都打算改变还用const。
自己写一个擦除的函数就知道可不可以擦除了。

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

那么写肯定是有原因的
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-12-21 11:52:43 | 显示全部楼层
本帖最后由 憨厚诚实大叔 于 2016-12-21 12:02 编辑
SCREA 发表于 2016-12-20 15:00
boot 和 APP 公用的ifo信息在那里存的。。。。

那么写肯定是有原因的

你可以另外拿一页存的,你这样写const数据会和代码放一起,擦了也会出问题的。就算让你擦除成功,已经擦了一页了,一页的代码数据都给你擦除了。
能告诉我这样写的原因么。我实在想不出为什么要这样擦除代码区的数据。
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1766
金钱
1766
注册时间
2015-6-11
在线时间
312 小时
发表于 2016-12-21 13:03:42 | 显示全部楼层
SCREA 发表于 2016-12-20 14:59
你试试工程再说吧。

STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
例程里面擦除的是定义的地址FLASH_SAVE_ADDR。

而你擦除的STMFLASH_Write((u32)p,(u32*)TEXT_Buffer,100);
这个buf是在程序里面声明的,当然不一样。

你去理解下编译后文件的内部结构,就明白为什么不能这样直接擦除了,因为你定义的这个内部buf会保存在编译文件里,后面还有程序里的其它数据。
回复

使用道具 举报

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
发表于 2016-12-21 18:05:00 | 显示全部楼层
不太明白楼主的问题   
如果想指定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的编程错误标记会清零

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-12-25 23:29:46 | 显示全部楼层
zc123 发表于 2016-12-20 11:17
//设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
代码注释里面写的很 ...

你这个flash数据,很可能和代码有重叠,你擦除,很容易把代码都给擦了...
所以检查下是不是这个问题吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

28

主题

140

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2013-10-18
在线时间
72 小时
 楼主| 发表于 2016-12-26 10:28:02 | 显示全部楼层
谢谢大家的回复,中间有事就没有来得及回复大家,抱歉。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 04:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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