OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2427|回复: 3

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

[复制链接]

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
发表于 2019-9-25 11:06:31 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 hejun96 于 2019-9-25 16:51 编辑

这段程序中是一段业务代码,有关于一个智能饮水机的主控板程序,长按冷水键+童锁键后,运行到排气状态,只有把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
                        };
                        */
              
}                        



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2019-9-25 13:56:40 | 显示全部楼层
长按键时如果没有喂狗,看门狗就会复位。
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2019-9-25 14:09:44 | 显示全部楼层
HXYDJ 发表于 2019-9-25 13:56
长按键时如果没有喂狗,看门狗就会复位。

但是我在断点调试时防止芯片复位把看门狗关了,然后断点调试时是正常的。在烧录全速运行时,看门狗无论关了还是打开,蜂鸣器会连续的响,不正常。在长按按键时做喂狗处理,IWDG_ReloadCounter();这个是STM32F103的库函数写法,烧录全速时还是蜂鸣器连续响,不正常。可知道原因吗?
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2019-9-26 11:09:11 | 显示全部楼层
hejun96 发表于 2019-9-25 14:09
但是我在断点调试时防止芯片复位把看门狗关了,然后断点调试时是正常的。在烧录全速运行时,看门狗无论关 ...

那就是你程序流程的问题了,仔细检查程序。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 17:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表