hejun96 发表于 2019-9-25 15:47:12

在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
                        };
                        */
            
}                        

wenyangzeng 发表于 2019-9-25 16:12:46

if(scold==1 && child==1) 与if((scold==1)&&(child==1))运行结果可能是不一样的。

hejun96 发表于 2019-9-25 16:23:36

wenyangzeng 发表于 2019-9-25 16:12
if(scold==1 && child==1) 与if((scold==1)&&(child==1))运行结果可能是不一样的。

前面的是放在if整个括号里面的条件做判断,后面的是if里面两个相&做判断,但是这个和解开这个问题有没有什么联系呢?

tanic 发表于 2019-9-25 17:31:11

不要阻塞上RTOS或者用状态机

toofree 发表于 2019-9-25 18:07:26

独立看门狗是在程序调试正常后,最后才加上的。平时调试的时候,独立看门狗必须是关闭的。
STM32F103的独立看门狗一旦开启是关不掉的,只有烧上关掉看门狗的程序,并重新上电,才能保证看门狗不开启。
总的来说,还是那句话,先调程序,最后开看门狗。看门狗只有及时喂狗就可以了。

wenyangzeng 发表于 2019-9-25 20:14:52

hejun96 发表于 2019-9-25 16:23
前面的是放在if整个括号里面的条件做判断,后面的是if里面两个相&做判断,但是这个和解开这个问题有没有 ...

“&&”运算符好像优先于“==”

hejun96 发表于 2019-9-25 20:50:38

toofree 发表于 2019-9-25 18:07
独立看门狗是在程序调试正常后,最后才加上的。平时调试的时候,独立看门狗必须是关闭的。
STM32F103的独立 ...

但是我在断点调试时,关掉看门狗,然后断点调试,蜂鸣器响3声正常。但是在全速运行后,打开看门狗,蜂鸣器持续的响。还没有查到时什么原因

butterflyspring 发表于 2019-9-26 11:01:11

看门狗的方式楼上已经说了原理。建议你量测一下复位引脚(或者测试一下复位状),是不是看门狗引起了连续复位。如果是的话,检验一下复位时间设置(独立看门狗要留有充足的时间)和喂狗方式。通常都是大循环里喂狗:)
页: [1]
查看完整版本: 在STM32F103中只有当关闭看门狗断点调试才有效的解决办法