STM32内部Flash读写会对延时函数delay有影响,导致delay内部循环

2019-08-14 05:24发布

这是主程序的循环
    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 1

望大神能够解答。
ALIENTEK MINISTM32 实验26 FLASH模拟EEPROM实验.zip (2.47 MB, 下载次数: 196) 2017-7-17 16:33 上传 点击文件名下载附件
1



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
ba5rw
2019-08-14 06:43
本帖最后由 ba5rw 于 2017-8-22 10:13 编辑

我测试的方法是在楼主的主程序后面加两个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函数。

一周热门 更多>