|
最近我在写一款程序,在初始化定义如下代码: 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这个扇区进行擦除和写操作就没有影响了! |
STM32F405rgt6 I2S DMA输入会造成卡死,这个芯片有BUG
USBX在F407上创建CDC不能正常使用
STM32F427ZGTx内部RTC秒及亚秒同步问题
有没有STM32F405RG参考设计
LSM6DS3TR-C静止情况下使用MotionFX固件算出的欧拉角周期性异常跳动
全球论坛无法登录
STM32F429使用FMC接口扩展SDRAM
用STM32F407做U盘拖拽升级,目前BootLoader和实现U盘,后面就不知道怎么操作了。
STM32上电后会多次进入所有打开的定时器回调函数中,如何避免这样的情况?
STM32F427VIT6这款芯片所支持的摄像头模组的列表有不?
微信公众号
手机版
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这个扇区进行擦除和写操作就没有影响了!
确定,通过仿真看到,凡是全局变量的初始化,其初始值并不是在最开始的扇区0的FLASH区域,而是在程序所占用的最后一个FLASH区域。
因为全局变量的初始化,其初始值是放在FLASH区域的,而且是放在程序所占用FLASH区域的最后一个扇区,我只要不对最后一个扇区进行擦写就可以了。