这是主程序的循环
while(1)
{
delay_ms(100);
LED0=!LED0;//提示系统正在运行
Config_RetrieveSettings();
}
1、Flash能正常读写,且正确,内存位置也对
2、
Config_RetrieveSettings();为Flash读写函数,无特殊操作,只是写入数据,然后在读出来,最后串口发送
问题:主循环中
Config_RetrieveSettings();删除后,系统完全正常运行。
主循环加入
Config_RetrieveSettings();,删除
delay_ms(100); 系统正常运行,读取,LED都正常
以上两个同是写入,第一遍LED正常延时,点亮,Flah读写打印出数据。第二遍循环,程序异常,死循环在
delay_ms(100);
图片红框内为死循环异常的地方,在执行第一遍之后,就一直停留在这里循环。
1
望大神能够解答。
ALIENTEK MINISTM32 实验26 FLASH模拟EEPROM实验.zip
(2.47 MB, 下载次数: 196)
2017-7-17 16:33 上传
点击文件名下载附件
1
我测试的方法是在楼主的主程序后面加两个led全亮的语句:
while(1)
{
//Config_RetrieveSettings();
delay_ms(300);
LED0=!LED0;//提示系统正在运行
LED1=!LED1;
Config_RetrieveSettings();
LED0=1;LED1=1;
}
如果是delay里边死循环,应该就会全亮,但是实际上没有,只停留在一个LED灯上。
然后把LED0=1;LED1=1;拎到前面:
while(1)
{
//Config_RetrieveSettings();
delay_ms(300);
LED0=!LED0;//提示系统正在运行
LED1=!LED1;
LED0=1;LED1=1;
Config_RetrieveSettings();
}
则两个LED全亮并保持,说明问题在 Config_RetrieveSettings();这个函数没有执行完,什么地方卡住了,或等待应答什么的……
这种测试办法和逻辑很简单吧
然后我继续用这两个LED指令插入到 Config_RetrieveSettings();里边,发现问题在FLASH_READ_VAR(FLASH_SAVE_ADDR,stored_ver);
接着找到:
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)
{
u16 i;
LED0=1;LED1=1;//标志测试
for(i=0;i<NumToRead;i++)
{
pBuffer=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节.
ReadAddr+=2;//偏移2个字节.
}
}
在for之前两个灯是亮的,在for之后就不行了。
然后跟踪到
u16 STMFLASH_ReadHalfWord(u32 faddr)
{
return *(vu16*)faddr;
}
问题就在这个函数里了,全亮在return前是有效的,return后就不亮了,说明在这一句return *(vu16*)faddr; 卡住了!而不是读取flash影响delay函数。
一周热门 更多>