打印
[STM32F4]

中断喂狗失败

[复制链接]
2490|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pkuzhx|  楼主 | 2016-3-9 09:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F401RE,CubeMX
使用其他方法喂成功了,想试一下中断喂狗,就失败了,发现开了狗,中断就进不去了,关了狗,中断正常。

具体如下:
设置一个全局标志,TIMER2中断中将该标志置1。
主函数while中不断检测,检测到该标志后喂狗,然后再将该标志置0。
然后就失败。
实在不明白为什么开狗会导致进入不了中断?
沙发
huangcunxiake| | 2016-3-9 10:49 | 只看该作者
狗也是一种中断吧。  就是个定时器。你开的是什么中断呢?首先你喂狗的时间要够长才行,要不然,不停的在喂狗,就没法进入中断了。

使用特权

评论回复
板凳
ouyangyitao| | 2016-3-9 10:55 | 只看该作者
喂狗不应该在中断吧

使用特权

评论回复
地板
pkuzhx|  楼主 | 2016-3-9 11:01 | 只看该作者
huangcunxiake 发表于 2016-3-9 10:49
狗也是一种中断吧。  就是个定时器。你开的是什么中断呢?首先你喂狗的时间要够长才行,要不然,不停的在喂 ...

TIMER2中断,关掉狗实测71ms中断一次。
狗的喂狗时间是64ms~87ms,通过while中直接delay的方法喂狗是成功的。
所以应该不存在喂狗太过频繁或者喂狗太晚的的问题

使用特权

评论回复
评论
李冬发 2016-3-9 12:05 回复TA
71ms>64ms?! 
5
huangcunxiake| | 2016-3-9 11:08 | 只看该作者
你换另外一个TIMER试试看,是不是没有配置好啊,或者有冲突。

使用特权

评论回复
6
huangcunxiake| | 2016-3-9 11:16 | 只看该作者
搜索了,一下,网上都是用delay延时的,看来这个应用的不多啊,估计看门狗很少用人用。或者你直接在每个while循环周期都喂狗吧,别定时了。。。

使用特权

评论回复
7
pkuzhx|  楼主 | 2016-3-9 11:20 | 只看该作者
ouyangyitao 发表于 2016-3-9 10:55
喂狗不应该在中断吧

这个也不算在中断中喂狗。只是利用了中断产生的标志,然后在main中喂狗。

使用特权

评论回复
8
pkuzhx|  楼主 | 2016-3-9 11:21 | 只看该作者
huangcunxiake 发表于 2016-3-9 11:16
搜索了,一下,网上都是用delay延时的,看来这个应用的不多啊,估计看门狗很少用人用。或者你直接在每个whi ...

我以前也不用的,就是学习一下,所以想把每种喂狗方法都尝试一下

使用特权

评论回复
9
Adu0227| | 2016-3-9 13:20 | 只看该作者
将全局标志生命修改为volatile

使用特权

评论回复
10
Thethree| | 2016-3-9 14:17 | 只看该作者
是不是中断优先级一样了呢?

使用特权

评论回复
11
pkuzhx|  楼主 | 2016-3-9 14:23 | 只看该作者
Adu0227 发表于 2016-3-9 13:20
将全局标志生命修改为volatile

不是这个原因。

使用特权

评论回复
12
pkuzhx|  楼主 | 2016-3-9 14:32 | 只看该作者
终于找到了。
STM32在开启中断前,TIMx_SR的UIF就置1了,所以一开启中断立即就会先进入一次中断,从而导致了提前喂狗。
解决办法就是在开启中断前先把UIF位置0.

使用特权

评论回复
13
pkuzhx|  楼主 | 2016-3-9 14:39 | 只看该作者
Thethree 发表于 2016-3-9 14:17
是不是中断优先级一样了呢?

不是,原因在头顶。
郁闷的是,没找到是哪句代码把UIF置1了,单步执行莫名其妙就看它变1了。

使用特权

评论回复
14
pkuzhx|  楼主 | 2016-3-9 14:49 | 只看该作者
本帖最后由 pkuzhx 于 2016-3-9 15:37 编辑

发现是修改EGR的时候,SR被修改了

使用特权

评论回复
15
xmshao| | 2016-3-9 15:13 | 只看该作者
pkuzhx 发表于 2016-3-9 14:32
终于找到了。
STM32在开启中断前,TIMx_SR的UIF就置1了,所以一开启中断立即就会先进入一次中断,从而导致 ...

应该说还是你时间参数配置的问题。
就算定时器开启时进一次中断,喂了一次狗,那也不应该后面定时器进不了中断。

如果这样,那就意味着后面总等不到定时器给出的标志来喂狗就复位了,总轮不到定时器溢出中断。

使用特权

评论回复
16
pkuzhx|  楼主 | 2016-3-9 15:17 | 只看该作者
xmshao 发表于 2016-3-9 15:13
应该说还是你时间参数配置的问题。
就算定时器开启时进一次中断,喂了一次狗,那也不应该后面定时器进不 ...

喂狗的窗口设置的比较小,一开始就喂狗,就喂早了,所以程序就直接reset了,就无所谓后面的中断了。
如果把窗口设置到最大,那么一开始就进中断也能成功喂狗。所以确实不是进不去中断,而是程序在第一次中断后就reset了,没有给继续中断的机会。

使用特权

评论回复
17
跟屁虫| | 2016-3-9 22:21 | 只看该作者
pkuzhx 发表于 2016-3-9 15:17
喂狗的窗口设置的比较小,一开始就喂狗,就喂早了,所以程序就直接reset了,就无所谓后面的中断了。
如果 ...

这个喂狗的操作比正常的中断要复杂的多啊

使用特权

评论回复
18
icecut| | 2016-3-9 23:11 | 只看该作者
中断喂狗没用

使用特权

评论回复
19
pkuzhx|  楼主 | 2016-3-10 08:44 | 只看该作者

具体讲一讲。
中断设置标志,然后主函数while中根据标志去喂狗也没用吗?

使用特权

评论回复
20
icecut| | 2016-3-10 09:52 | 只看该作者
pkuzhx 发表于 2016-3-10 08:44
具体讲一讲。
中断设置标志,然后主函数while中根据标志去喂狗也没用吗? ...

那有必要 中断设置标志么?程序段执行多久自己还不知道

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

730

帖子

6

粉丝