1.为什么要看门狗
理由
单片机在工作的时候,经常会受到很多外界的干扰,例如外界的电磁场,程序失误等待,陷入死循环,单片机控制的系统无法继续工作,发生严重的后果,所以对于运行状态进行实时检测的考虑,便产生了一种用于检测单片机程序运行状态的模块或芯片。就想看门的一样,就叫看门狗。
解决的问题
在程序异常的时候,程序让系统复位
2.STM32的看门狗
STM32有两个看门狗
1.独立看门狗
由专门的低速时钟(LSI)驱动,即使主时钟发生故障,仍然有效
独立看门狗适合用于需要看门狗作为一个主程序之外能够完全独立工作,并且时间精度要求低的场合
2.窗口看门狗
由APB1时钟分频后得到的时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早
窗口看门狗适合那些要求看门狗在精确记时窗口期作用的程序
3.看门狗寄存器与功能运作
就是有一个寄存器IWDG_KR在从一个值不断的减1,我们在任何时候在IWDG_KR寄存器写入0XAAAA,那么它会从IWDG_RLRL自动重装寄存器写入值,重新开始计数。如果我们没有喂狗,一直减一减到了0,就会产生复位信号,IWDG_ RESET,系统复位。
4.独立看门狗系统框图
1.键值寄存器IWDG_KP:0-15位有效
2.预分频寄存器IWDG_PR:0-2位有效
3.重装寄存器IWDG_RLR:0-11位有效
4.状态寄存器IWDG_SR:0-1位有效
预分频寄存器IWDG_PR与3.重装寄存器IWDG_RLR有写保护功能,写的时候写取消写保护
1.键值寄存器IWDG_KP:0-15位有效
写入0x5555表示取消写保护
0xcccc表示启动看门狗
0xaaaa表示重装载值
2.预分频寄存器IWDG_PR:0-2位有效
对LSI时钟信号进行分频在给看门狗时钟
3.重装寄存器IWDG_RLR:0-11位有效
写入喂狗时重装载的值。
4.状态寄存器IWDG_SR:0-1位有效
比较少管
5.独立看门狗超时时间
prer分频系数
rlr装载值
6.独立看门狗HAL库函数
HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg); //看门狗初始化函数
HAL_IWDG_Start(IWDG_HandleTypeDef *hiwdg) ; //看门狗启动函数
HAL_IWDG_MspInit(IWDG_HandleTypeDef *hiwdg) //看门狗回调函数
HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg) //看门狗喂狗函数
HAL_IWDG_GetState(IWDG_HandleTypeDef *hiwdg) //获取看门狗的状态
7.独立看门狗的操作步骤
8.独立看门狗的代码
看门狗没有及时喂狗就会给串口反馈
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "iwdg.h"
int main(void)
{
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
delay_init(180); //初始化延时函数
uart_init(115200); //初始化USART
LED_Init(); //初始化LED
KEY_Init(); //初始化按键
delay_ms(100); //延时100ms再初始化看门狗,LED0的变化"可见"
IWDG_Init(IWDG_PRESCALER_64,500); //分频数为64,重载值为500,溢出时间为1s
LED0=0;
while(1)
{
if(KEY_Scan(0)==WKUP_PRES) //如果WK_UP按下,喂狗
{
IWDG_Feed(); //喂狗
}
delay_ms(10);
}
}