六、独立看门狗
- IWDG简介
独立看门狗(Independent Watchdog,通常缩写为IWDG)主要作用是主要用于检测外界电磁干扰,或硬
件异常导致的程序跑飞问题。
IWDG本质上是一个12位的递减计数器。当计数器的值从某个初始值开始递减,并一直减到0时,系统
会产生一个复位信号(IWDG_RESET)。CPU在接收到这个复位信号后,会重新启动系统,以确保系统
从可能的错误或死锁状态中恢复。在计数器的值减到0之前,如果程序通过特定的“喂狗”操作(即重置计数器的值)来刷新计数器,那么
就不会产生复位信号,系统将继续正常运行。这种“喂狗”操作通常是由程序在正常运行时定期执行的,
以确保IWDG不会因计数器超时而产生复位信号。
它使用专用的低速时钟(LSI)作为时钟源,即使在主时钟发生故障时,IWDG仍然能够继续运行。
IWDG可以在停止模式和待机模式下工作,确保在这些模式下系统仍然受到保护。 - IWDG工作原理及框图
LSI 时钟频率并不精确,RC 频率会在 30kHz 到 60kHz 之间变化 ,F1 用 40kHz 进行计算即可。- IWDG寄存器及函数介绍
- IWDG溢出时间计算
IWDG配置流程
配置 IWDG 溢出时间为 1 秒左右,并验证未及时喂狗时系统将被复位
#include "iwdg.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);
}
/* 窗口看门狗主要用于检测软件异常*/
/* 独立看门狗主要用于检测硬件异常*/
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
led_init(); /* 初始化LED灯 */
uart1_init(115200);
printf("hello world!\r\n");
iwdg_init(IWDG_PRESCALER_32,1250);
printf("狗饿了\r\n");
if(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET)
{
printf("独立看门狗复位\r\n");
__HAL_RCC_CLEAR_RESET_FLAGS();//清除时钟相关的标志位
}
else
{
printf("外部复位");
}
while(1)
{
delay_ms(1500);
iwdg_feed();
printf("喂了\r\n");
}
}