OpenEdv-开源电子网

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

窗口看门狗问题

[复制链接]

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2018-3-13
在线时间
16 小时
发表于 2018-3-14 09:34:25 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 静风沐雨 于 2018-3-14 16:44 编辑

硬件:正点原子STM32F407
问题:
      在以下条件下,喂狗失效
      1.使用正点原子提供的窗口看门狗例程
      2.将WWDG中断函数中的LED灯翻转代码注释

现象:
     1.注释掉代码之后,还是会发生中断喂狗,但是系统还是会自动reset
     2.如果不注释代码,正常喂狗,不会发生系统reset
//代码修改处,红色标出;原工程在附件,只需要将以下代码注释就会出现我的现象
//窗口看门狗中断服务函数
void WWDG_IRQHandler(void)
{
        WWDG_SetCounter(WWDG_CNT);//重设窗口看门狗值
        WWDG_ClearFlag();//清除提前唤醒中断标志位
        //LED1=!LED1;
}


实验7 窗口看门狗实验.zip

481.57 KB, 下载次数: 50

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

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-3-14 15:07:17 | 显示全部楼层
代码不贴上来,怎么分析?
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2018-3-13
在线时间
16 小时
 楼主| 发表于 2018-3-14 16:43:20 | 显示全部楼层
HXYDJ 发表于 2018-3-14 15:07
代码不贴上来,怎么分析?

就是注释行代码,已在帖子里更新
回复

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5140
金钱
5140
注册时间
2014-8-26
在线时间
1317 小时
发表于 2018-3-14 19:00:19 | 显示全部楼层
实测有这现象,喂狗之后需要延时(LED取反,延时1us都可以),退出中断才不会复位,不理解为什么,坐等大神回复
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-3-15 01:14:10 | 显示全部楼层
你在中断服务函数里面,加上if判断中断标志,再做处理,试试。
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2018-3-13
在线时间
16 小时
 楼主| 发表于 2018-3-21 20:06:03 | 显示全部楼层
本帖最后由 静风沐雨 于 2018-3-21 22:14 编辑
正点原子 发表于 2018-3-15 01:14
你在中断服务函数里面,加上if判断中断标志,再做处理,试试。

猜测:
1.可能是由于某种原因使开门狗唤醒中断产生多个,刚清除中断标志紧接一个异常中断,致使出现提前喂狗情况
2.因为这些中断的优先级都相同所以不存在打断,但是必须都要触发且清除中断,不然不能及时处理正确的喂狗中断,因此延时只能在清除中断后面
尝试了几种方式,测试现象:
1.变量定义全局或内部定义静态变量,使用1,2处均异常,3处正常;【使用局部变量均异常】
u32 k = 0;
void WWDG_IRQHandler(void)
{
        //static u32 k = 0;
        //k++;//1
        WWDG_SetCounter(WWDG_CNT); //ÖØéè′°¿ú¿′ÃÅ1·Öμ
        //k++;//2
        WWDG_ClearFlag();//Çå3yìáǰ»½DÑÖD¶Ï±ê־λ
        k++;//3
//        LED1=!LED1;
}

2.使用"LED1=!LED1;"或"if(SET == WWDG_GetFlagStatus()){}"代替1中的"k++"相同结果
3.使用中断标志位,使用1处异常,使用2,3处正常
void WWDG_IRQHandler(void)
{
        if(SET == WWDG_GetFlagStatus()){
//        }//1
        WWDG_SetCounter(WWDG_CNT); //ÖØéè′°¿ú¿′ÃÅ1·Öμ
        }//2
        WWDG_ClearFlag();//Çå3yìáǰ»½DÑÖD¶Ï±ê־λ

//        }//3
}


回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2018-3-13
在线时间
16 小时
 楼主| 发表于 2018-3-31 11:07:56 | 显示全部楼层
有道友能确定我的猜想或是有新的见解吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-20 22:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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