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. Feign 在 SpringCloud 中的使用 四

    此处就单纯写一个消费者服务,通过Feign来调用生产者中的接口,生产者中的接口可以自己随便定义一个,前面博客中也有代码 1.导入springcloud Feign的jar包 <parent> ...

  2. php Rabbitmq扩展安装坑点

    pecl install amqp 出现 checking for amqp using pkg-config... configure: error: librabbitmq not found 这 ...

  3. json中存整形数值,前端返回为空

    实现目标: 在servlet中将整型数值转为json,然后在前端获取 问题描述: 前端获取为空,显示为:console.log打印为:{} 解决办法: 在servlet中将数值转为json格式再进行传 ...

  4. 使用VS2017进行Python代码的编写并打印出九九乘法表

    我们来盘一盘怎么使用VS2017进行python代码的编写并打印出九九乘法表. 使用Visual Studio 2017进行Python编程不需要太复杂的工作,只需要vs2017安装好对Python的 ...

  5. (转)C++ 虚函数表解析

    原文地址:http://blog.csdn.net/haoel/article/details/1948051 C++ 虚函数表解析 陈皓 http://blog.csdn.net/haoel 前言 ...

  6. go源码分析(三) 使用go http包开发web时遇到的坑之卸载插件,重启插件管理,仍然可以访问已经卸载的插件

    问题描述: web页面下发重启指令后,对卸载插件的处理不完整(虽然列表已经没有插件描述,但是在HandleFunc的路由列表中依然存在) 我们需要清空路由列表map 路由列表结构见代码: net/ht ...

  7. javaWeb_Css

    CSS HTML页面实在太丑了,怎么破?! 第1章 CSS简介 CSS全称为“层叠样式表 (Cascading Style Sheets)”,它主要是用于定义HTML元素(或内容)在浏览器内的显示样式 ...

  8. Shiro RememberMe 1.2.4 反序列化命令执行漏洞复现

    影响版本 Apache Shiro <= 1.2.4 产生原因 shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cook ...

  9. datetime和time

    datetime和time 1.datetime模块 import datetimenow = datetime.datetime.now() #时间对象print(now,type(now))pri ...

  10. C++技法杂记

    C++ 技法杂技杂记 1. 枚举 1.1 枚举继承(Enum Inheritance) struct Enum{ enum{ One = 1, Two, Last }; }; struct EnumD ...