基本概念
看门狗解决的问题是什么?
在系统跑飞(程序异常执行)的情况,是系统复位,程序重新执行。
独立看门狗适应用于需要看门狗作为一个在主程序之外能够完全独立工作,并且对时间精度要求低的场合。
工作原理
在键值寄存器中写入0xCCCC,开始启用独立看门狗,此时计数器开始从其复位值递减,当计数器值计数到0时会产生一个复位信号。
无论何时,只要在键值寄存器中写入0xAAAA,重装载寄存器的值就会重新加载到计数器,从而避免计数器到0,产生复位信号。如果程序异常,就无法往键值寄存器中写入0xAAAA,重装载寄存器的值无法加载到计数器中,计数器会减到0,从而产生一个系统复位信号。
独立看门狗寄存器
- IWDG_KR:键值寄存器,0~15位有效
- IWDG_PR:预分频寄存器,0-2位有效
- IWDG_RLR:重装载寄存器,0~11位有效
- IWDG_SR:状态寄存器,0~1位有效
独立看门狗超时时间
Tout = ((4*2prer)rlr)/32
Tout:看门狗溢出时间,单位为ms
prer:预分频值IWDG_PR
rlr:重装载值(IWDG_RLR)
独立看门狗操作步骤
- 初始化看门狗:预分频系数,重装载值
HAL_IWDG_Init();
- 启用看门狗
HAL_IWDG_Start();
- 喂狗
HAL_IWDG_Refresh();
具体代码
- 初始化看门狗:预分频系数,重装载值
IWDG_HandleTypeDef iwdg_handler;
void iwdg_init(void)
{iwdg_handler.Instance = IWDG;iwdg_handler.Init.Prescaler = IWDG_PRESCALER_64; //设置预分频寄存器 IWDG_PRiwdg_handler.Init.Reload = 500; //设置重装载寄存器IWDG_RLRHAL_IWDG_Init(&iwdg_handler);HAL_IWDG_Start(&iwdg_handler); //启用看门狗
}
Prescaler = IWDG_PRESCALER_64;设置的是4*2^prer=64,Reload = 500设置的是rlr,注意IWDG_RLR重装载寄存器,只有0~11位有效,不能超过寄存器存储范围。
- 启用看门狗,在第一步实现了
- 喂狗,在main函数实现了
int main(void)
{// u8 key;HAL_Init(); //初始化HAL库 Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhzdelay_init(180); //初始化延时函数uart_init(115200); //初始化USARTLED_Init(); //初始化LED KEY_Init(); //初始化按键delay_ms(100);iwdg_init();//HAL_IWDG_Start(&iwdg_handler); //启用看门狗LED0 = 0;while(1){if(KEY_Scan(0)==KEY0_PRES){HAL_IWDG_Refresh(&iwdg_handler);//LED1 = !LED1;delay_ms(10);}}
}