STM32中的两条狗---(第一条)独立看门狗

1. IWDG简介

独立看门狗(Independent Watchdog,通常缩写为IWDG)主要作用是主要用于检测外界电磁干扰,或硬 件异常导致的程序跑飞问题。

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

在计数器的值减到0之前,如果程序通过特定的“喂狗”操作(即重置计数器的值)来刷新计数器,那么 就不会产生复位信号,系统将继续正常运行。这种“喂狗”操作通常是由程序在正常运行时定期执行的, 以确保IWDG不会因计数器超时而产生复位信号。

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

 2. IWDG工作原理及框图

 

3. IWDG寄存器及函数介绍

 

4. IWDG溢出时间计算

 

 

 

只有低16为有效,写入一堆奇葩的数字不会轻易被其他数字影响

 12位有效,看门口本身就是12位的

用的不多

库函数HAL_IWDG_Init()、HAL_IWDG_Refresh()

小实验:独立看门狗喂狗实验

实验目的

配置 IWDG 溢出时间为 1 秒左右,并验证未及时喂狗时系统将被复位。

硬件清单

独立看门狗初始化

//执行的程序有取消预分频器及重装载寄存器写保护
//设置IWDG预分频系数及重装载值
//启动IWDG

#include "iwdg.h"

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);
}
#include "uart1.h"
int main(void)
{
    HAL_Init();
    stm32_clock_init(RCC_PLL_MUL9);
    led_init();
    uart1_init(115200);
    iwdg_init(IWDG_PRESCALER_64,625);//如果用32,1250不稳定
    printf("狗儿肚子饿了,再不喂他的话就咬人了!\r\n");
    
    if(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET)
    {
        printf("独立看门狗复位!\r\n");
        __HAL_RCC_CLEAR_RESET_FLAGS();
}
    else
    {
        printf("外部复位!\r\n");
}
    while(1)
    {
        delay_ms(1500);
        iwdg_feed();
        printf("狗儿已经位饱了,不会咬人了!\r\n");
    }//任然不确定什么原因 导致的复位需要用到一个函数第29位位置
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值