什么是窗口看门狗?

1)独立看门狗  
             限制喂狗时间在0-x内,x由相关寄存器决定。喂狗的时间不能过晚。
2)窗口看门狗 
             之所以称为窗口就是因为其喂狗时间是一个“窗口”,不能过早也不能过晚。

STM32F10x 的窗口看门狗中有一个7位的递减计数器,出现下述2种情况之一时产生看门狗复位:  

1)当计数器的数值从0x40减到0x3F时 ,这里的0x3F可以看成是窗口的下限;  

2)喂狗的时候,如果计数器的值大于某一设定数值(这个数值是窗口的上限),此数值在WWDG_CFR寄存器中配置。

对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗。但这有一个隐患,有可能程序跑乱了又跑回到正常的地方,或者说跑乱的程序正好执行了刷新看门狗操作,这样的情况一般的看门狗不好检测;

如果使用窗口看门狗,程序员可以根据程序正常执行的时间设置一个时间窗口,保证不会提前刷新看门狗也不会滞后刷新看门狗,这样可以检测出程序没有按照正常的路径运行的情况。

如果非要说窗口看门狗的具体应用,我一时也说不上来,因为没有用过。但是这不妨碍我们做实验学习窗口看门狗。

先看一幅图,直观地认识窗口看门狗。

T[6:0]是一个7位的递减计数器,我们刷新看门狗,就是重载这个计数器;W[6:0]是提前配置好的一个数值,作为窗口的上限;0x3F是窗口的下限,是固定值,程序无法修改。

假如设置T[6:0]的重载值是0x7F,  W[6:0]为0x5F,  那么计数器从0x7F递减到0x5F的过程中(也就是T[6:0]大于W[6:0]的时候),是不能喂狗的。如果喂狗就会复位。

当T[6:0]从W[6:0]递减到0x3F的过程中,需要喂狗,不然计数器等于0x3F的时候就会复位。

时间怎么计算?

根据手册,计数器的计数周期 = T_PCLK1 * 2^WDGTB * 4096,

这里WDGTB是预分频系数,取值范围是(0,1,2,3)

假设我们实验中PCLK1的频率是36MHz,WDGTB取3,那么计数器的计数周期

T = (1/(36M))* 8 * 4096(s)= 910.222 us

我们设计一下实验一。

1.实验中PCLK1的频率是36MHz,WDGTB取3;

2.T[6:0]设置为0x7F,W[6:0]设置为0x41; 那么刷新窗口就是(0x41~0x3F), 在(0x7F~0x41)是不允许刷新的;

不允许刷新的时间 = (0x7F - 0x41) * 910.222 us = 56.43 ms

3.我们在在(0x7F~0x41)这段时间刷新,看看是不是复位(预期结果是一定复位)。

<span style="font-size:18px;"><span style="font-size:18px;">//初始化窗口看门狗
//tr :T[6:0],计数器初始值
//wr :W[6:0],窗口上限
//fprer:预分频系数,WDGTB[1:0]
//计数器的计数频率 F_wwdg = PCLK1/(4096*2^fprer). void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{ RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);  //   WWDG时钟使能WWDG_SetPrescaler(fprer);//设置预分频系数WWDG_SetWindowValue(wr);//设置窗口上限WWDG_Enable(tr);  //设置计数器初值并且使能看门狗                  } </span></span>

喂狗的函数是:

<span style="font-size:18px;"><span style="font-size:18px;">void WWDG_SetCounter(uint8_t Counter)</span></span>

看看main函数。

