1、WWDG简介  

  窗口看门狗(WWDG)通常被用来检测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。

  WWDG是一个不断往下递减的计数器。当WWDG的计数器递减到固定值0x40时,还没有重新赋值计数值(俗称喂狗),就会产生一个复位信号,使芯片复位,这个0x40的固定值就叫做窗口的下限值,窗口下限值不需要设置。

  WWDG还有一个窗口上限值,当WWDG的计数器的值大于窗口上限值的时候,如果给WWDG的计数器重新赋值(喂狗),也会产生一个复位信号,使芯片复位,窗口的上限值可以通过程序设置。

  也就是说在使用WWDG的时候,给WWDG的计数器重新赋值不能够太早,也不能够太晚,必须在一定时间之内。

2、WWDG的时间计算

  WWDG是挂载在APB1总线上的外设,所以WWDG的时钟源来自PCLK1。需要注意的是PCLK1在给WWDG提供时钟源的时候已经被4096分频了,这个分频是芯片默认的,没办法更改。所以WWDG时钟的时钟源应该是PCLK1/4096。

  由于WWDG不像IWDG一样有独立的时钟源,在使用WWDG的时候,需要先使能WWDG的时钟,否则无法使用。

  WWDG的时钟可以被分频,通过配置WWDG_CFR配置寄存器的BIT8~BIT7位的WDGTB[1:0]可以对来自PCLK1/4096的时钟进行分频,如下:

  • WDGTB[1:0] = 00:WWDG的计数器时钟来自PCLK1/4096后再除以1。
  • WDGTB[1:0] = 01:WWDG的计数器时钟来自PCLK1/4096后再除以2。
  • WDGTB[1:0] = 10:WWDG的计数器时钟来自PCLK1/4096后再除以4。
  • WDGTB[1:0] = 11:WWDG的计数器时钟来自PCLK1/4096后再除以8。

  所以WWDG的时钟计算公式如下:

  WWDG_CLK = PCLK1/(4096*PR)

  PCLK1是APB1总线时钟,PR是WWDG的分频系数。

  得出WWDG的时钟大小之后,就可以算出WWDG的计数器每递减一次所经过的时间,如下:

  Step_time = 1/WWDG_CLK = (4096*PR)/PCLK1

  如果PCLK1的单位为MHZ,那么计算出来的单位就是us级;如果PCLK1的单位为KHZ,那么计算出来的单位就是ms级。

  假设PCLK1 = 36MHZ,那么WWDG的最小超时时间为:

    • 当WDGTB = 0时,WWDG的最小超时时间为:time = (4096*1)/36(us) = 113(us)。
    • 当WDGTB = 1时,WWDG的最小超时时间为:time = (4096*2)/36(us) = 227(us)。
    • 当WDGTB = 2时,WWDG的最小超时时间为:time = (4096*4)/36(us) = 455(us)。
    • 当WDGTB = 3时,WWDG的最小超时时间为:time = (4096*8)/36(us) = 910(us)。

  得出WWDG计数器每递减一次所经过的时间后,还需要根据WWDG计数器的初值和固定值0x40计算WWDG计数器的递减次数。假设初值设置为X,那么WWDG产生复位信号的时间计算如下:

  Twwdg = ((4096*PR)/PCLK1)*(X - 0x40)

3、WWDG的窗口值

  WWDG计数器的值必须在一个范围内才可以重新赋值,这个范围又窗口上限值和窗口下限值组成。

  WWDG的窗口下限值是一个固定值,该值固定位0x40。

  WWDG的窗口上限值是由WWDG_CFR配置寄存器的BIT6~BIT0位组成。WWDG的窗口上限值必须大于固定值0x40,如果小于等于固定值0x40就失去了窗口的价值,而且也不能大于计数器的值,由于WDG计数器的最大值为0x7F,所以WWDG的窗口上限值必须小于0x7F。

  在实际使用中,一般使用WWDG的中断功能,在中断服务函数中对WWDG进行喂狗。如果开启了WWDG的中断功能,当WWDG的计数器逐渐递减到0x40的时候就会产生中断,在中断服务函数内对WWDG的计数器重新赋值。如果WWDG的计数器递减到0x3F时,WWDG的计数器还没有重新赋值,那么就会产生复位。      

3、WWDG配置流程

  在使用WWDG之前,必须先使能WWDG的时钟,否者无法使用WWDG的功能。

  通过WWDG_CFR配置寄存器设置WWDG的时钟分频系数、窗口上限值、中断启动。

  通过WWDG_CR控制寄存器设置WWDG的使能、计数器初值。

  通过NVIC配置WWDG的中断分组、优先级、中断使能。

  编写中断服务函数进行喂狗操作。

4、HAL库操作WWDG

  初始化代码如下:

WWDG_HandleTypeDef WWDG_Handle_Init;

void WWDG_Init(void)
{
__HAL_RCC_WWDG_CLK_ENABLE(); WWDG_Handle_Init.Instance = WWDG;
WWDG_Handle_Init.Init.Prescaler = WWDG_PRESCALER_8;
WWDG_Handle_Init.Init.Counter = 0x7F;
WWDG_Handle_Init.Init.Window = 0x5F;
WWDG_Handle_Init.Init.EWIMode = WWDG_EWI_ENABLE; HAL_WWDG_Init(&WWDG_Handle_Init); HAL_NVIC_SetPriority(WWDG_IRQn,,);
HAL_NVIC_EnableIRQ(WWDG_IRQn);
}

  首先定义一个WWDG的句柄结构体变量,该变量是一个全局变量。    

  通过HAL_WWDG_Init函数对WWDG进行初始化,设置分频系数、计数器初值、窗口上限值,开启中断。

  通过HAL_NVIC_SetPriority函数设置WWDG的中断优先级。

  通过HAL_NVIC_EnableIRQ函数使能WWDG的中断功能。

  WWDG中断服务函数如下:

