你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

在STM32F103中只有当关闭看门狗断点调试才有效的解决办法

[复制链接]
hejun96 提问时间:2019-9-25 15:47 /
这段程序中是一段业务代码,有关于一个智能饮水机的主控板程序,此段程序在长按冷水键+童锁键后,运行到排气状态,只有把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]='0';
                        System_Data.flash_water_flag[1]='2';/*停止清洗*/
                        Trans_dat_append(STATE_23);//整机自清洗指令
                        
                        


                        Vent_Work();
                        /*
                        while(vent_flag)
                        {
                                IWDG_ReloadCounter();//reload
                        };
                        */
              
}                        
收藏 评论7 发布时间:2019-9-25 15:47

举报

7个回答
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
看门狗的方式楼上已经说了原理。建议你量测一下复位引脚(或者测试一下复位状),是不是看门狗引起了连续复位。如果是的话,检验一下复位时间设置(独立看门狗要留有充足的时间)和喂狗方式。通常都是大循环里喂狗
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版