STM32·HAL库开发(十三)WWDG窗口看门狗——案例:EWI中断喂狗

目录

【窗口看门狗】

【窗口看门狗工作原理】

【窗口看门狗框图】

【控制寄存器WWDG_CR】

【配置寄存器WWDG_CFR】

【状态寄存器WWDG_SR】

        超时时间计算公式:

【demo · WWDG】


【窗口看门狗】

        独立看门狗主要用于检测硬件异常,串口看门狗主要用于检测软件异常
        窗口看门狗用于监测单片机程序运行时效是否精准,主要检测软件异常,一般用于需要精准检测程序运行时间的场合。

        窗口看门狗的本质是一个能产生   系统复位信号   和   提前唤醒中断   6 位计数器。
        
         产生复位条件:
               ●  当递减计数器值从 0x40 减到 0x3F 时复位(即 T6 位跳变到 0
               ●  计数器的值大于 W[6:0] 值时喂狗会复位
         产生中断条件:
               ●  当递减计数器等于 0x40 时可产生提前唤醒中断 (EWI) (是可以,非一定,看配置)
               提前唤醒中断一般用于保存数据,因为即将复位
       
        在窗口期内重装载计数器的值,防止复位,也就是所谓的喂狗

【窗口看门狗工作原理】

【窗口看门狗框图】

        PCLK1_MAX = 36 MHz

【控制寄存器WWDG_CR】

【配置寄存器WWDG_CFR】

【状态寄存器WWDG_SR】

        超时时间计算公式:

                ●  T_out是WWDG超时时间(没喂狗)
                ●  F_wwdg是WWDG的时钟源频率PCLK1(最大36M)
                ●  4096是WWDG固定的预分频系数
                ●  2^WDGTB是WWDG_CFR配置寄存器设置的预分频系数值
                ●  T[5:0]是WWDG计数器低 6 位,最多 63

【demo · WWDG】

        demo概述:
        开启窗口看门狗,计数器值设置为 0X7F ,窗口值设置为 0X5F ,预分频系数为 8 。程序启动时循环点亮、熄灭LED,设置时间间隔。在提前唤醒中断服务函数进行喂狗。
        其中0X7F(即127)为计数器最大值,8为预分频系数最大值,通过下面的计算可知喂狗间隔需小于58.25 ms,且因为Early wakeup interrupt 和普通NVIC不一样,无法设置其NVIC优先级,故demo现象如下:

        当循环点亮、熄灭LED的时间间隔<58ms时,程序喂狗正常,LED时钟闪烁
        当循环点亮、熄灭LED的时间间隔≥58.25ms时,程序喂狗异常,LED常量

        计算:
                T_out = 4096 * 8 * 64 ÷ (36 * 1000000) =   0.058254 s   =   58.25 ms      
                T_window = 4096 * 8 * 32 ÷ (36 * 1000000)= 29.13 ms

        其中:
                64 = 127-63
                32 = 127-95

        由此可知,在36MHz的条件下,58.25 ms为喂狗间隔的最大值

        接线:LED——PC13

注意:Early wakeup interrupt 和普通NVIC不一样,在NVIC设置中找不到该项

初始化函数

MX_WWDG_Init();

 喂狗函数

void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
HAL_WWDG_Refresh(hwwdg);
}

demo代码

/* wwdg.c */

void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
	HAL_WWDG_Refresh(hwwdg);
}
/* main.c */

#include "main.h"
#include "wwdg.h"
#include "gpio.h"

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_WWDG_Init();
    while (1)
  {
		HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin,GPIO_PIN_RESET);
		HAL_Delay(40);
		HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin,GPIO_PIN_SET);
		HAL_Delay(40);
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值