void WWDG_IRQHandler(void )
{
HAL_WWDG_IRQHandler(&WWDG_Handle_Init);
} void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
HAL_WWDG_Refresh(&WWDG_Handle_Init);
}  

  HAL_WWDG_EarlyWakeupCallback是WWDG的回调函数,在HAL_WWDG_IRQHandler函数中调用。

  通过HAL_WWDG_Refresh函数对WWDG的计数器进行重新赋值。

STM32F103ZET6窗口看门狗的更多相关文章

  1. STM32之独立看门狗与窗口看门狗总结

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

  2. STM8s窗口看门狗

    看看窗口看门狗的框图 从图里看出产生复位信号有2个方式: 1 WDGCR寄存器的T6 由1变0,也就是从此寄存器的值从0x40变成0x3F会产生复位信号: 2 当寄存器WDGCR的值大于WDGWR的时 ...

  3. stm8的独立看门狗与窗口看门狗

    STM8拥有两个硬件看门狗,分别叫做独立看门狗和窗口看门狗 独立看门狗的框图如下 我们可以看到,独立看门狗的时钟来自于LSI内部低速振荡器,经过二分频到达看门狗外设单元,在经过一个七位的预分频到达计数 ...

  4. STM32之独立看门狗(IWDG)与窗口看门狗(WWDG)总结

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

  5. STM32(10)——窗口看门狗

    简介: 窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障.除非递减计数器的值在 T6 位 (WWDG->CR 的第六位)变成 0 ...

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

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

  7. stm32 窗口看门狗学习(一)

    什么是窗口看门狗? 1)独立看门狗                限制喂狗时间在0-x内,x由相关寄存器决定.喂狗的时间不能过晚. 2)窗口看门狗               之所以称为窗口就是因为其 ...

  8. 第35章 WWDG—窗口看门狗—零死角玩转STM32-F429系列

    第35章     WWDG—窗口看门狗 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

  9. STM32F407 窗口看门狗 个人笔记

    窗口看门狗的喂狗时间范围 由框图知: 复位条件是:当且仅当 { 启动位启动 且 { T6为0 (计数器的值减小到0X03F即下限,还没喂狗,即喂狗太晚) 或 计数器的值高于上限时喂狗,即喂狗太早 } ...

随机推荐

  1. 【vue】---- 图片懒加载

    1.作用 在图片较多的页面中,页面加载性能较差.使用图片懒加载可以让图片出现在可视区域时再进行加载,从而提高用户体验. 2.原理 设置img标签的src属性为空或统一的图片路径(如加载中样式),监听页 ...

  2. 浏览器的重绘与回流(Reflow & Repaint)介绍

    重绘 当页面元素样式改变不影响元素在文档流中的位置时(如background-color,border-color,visibility),浏览器只会将新样式赋予元素并进行重新绘制操作. 回流 当改变 ...

  3. Java反射之成员方法的反射

    上一篇介绍了Java反射之成员变量的反射,这次介绍成员方法的反射. [一]Method类 Method类中封装了所有java方法的属性,包括该方法是否私有,该方法的修饰符,返回值,参数,抛的错误等等. ...

  4. CUDA Pro Tip: Write Flexible Kernels with Grid-Stride Loops

    https://devblogs.nvidia.com/cuda-pro-tip-write-flexible-kernels-grid-stride-loops/ One of the most c ...

  5. centos下配置Nginx

    首先NGINX是一个高效的HTTP和反向代理的服务器,这里记录一下它的安装方式和文件结构方便以后查看.同时Linux系统具有灵活性,其他的东西可查看具体的官网信息:https://nginx.org/ ...

  6. maven中的pom配置文件一——spring,mybatis,oracle,jstl,json,文件上传

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  7. Python3学习之路~9.4 队列、生产者消费者模型

    一 队列queue 当必须在多个线程之间安全地交换信息时,队列在线程编程中特别有用. 队列的作用:1.解耦,使程序直接实现松耦合 2.提高处理效率 列表与队列都是有顺序的,但是他们之间有一个很大的区别 ...

  8. Spring Boot入门系列(八)整合定时任务Task,一秒搞定定时任务

    前面介绍了Spring Boot 中的整合Redis缓存已经如何实现数据缓存功能.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/categ ...

  9. MyBatis框架——逆向工程

    什么是逆向工程? 逆向工程师MyBatis提供的一种自动化配置方案,针对数据表自动生成MyBatis所需的各种资源,包括实体类.Mapper接口.Mapper.xml,但是逆向工程的缺陷在于只能针对单 ...

  10. CF1324F Maximum White Subtree 题解

    原题链接 简要题意: 给定一棵树,每个点有黑白两种颜色:对每个节点,求出包含当前节点的连通图,使得白点数与黑点数差最小.输出这些值. F题也这么简单,咳咳,要是我也熬夜打上那么一场...可惜没时间打啊 ...