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

STM32F407在const绝对定位数组后,复位前正常,复位后运行不正常的现象

[复制链接]
清梦轮回 提问时间:2022-9-15 14:27 / 未解决
最近我在写一款程序,在初始化定义如下代码:
     const u8  a[2] _attribute_((at(0x08020000))),也就是把数组的地址定义在flash空间的0x08020000这个位置。
   然后在串口中断中对这个地址所在的扇区进行擦除,代码如下:
  __disable_irq();
    FLASH_Unlock();
   FLASH_EraseSector(FLASH_Sector_5,VoltageRange_3);
   FLASH_Lock();
__enable_irq();
这个时候,只要程序不复位,串口收发都可以,程序运行正常,但是只要程序一复位,就会运行异常,我们通过检查,发现是初始化的数据改变了,比如我们在初始化定义了u8  a=123,那么在复位后,a=0xff。
出现这个问题的原因是KEIL5的编译器把a=123,中断常数123放进了FLASH当中,而且是放在最后使用的一个FLASH地址中,也就是放在0x08020000这个扇区当中,这样,擦除以后,只要复位后上电,那么读出来的数据就是FF,所以很多定义的初始化变量全部变成了FF,解决问题的办法是在0x08020000这个扇区后面再定义一个扇区,也就是再加一句const u8  a[2] _attribute_((at(0x08040000))),这样,初始化的常量就会放在0x08040000这个扇区,那么再对0x08020000这个扇区进行擦除和写操作就没有影响了!

收藏 评论5 发布时间:2022-9-15 14:27

举报

5个回答
清梦轮回 回答时间:2022-9-15 14:27:43
最近我在写一款程序,在初始化定义如下代码:
     const u8  a[2] _attribute_((at(0x08020000))),也就是把数组的地址定义在flash空间的0x08020000这个位置。
   然后在串口中断中对这个地址所在的扇区进行擦除,代码如下:
  __disable_irq();
    FLASH_Unlock();
   FLASH_EraseSector(FLASH_Sector_5,VoltageRange_3);
   FLASH_Lock();
__enable_irq();
这个时候,只要程序不复位,串口收发都可以,程序运行正常,但是只要程序一复位,就会运行异常,我们通过检查,发现是初始化的数据改变了,比如我们在初始化定义了u8  a=123,那么在复位后,a=0xff。
出现这个问题的原因是KEIL5的编译器把a=123,中断常数123放进了FLASH当中,而且是放在最后使用的一个FLASH地址中,也就是放在0x08020000这个扇区当中,这样,擦除以后,只要复位后上电,那么读出来的数据就是FF,所以很多定义的初始化变量全部变成了FF,解决问题的办法是在0x08020000这个扇区后面再定义一个扇区,也就是再加一句const u8  a[2] _attribute_((at(0x08040000))),这样,初始化的常量就会放在0x08040000这个扇区,那么再对0x08020000这个扇区进行擦除和写操作就没有影响了!
yklstudent 回答时间:2022-9-15 20:00:37
你确定这个地址只有这个数据,没有其它了?
废鱼 回答时间:2022-9-16 09:51:26
我不太理解楼主的操作方法,FLASH区域擦除是整个区域,擦完以后需要重新写入数据才能保证数据的正确性,如果不写入数据,那么数据就是FF。
清梦轮回 回答时间:2022-9-19 09:15:16
yklstudent 发表于 2022-9-15 20:00
你确定这个地址只有这个数据,没有其它了?

确定,通过仿真看到,凡是全局变量的初始化,其初始值并不是在最开始的扇区0的FLASH区域,而是在程序所占用的最后一个FLASH区域。
清梦轮回 回答时间:2022-9-19 09:18:49
废鱼 发表于 2022-9-16 09:51
我不太理解楼主的操作方法,FLASH区域擦除是整个区域,擦完以后需要重新写入数据才能保证数据的正确性,如 ...

因为全局变量的初始化,其初始值是放在FLASH区域的,而且是放在程序所占用FLASH区域的最后一个扇区,我只要不对最后一个扇区进行擦写就可以了。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版