①独立开门狗简介
主要作用是用于检测外界电磁干扰 或硬件异常导致的程序跑飞问题
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);
}