//定义的参数
#define FLASH_SAVE_ADDR (105*0x400+0x08000000)
sizeof(FA.Content.Buff)大于60
//定义的结构体
typedef struct
{
INT8U enable;
INT8U ringing;
INT32U delayms;
_64bit end;
TimeCallBack* cb;
}timer;
static timer aTimer[50];
//用到的函数 结构体数组初始化
void TIMER_Init(void)
{
for(INT8U i=0;i<TIMER_NUM;i++)
{
aTimer[i].enable=0;
aTimer[i].ringing=0;
aTimer[i].delayms=0;
aTimer[i].end=0;
aTimer[i].cb=TIMER_Dummy;
}
}
//用到的函数 半字节读取
STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)FA.Content.Buff,sizeof(FA.Content.Buff));
//出现的问题:在主函数中如果先调用TIMER_Init()初始化结构体,
//后 调用STMFLASH_Read读取数据,就会改变aTimer[0]到aTimer[5]的结构体成员初始值
//先后顺序颠倒后就不会出问题
求助各位大神能知道什么原因吗
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
昨天发帖的账号登不了了,今天又注册了个,我描述的不够清楚,还请继续指导下啊本人还是小白,STM32研究的时间也不是很长1,结构体这里的单字节对齐没研究过,我还无法确定是不是这里会有问题,
2,FLASH读写的话,如果读和写都这这样sizeof计算,保存和读取的数据没有出现问题,
3,FA.Content.Buff和TIMER结构体是互不相干的
timer结构体是定义的定时器,最多有50个定时器,TIMER_Init(void)对这50个定时器初始化(不一定会用这么多);
FA.Content.Buff这里面定义的是几十个数据,从FLASH读取的时候通过这个Buff接收,写的时候直接写整个Buff
程序进入主函数后,先对硬件进行初始化,硬件准备好后就开始初始化定时器,接着开始从FLSAH里面读取数据,然后
直接跑这里了void HardFault_Handler(void);
编译环境是IAR7.3,编译没有警告没有错误,下载运行时才出错,注意:原工程是IAR5.5编译环境下的,IAR5.5环境下编译下载不会出错
反复的添加断点单步跟踪后发现:程序在出错前,已经初始化过的定时器前几个(aTimer[0]到aTimer[5])的初始值被更改了,然后对出错前的语句逐条的屏蔽排查,发现STMFLASH_Read()屏蔽后就不会出错,如果先执行FLASH读取,后初始化定时器,也不会出错.就是想知道这道其实咋回事
一周热门 更多>