在STM32F103中只有当关闭看门狗断点调试才有效的解决办法
这段程序中是一段业务代码,有关于一个智能饮水机的主控板程序,此段程序在长按冷水键+童锁键后,运行到排气状态,只有把IWDG_Enable(看门狗使能)注释掉后断点调试才正常,蜂鸣器响3声。如果是把看门狗打开的话,蜂鸣器在进入这段程序后会一直响,相当于是程序跑飞了?那应该具体怎么去做?也就是看门狗关闭后,也就是把IWDG_Enable的那行注释掉,然后全速运行,蜂鸣器依然被触动,但是在断点调试时把狗关了,却是好的,所以
IWDG_Enable + RUN= 排气状态下beep 持续响 ----> 不正常
去掉IWDG_Enable + RUN = 排气状态下 beep 持续响 -----> 不正常
IWDG_Enable + 断点调试 = 排气状态下 beep 持续响 ------>不正常
去掉IWDG_Enable + 断点调试 = 排气状态下 beep响3声---->正常
如何在全速跑时让其正常响3声,而不是持续响???
if(scold==1 && child==1) //按下冷水键和童锁键10s处于排气过程 (问题点???)
{
System_Sta.s.clean_self_cmd = FLAG_OFF;//自排水标志位turn off
vent_flag = 1;
scold = child = 0;
Save_Data.s.self_clean_flag = 0;//保存掉电前自排水完成状态
System_Sta.s.Vent_Flag = FLAG_ON;//自排气标志位打开
System_Data.Cold_Water_G_Tick = 0;//
System_Sta.s.Cold_Water_G_Flag = FLAG_OFF;
System_Data.Normal_Water_H_Tick = 0;
System_Sta.s.Normal_Water_H_Flag = FLAG_OFF;
// System_Data.cold_water_time += System_Data.cold_water_flag_tick/1000;
// System_Data.cold_water_flag_tick = FLAG_OFF;
// System_Sta.s.cold_water_timer_flag = TIMER_RESET;
// System_Sta.s.cold_water_on_flag = FLAG_OFF;
// System_Data.Normal_Water_H_Off_Time += System_Data.Normal_Water_H_Tick/1000;
// System_Data.Normal_Water_H_Tick = FLAG_OFF;
// System_Sta.s.normal_water_timer_flag = TIMER_RESET;
// System_Sta.s.normal_water_on_flag = FLAG_OFF;
// i2cWriteBuffer1(AT24C02_ADDR,AT24C02_REG,sizeof(SAVE_DATA_UNION),(u8*)&Save_Data);/*写入数据*/
// for (int i = 0; i < sizeof(STA_UNION); i++)
// {
// System_Sta.sta = 0;
// }
//
// memset((void *)(&System_Data),0,sizeof(DATA_STRUCT));
/* 蜂鸣器连续响3声 */
System_Sta.s.beep_timer_flag = TIMER_RUN;
Block_Timer(50);//阻塞时间50ms
System_Sta.s.beep_timer_flag = TIMER_RESET;
Block_Timer(200);//阻塞时间200ms
System_Sta.s.beep_timer_flag = TIMER_RUN;
Block_Timer(50);//阻塞时间50ms
System_Sta.s.beep_timer_flag = TIMER_RESET;
Block_Timer(200);//阻塞时间200ms
System_Sta.s.beep_timer_flag = TIMER_RUN;
Block_Timer(50);//阻塞时间50ms
System_Sta.s.beep_timer_flag = TIMER_RESET;
/* 蜂鸣器的定时器标志位关闭 */
System_Sta.s.beep_timer_flag = TIMER_END;
/* 把定时器的标志位结束 */
//System_Sta.s.timer_flag = TIMER_END;
System_Data.flash_water_flag='0';
System_Data.flash_water_flag='2';/*停止清洗*/
Trans_dat_append(STATE_23);//整机自清洗指令
Vent_Work();
/*
while(vent_flag)
{
IWDG_ReloadCounter();//reload
};
*/
}
if(scold==1 && child==1) 与if((scold==1)&&(child==1))运行结果可能是不一样的。 wenyangzeng 发表于 2019-9-25 16:12
if(scold==1 && child==1) 与if((scold==1)&&(child==1))运行结果可能是不一样的。
前面的是放在if整个括号里面的条件做判断,后面的是if里面两个相&做判断,但是这个和解开这个问题有没有什么联系呢? 不要阻塞上RTOS或者用状态机 独立看门狗是在程序调试正常后,最后才加上的。平时调试的时候,独立看门狗必须是关闭的。
STM32F103的独立看门狗一旦开启是关不掉的,只有烧上关掉看门狗的程序,并重新上电,才能保证看门狗不开启。
总的来说,还是那句话,先调程序,最后开看门狗。看门狗只有及时喂狗就可以了。 hejun96 发表于 2019-9-25 16:23
前面的是放在if整个括号里面的条件做判断,后面的是if里面两个相&做判断,但是这个和解开这个问题有没有 ...
“&&”运算符好像优先于“==” toofree 发表于 2019-9-25 18:07
独立看门狗是在程序调试正常后,最后才加上的。平时调试的时候,独立看门狗必须是关闭的。
STM32F103的独立 ...
但是我在断点调试时,关掉看门狗,然后断点调试,蜂鸣器响3声正常。但是在全速运行后,打开看门狗,蜂鸣器持续的响。还没有查到时什么原因 看门狗的方式楼上已经说了原理。建议你量测一下复位引脚(或者测试一下复位状),是不是看门狗引起了连续复位。如果是的话,检验一下复位时间设置(独立看门狗要留有充足的时间)和喂狗方式。通常都是大循环里喂狗:)
页:
[1]