<span style="font-size:18px;">int main(void)
{   delay_init();        uart_init(9600);    LED_Init();printf("Hello World ! \r\n");delay_ms(970);WWDG_Init(0x7F,0x41,3);//窗口看门狗初始化delay_ms(30); //必须小于56.43msWWDG_SetCounter(0x7F); //喂狗,应该产生复位while(1){LED0 = !LED0;delay_ms(300);   }}</span>

看看实验结果。


确实1s左右会重启一次。

如果我们不喂狗,把那行语句注释调

<span style="font-size:18px;">//WWDG_SetCounter(0x7F);  //喂狗,应该产生复位</span>

结果是也会复位,但是LED没有闪烁,为什么呢?估计是还没有执行到操作LED的语句的时候就复位了。

<span style="font-size:18px;">//delay_ms(30); </span>

把这句也注释了,就可以看到灯的闪烁。

实验二

1.实验中PCLK1的频率是36MHz,WDGTB取3;

2.T[6:0]设置为0x7F,W[6:0]设置为0x7E; 那么刷新窗口就是(0x7E~0x3F), 在(0x7F~0x7E)是不允许刷新的;

不允许刷新的时间 = (0x7F - 0x7E) * 910.222 us = 0.91 ms

3.我们在在(0x7E~0x3F),这段时间刷新,看看是不是复位(预期结果是不复位)。

<span style="font-size:18px;">int main(void)
{   delay_init();             uart_init(9600);  LED_Init();delay_ms(200);LED0=0; //led onprintf("Hello World ! \r\n");delay_ms(200);LED0= 1; //led offWWDG_Init(0x7F,0x7E,3); while(1){delay_ms(1);  WWDG_SetCounter(0x7F); //喂狗}}
</span>

实验结果是不复位,灯不闪烁,串口也不打印。

如果把喂狗的语句注释调,就会看到灯一直在闪烁,串口一直打印,说明一直复位。

上面的代码,喂狗的时间不好掌握,很容易错过窗口。参考网上的例子,有一种查询的方法喂狗。

 while(1){if((WWDG->CR & 0x7F) == 0x55)WWDG_SetCounter(0x7F);   }

今天就说到这里,下次接着玩。

stm32 窗口看门狗学习(一)相关推荐

  1. stm32 窗口看门狗学习(二)

    窗口看门狗有一个提前唤醒中断,如果开启这个中断,那么当计数器的值达到0x40的时候就会产生这个中断. 上次的代码加一点就可以做这个实验了. void WWDG_Init(u8 tr,u8 wr,u32 ...

  2. STM32窗口看门狗的喂狗初值传递的思考

    STM32窗口看门狗的喂狗初值传递的思考 来CSDN好久了,看了很多文章,也学到了很多宝贵的经验,对学习stm32单片机帮助很大, 利用原子哥的精英板学习窗口看门狗的过程中,有点疑问,在此写下来,希望 ...

  3. STM32—窗口看门狗(WWDG)

    STM32-窗口看门狗(WWDG) 窗口看门狗(WWDG) STM32-窗口看门狗(WWDG) 窗口看门狗(WWDG) WWDG 简介 WWDG 功能框图剖析 窗口看门狗时钟 计数器时钟 计数器 窗口 ...

  4. STM32窗口看门狗

    一.介绍 STM32看门狗分为独立看门狗和窗口看门狗两种,两者使用调条件如下所示: IWDG和WWDG两者特点如下图所示: 二.WWDG原理介绍 寄存器 控制寄存器(WWDG_CR),只有低八位有效. ...

  5. stm32 独立看门狗学习

    STM32F10xxx内置两个看门狗,提供了更高的安全性.时间的精确性和使用的灵活性.两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障. 独立看门狗(IWDG)由专用的低速 ...

  6. STM32——窗口看门狗

    main.c /********************************************************* ** FileName: 看门狗实验 ** Description: ...

  7. stm32看门狗_STM32单片机:独立看门狗、窗口看门狗的配置

    SATM32单片机的看门狗有独立看门狗和窗口看门狗之分,这两者的工作原理却完全不同,今天来看一下他们的具体区别和配置方法.▍STM32独立看门狗由专门的低速时钟(LSI)驱动,即便是主时钟发生故障它仍 ...

  8. 独立看门狗/窗口看门狗

    一.独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效. 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路 ...

  9. STM32学习心得十七:窗口看门狗(WWDG)实验及旧知识点复习

    记录一下,方便以后翻阅~ 主要内容: 1) 窗口看门狗概述: 2) 常用寄存器和库函数配置: 3) 窗口看门狗实验. 窗口看门狗实验内容: 为了对之前的知识进行总结复习,本人在教学案例的基础上又&qu ...

最新文章

  1. cache.config配置文件解读
  2. 如何在开发资源或能力不足的情况下进行敏捷开发?
  3. 昨天日志 今天日志的获取方法
  4. javaEE 飞机大战
  5. video标签 api
  6. linux分屏显示文件行数,linux常用命令集合1
  7. Matlab之矩阵行列式、秩、迹的求解
  8. 现代软件工程 阅读笔记
  9. 有什么可以测试耳机性能的软件吗,什么是耳机音质测试软件?
  10. 蚂蚁金服测试开发工程师面试
  11. 正弦交流电的最大值、有效值、和瞬间值概念解析和计算
  12. 可行性研究报告【列文】2022-5.6
  13. 百度2017春招笔试真题编程题集合--买帽子
  14. 迈向大神之路day006
  15. Up in the Air-16
  16. 从赤壁之战看刘备与曹操暴露的最大差距
  17. gltf骨骼动画解析笔记
  18. Python神经网络编程 | 专场送书活动
  19. NodeJS相关笔记(一)
  20. 搭建hyperledger cello

热门文章

  1. Pod定义YAML文件详解
  2. 校园表白墙APP使用体验
  3. python3 正则表达式点星问号(.*?)能不能匹配换行符?不能的话应该怎么写
  4. Linux下route add 命令加入路由列表
  5. Spring IO Platform简介及示例
  6. 鼠标聚焦到Input输入框时,按回车键刷新页面原因及解决方法
  7. 在js中的replace方法详解
  8. 图书《图像并行处理技术》简介
  9. 安装Tensorflow出现错误提示conda activate tensorflow-cpu Could not find conda environment: tenso
  10. XGBoost:Python下 安装