OpenEdv-开源电子网

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

窗口看门狗中断服务函数中对调两行语句出现的问题

[复制链接]

94

主题

369

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2016-8-25
在线时间
485 小时
发表于 2016-9-2 11:02:14 | 显示全部楼层 |阅读模式
5金钱
大家好,在学习窗口看门狗时,按照原子哥的例程,仅仅对调中断服务函数中的两行语句,就发生了截然不同的现象:
原先正确的语句:
[mw_shl_code=c,true]
//窗口看门狗中断服务程序
void WWDG_IRQHandler(void)
{
WWDG_SetCounter(WWDG_CNT); //重设窗口看门狗值
WWDG_ClearFlag();//清除提前唤醒中断标志位
LED1=!LED1;
}
[/mw_shl_code]
这时下载代码到F407开发板后,DS1绿灯正确闪烁。

但是对调两句:
[mw_shl_code=c,true]
//窗口看门狗中断服务程序
void WWDG_IRQHandler(void)
{
WWDG_SetCounter(WWDG_CNT); //重设窗口看门狗值
LED1=!LED1;
WWDG_ClearFlag();//清除提前唤醒中断标志位
}
[/mw_shl_code]

这时下载到开发板后,DS0红灯不停的闪烁,表明系统一直在复位。

为何会出现这样的情况呢?

最佳答案

查看完整内容[请看2#楼]

这个现象无法解释。 窗口看门狗有点怪异,按我们的理解,调转这个是不会有问题。但是实际上,是不行的。你暂时记住,必须这样就行了,至于为什么,我暂时还没找到说法。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-9-2 11:02:15 | 显示全部楼层
这个现象无法解释。 窗口看门狗有点怪异,按我们的理解,调转这个是不会有问题。但是实际上,是不行的。你暂时记住,必须这样就行了,至于为什么,我暂时还没找到说法。。。
回复

使用道具 举报

94

主题

369

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2016-8-25
在线时间
485 小时
 楼主| 发表于 2016-9-2 20:21:34 | 显示全部楼层
本帖最后由 学习stm32f4 于 2016-9-2 20:30 编辑

在论坛里看到一篇帖子,和我的问题差不多。
难道将操作GPIO的语句放在WWDG_ClearFlag()之前就会引发复位吗?不解。。。

后来又看到另一篇帖子,建议不要在窗口看门狗中断里喂狗。。。。。

彻底凌乱了。。。。。。
最后附上按照原子哥的视频与代码重新排列的窗口看门狗初始化步骤顺序,希望有用。

注意:在第六步中断函数里喂狗的做法,有帖子不建议这样做。故可将该喂狗函数去除,在主函数里喂狗。
图片1.jpg
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-9-3 20:45:59 | 显示全部楼层
你可以在今年的ST峰会上面,问问ST的人员。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

94

主题

369

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2016-8-25
在线时间
485 小时
 楼主| 发表于 2016-9-3 20:55:27 | 显示全部楼层
正点原子 发表于 2016-9-3 20:45
你可以在今年的ST峰会上面,问问ST的人员。。。

谢谢原子哥。
很抱歉,我参加不了ST峰会。但我试试把这个问题发到ST的e2e communities里,看看有人知道否。若有回复,我就将结果贴到论坛里。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-9-3 22:07:04 | 显示全部楼层
学习stm32f4 发表于 2016-9-3 20:55
谢谢原子哥。
很抱歉,我参加不了ST峰会。但我试试把这个问题发到ST的e2e communities里,看看有人知道 ...

ok
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

94

主题

369

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2016-8-25
在线时间
485 小时
 楼主| 发表于 2016-9-4 15:26:56 | 显示全部楼层
本帖最后由 学习stm32f4 于 2016-9-5 21:18 编辑

原子哥好。

我把问题发到了这里,有人回复说:
“清除标志位的语句不能写在中断的最后一行,而应写在中断的开头或中间的某一行。”

我总结了一下他的回复要点:
1.“当标志位被清除后,这种“标志位被清除”事件需要一定的时间才能到达NVIC。”
2.“当程序指针离开中断的一刹那,NVIC检查是否有中断扔处于pending。”
结论:
“尽管在中断的最后一行写了清除中断标志位的语句,但由于标志位被清除这一事件到达NVIC需要一定的时间。而此时,程序指针即将要离开中断。这时,NVIC检查中断是否扔处于pending。由于在这一刹那,标志位清除事件未到达NVIC,故NVIC认为中断扔处于pending状态,程序指针重新进入中断,这就造成了中断重入。”

根据人家的回复,我将如图1、2的程序下载到开发板后,绿灯正常闪烁了。

不知道总结的对不对,望原子哥指正。。。

注:上面所述的内容,即“清除标志位的语句不能写在中断的最后一行,而应写在中断的开头或中间的某一行。”,似乎仅适用于WWDG,因为在原子哥的定时器中断实验这一节,清除标志位写到了中断服务函数的最后一行,下载到开发板后,程序正常运行。
看来WWDG的的确确很诡异。
1.jpg
2.jpg
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2016-12-27
在线时间
14 小时
发表于 2017-3-31 14:24:20 | 显示全部楼层
学习stm32f4 发表于 2016-9-4 15:26
原子哥好。

我把问题发到了这里,有人回复说:

我试了一下,将WWDG_ClearFlag();放在WWDG_SetCounter(WWDG_CNT);前面,中断服务函数就写这两句,程序正常,LED0就亮一下,然后灭掉,没有复位,貌似是您说的需要时间反应
回复

使用道具 举报

6

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2015-7-15
在线时间
36 小时
发表于 2017-11-26 10:50:44 | 显示全部楼层
你好,我在STM32F103的开发板对调了这两句,红灯只是开始闪烁一下,绿灯不停闪烁,没有出现你说的系统一直复位的情况
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 14:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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