OpenEdv-开源电子网

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

关于窗口看门狗的使用方法

[复制链接]

8

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2018-5-4
在线时间
27 小时
发表于 2019-8-24 10:22:44 | 显示全部楼层 |阅读模式
20金钱
小弟最近遇到了一个很头疼的问题,用F103系列的单片机做一个小项目,用到了16路定时器输入捕获去采集方波信号的频率,又用到了CAN总线。为了保证系统的稳定性,决定加上窗口看门狗功能。之前使用窗口看门狗,在主程序及调用的函数内放了很多喂狗函数,很麻烦,也算不好喂狗间隔时间,上电后第一次给定时器通道输入信号时会复位,复位后不管是再怎么移除或接入信号都不会复位了,可以正常工作。不过还有一种情况,就是在长时间没有信号输入的时候,再一次给定时器输入信号仍然有一定概率会复位。 初步怀疑是喂狗过早,但没有找到具体问题。 就是想问一下这种情况我在定时器中断里按时喂狗或者使用看门狗的中断喂狗是否可以?

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

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2019-8-24 11:33:23 | 显示全部楼层
窗口看门狗,一般都是在中断中喂狗,主程序中不用管。
  1. #include "wwdg.h"
  2. #include "led.h"

  3. u8 WWDG_CNT = 0x7f;


  4. void WWDG_NVIC_Init(void)
  5. {
  6.     NVIC_InitTypeDef NVIC_InitStructure;
  7.     NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;
  8.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
  9.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
  10.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  11.     NVIC_Init(&NVIC_InitStructure);
  12. }

  13. //初始化窗口看门狗
  14. //tr :T[6:0],计数器值
  15. //wr :W[6:0],窗口值
  16. //fprer:分频系数(WDGTB),仅最低 2 位有效
  17. //Fwwdg=PCLK1/(4096*2^fprer)
  18. void WWDG_Init(u8 tr, u8 wr, u32 fprer)
  19. {
  20.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); //时钟使能
  21.     WWDG_CNT = tr & WWDG_CNT;
  22.     WWDG_SetPrescaler(fprer);                                                        //设置预分频值
  23.     WWDG_SetWindowValue(wr);                                                        //设置窗口值 上窗口值
  24.     WWDG_Enable(WWDG_CNT);                                                                //使能看门狗,设置计数值
  25.     WWDG_ClearFlag();                                                                        //清除提前唤醒中断
  26.     WWDG_NVIC_Init();                                                                        //设置中断优先级
  27.     WWDG_EnableIT();                                                                        //开启窗口看门狗中断
  28. }
  29. void WWDG_Set_Counter(u8 cnt)
  30. {
  31.     WWDG_Enable(cnt);                                                                        //使能看门狗,设置计数值
  32. }
  33. void WWDG_IRQHandler(void)
  34. {
  35.     WWDG_SetCounter(WWDG_CNT);                                                        //喂狗
  36.     WWDG_ClearFlag();                                                                        //清除提前唤醒中断
  37.         LED0=!LED0;
  38. }
复制代码


回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 02:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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