潇潇雨歇pku 发表于 2016-3-8 19:21:08

中断喂狗失败

刚开始使用WWDG。用其他方法喂狗成功了,尝试通过中断喂狗失败:
使用TIMER2设置中断,发生中断时,设置标志。
主函数while检测到标志,清除标志,喂狗。
然后就失败了。
现在发现,开了狗,就进不去中断了,所以失败。想不通为什么狗会导致中断失败?
关了狗,中断正常。
不用中断,在while中延迟相等时间,喂狗成功。

潇潇雨歇pku 发表于 2016-3-9 09:38:52

顶起来……         

xmshao 发表于 2016-3-9 11:33:24

本帖最后由 xmshao 于 2016-3-9 11:37 编辑

如果你定时时间长于WWDG的窗口时间,那定时器永远等不到溢出就被复位了。

你说 “不用中断,在while中延迟相等时间,喂狗成功” 确信不是误会?这个相等时间是跟定时器的时间还是看门狗的窗口时间?

潇潇雨歇pku 发表于 2016-3-9 11:58:51

xmshao 发表于 2016-3-9 11:33
如果你定时时间长于WWDG的窗口时间,那定时器永远等不到溢出就被复位了。

你说 “不用中断,在while中延迟 ...

喂狗的窗口时间是64.17ms~87.38ms
delay 70ms成功喂狗,定时70失败。关掉狗,发现定时确实是70ms

潇潇雨歇pku 发表于 2016-3-9 14:12:58

xmshao 发表于 2016-3-9 11:33
如果你定时时间长于WWDG的窗口时间,那定时器永远等不到溢出就被复位了。

你说 “不用中断,在while中延迟 ...

感觉好像是stm32的问题,开启定时器会先进入一次中断,然后导致提前喂狗

潇潇雨歇pku 发表于 2016-3-9 14:32:46


终于找到了。
STM32在开启中断前,TIMx_SR的UIF就置1了,所以一开启中断立即就会先进入一次中断,从而导致了提前喂狗。
解决办法就是在开启中断前先把UIF位置0.

发表于 2016-3-9 15:19:05

建议不要在中断中喂狗,这样别的程序死掉的时候,喂狗还是会继续,导致程序不能复位。

xmshao 发表于 2016-3-9 15:22:54

潇潇雨歇pku 发表于 2016-3-9 14:12
感觉好像是stm32的问题,开启定时器会先进入一次中断,然后导致提前喂狗

你提到的定时器开启就进入中断跟配置有点关系,有些情况下有这个问题。
多数时候可能对应用没啥影响可能就忽视了。

不过你这个问题,应该说参数配置有待琢磨。
http://mp.weixin.qq.com/s?__biz=MzA3OTIxMjQyNQ==&mid=205748433&idx=1&sn=e86e3a12d93d702878657eeb2d655020#rd
STM32 定时器有时一开启就进中断的话题

潇潇雨歇pku 发表于 2016-3-9 15:29:29

安 发表于 2016-3-9 15:19
建议不要在中断中喂狗,这样别的程序死掉的时候,喂狗还是会继续,导致程序不能复位。 ...

直接在中断中喂狗是的。但是我是在中断中设置标志,然后在主函数中判断以后再喂狗,应该没问题吧?

潇潇雨歇pku 发表于 2016-3-9 15:30:20

xmshao 发表于 2016-3-9 15:22
你提到的定时器开启就进入中断跟配置有点关系,有些情况下有这个问题。
多数时候可能对应用没啥影响可能 ...

哈哈哈,你也是二姨和这边两边都上啊
页: [1] 2
查看完整版本: 中断喂狗失败