独立开门狗 IWDG

①独立开门狗简介

主要作用是用于检测外界电磁干扰  或硬件异常导致的程序跑飞问题

        IWDG本质上是一个12位的递减计数器  当计数器的值从某个初始值开始递减  并一直减到0时,系统会产生一个复位信号(IWDG_RESET)CPU在接收到这个复位信号后 会重新启动系统  以确保系统从可能的错误或死锁状态下恢复。

        在计数器的值见到0之前,如果程序通过特定的“喂狗”操作(或重置计数器的值)来刷新计数器 那么就不会产生复位信号 系统将继续正常运行 。

       他使用专门的低速时钟(LSI)作为时钟源 及时在主时钟发生故障时,IWDG可以在停止模式和待机模式下工作,确保在这些模式下系统仍然受到保护。 

原理图如下:

②独立看门狗寄存器介绍

③IWDG溢出时间计算

其中预分频系数即为psc   F(iwdg)  默认为40k     下表中最短时间是指计一个数值  最长时间是指计最大值  2^12=4096  

主函数如下:

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "iwdg.h"


int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    led_init();
    iwdg_init(IWDG_PRESCALER_32,1250-1);      //设置iwdg独立看门狗溢出时间为1s
    uart1_init(115200);
    printf("hello world!\r\n");
    printf("狗子真的饿了!\r\n");
    
    /*检验是否为IWDG的复位*/
    if(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET)
    {
        printf("IWDG的复位\r\n");
        __HAL_RCC_CLEAR_RESET_FLAGS();
    }
    else{
        printf("外部复位\r\n");
    
    
        
    
    }
    while(1)
    { 
       delay_ms(500);        //必须在溢出时间(1s)内进行喂狗   
       iwdg_feed();     
       printf("狗子已经喂饱了\r\n");

    }
}

  

iwdg.c文件如下

#include "iwdg.h"
#include "stdio.h"


IWDG_HandleTypeDef  iwdg_handle ={0};
void iwdg_init(uint8_t psc ,uint16_t rlr)
{   
    iwdg_handle.Instance = IWDG;
    iwdg_handle.Init.Prescaler = psc;
    iwdg_handle.Init.Reload = rlr;
    
    HAL_IWDG_Init(&iwdg_handle);

}


void iwdg_feed(void)
{
    HAL_IWDG_Refresh(&iwdg_handle);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值