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. javascript设计模式和开发实践(阶段一)

    1,设计模式的作用:让人们写出可复用和可维护性高的程序,代价可能是,额外增加代码量: 比较形象的例子:空房间里面放东西,如果日复一日的往里面扔东西,时间久了,很难找到自己想要的东西,调整也不容易,但是 ...

  2. 浅谈静态布局、流式布局,rem布局,弹性布局、响应式布局

    静态布局: 特点:没有兼容性问题 PC:居中布局,所有样式使用绝对宽度/高度(px),设计一个Layout,在屏幕宽高有调整时,使用横向和竖向的滚动条来查阅被遮掩部分:移动设备:另外建立移动网站,单独 ...

  3. ggplot2(9) 数据操作

    9.1 plyr包简介 ddply {plyr}: Split data frame, apply function, and return results in a data frame. ddpl ...

  4. layui的form表单的checkbox全选与全不选问题

    <!DOCTYPE html> <html> <head>     <meta charset="utf-8">     <m ...

  5. ReentrantReadWriteLock 源码分析以及 AQS 共享锁 (二)

    前言 上一篇讲解了 AQS 的独占锁部分(参看:ReentrantLock 源码分析以及 AQS (一)),这一篇将介绍 AQS 的共享锁,以及基于共享锁实现读写锁分离的 ReentrantReadW ...

  6. django 和 七牛云 交互

    django 和 七牛云 交互 七牛开发文档 安装 pip install qiniu 初始化 # access_key 个人中心的 ak # secret_key 个人中心的 sk from qin ...

  7. angular vue通过node启动项目局域网内关闭防火墙无法访问的解决办法

    先试 ng serve --host 0.0.0.0 不行再试 ng serve --host 0.0.0.0 --disable-host-check

  8. Swift:字符串(String)分割之Substring优雅转换

    认识Substring类型 这是一个全新的类型,看类名像是String的子类,但是大家千万别被误导了,Substring并不是String的子类,这是两个不同的类型,但是它们都继承了StringPro ...

  9. 记录一次云主机部署openstack的血泪史

    看见这个部署成功的留下了激动的泪水 经过长时间的BUG苦肝终于成功部署成功  部署的环境2vCPU 8GB 阿里云主机,部署成功以后内存占用确实蛮高的 记录这一次踩坑,给后来者避免踩坑时间,个人踩坑踩 ...

  10. [CVPR 2019]Normalized Object Coordinate Space for Category-Level 6D Object Pose and Size Estimation

    论文地址:https://arxiv.org/abs/1901.02970    github链接:https://github.com/hughw19/NOCS_CVPR2019 类别级6D物体位姿 ...