打印
[STM32F4]

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

[复制链接]
324|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
七毛钱|  楼主 | 2022-9-16 09:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近我在写一款程序,在初始化定义如下代码:
     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这个扇区进行擦除和写操作就没有影响了!

使用特权

评论回复
沙发
七毛钱|  楼主 | 2022-9-16 09:49 | 只看该作者
最近我在写一款程序,在初始化定义如下代码:
     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这个扇区进行擦除和写操作就没有影响了!

使用特权

评论回复
板凳
V853| | 2022-9-16 09:54 | 只看该作者
没想到会有这么奇怪的操作,改变Flash的数据。不过这个方法也是挺好的。

使用特权

评论回复
地板
V853| | 2022-9-16 09:55 | 只看该作者
估计是单片机有校验吧,程序内容不对,程序就不运行。

使用特权

评论回复
5
内政奇才| | 2022-9-17 09:00 | 只看该作者
你确定这个地址只有这个数据,没有其它了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

341

主题

2328

帖子

4

粉丝