OpenEdv-开源电子网

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

关于窗口看门狗程序顺序影响程序运行的个人理解及改进办法

[复制链接]

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2015-3-13
在线时间
13 小时
发表于 2015-3-15 01:08:42 | 显示全部楼层 |阅读模式
程序调试已经过了12点,之所以这么晚是因为窗口看门狗遇到了问题,遇到了跟大多数坛友一样的问题
当我将窗口看门狗初始化函数的顺序稍微变一下是,程序完全不按套路出牌。

先看看我开始的代码吧!
[mw_shl_code=c,true]WWDG_SetWindowValue(0x5f); WWDG_SetPrescaler(WWDG_Prescaler_8); WWDG_ClearFlag(); WWDG_SetCounter(0x7f); WWDG_Enable(0x7f);//错误写法 WWDG_EnableIT();[/mw_shl_code]
程序下载进去之后,DS0常亮

到底是什么原因呢?后来我改了好几回,却始终不见什么起色,
最后只好对着源码逐行更改,这一行不行,这一行也不行。。。。。。
但当我改变着一行的顺序时,终于可以了

修改后的代码:
[mw_shl_code=c,true]WWDG_Enable(0x7f); WWDG_SetWindowValue(0x5f); WWDG_SetPrescaler(WWDG_Prescaler_8); WWDG_ClearFlag(); /WWDG_SetCounter(0x7f); WWDG_EnableIT();[/mw_shl_code]
再后来我在ST官方指南上看到这样一句话:


那么我们可以想象这样一种情况:
程序开始运行,递减计数器运行,T6没被设置,低于窗口值产生复位信号,
然后重新进入主程序继续点亮DS0,这一次跟上次是一样的运行条件,
所以这次一样会产生复位信号,这样的话,我们的程序就在窗口初始化函数之前进入死循环了;
所以会看到DS0一直亮,没有进入主程序的死循环;

这样一来,以后每次操作窗口寄存器的时候首先应该写Enable()函数
这样的话可以在启用时马上装初值,实测通过。

ps:我也是ARM初学者,很多寄存器都不熟悉,以上只是个人调试程序之后的见解,
难免有不当之处,还请大家指正。

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

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2018-8-28
在线时间
1 小时
发表于 2018-8-28 21:46:54 | 显示全部楼层
本帖最后由 zhanlith 于 2018-8-28 21:49 编辑

但是WWDG_Enable(0x7f)函数不是先放入初值再打开看门狗吗?这样的话WWDG_Enable(0x7f)放在哪里不应该都是没有区别的么
无论计时器里值减到多少,一旦使能了应该立刻计时器内值就变成了0x7f,不会有影响才对啊?
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-3-16 00:16:55 | 显示全部楼层
不错,谢谢分享。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2015-3-13
在线时间
13 小时
 楼主| 发表于 2015-3-23 21:43:27 | 显示全部楼层
多谢原子哥支持
回复 支持 反对

使用道具 举报

9

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-1-28
在线时间
37 小时
发表于 2016-2-26 00:26:30 | 显示全部楼层
本帖最后由 yibiejiangtian 于 2016-2-26 07:15 编辑

应该是楼主说的那样
回复 支持 反对

使用道具 举报

1

主题

66

帖子

0

精华

高级会员

Rank: 4

积分
526
金钱
526
注册时间
2018-8-13
在线时间
62 小时
发表于 2018-9-4 09:57:00 | 显示全部楼层
不是这样的,把WWDG_ClearFlag()这条语句放到WWDG_Enable(0x7f)后面就可以了。
WWDG_SetWindowValue(0x5f);
WWDG_SetPrescaler(WWDG_Prescaler_8);
WWDG_SetCounter(0x7f);
WWDG_Enable(0x7f);//错误写法
WWDG_ClearFlag();
WWDG_EnableIT();
这样就能运行了。
回复 支持 反对

使用道具 举报

3

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2015-8-12
在线时间
19 小时
发表于 2019-9-11 14:39:21 | 显示全部楼层
有参考价值
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2019-9-10
在线时间
12 小时
发表于 2019-9-27 10:59:11 | 显示全部楼层
谢谢分享~我在窗口看门狗也遇到了不能进入中断函数的问题,楼主可以点击我的头像看看我的问题,谢谢楼主!!!
把使能函数放在最开头仍然不行,希望可以得到解决!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-7-13
在线时间
5 小时
发表于 2020-8-4 14:34:12 | 显示全部楼层
正解,5年后我也发现了这个问题
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2020-9-3
在线时间
5 小时
发表于 2020-12-24 00:42:48 | 显示全部楼层
不是这样的  这里2楼有正确的原因http://www.openedv.com/forum.php ... A%BF%B4%C3%C5%B9%B7
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2020-7-2
在线时间
11 小时
发表于 2021-1-27 22:27:28 | 显示全部楼层
看似是小问题  但是搞明白不容易   需要很细心  赞赞赞
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 14:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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