STM32之独立看门狗 学习笔记(三)

一、独立看门狗概述:

             独立看门狗其实就是一个独立于主时钟的定时复位狗。一旦开启独立看门狗,它就会根据自己设定的时间不断倒数,倒数到0后就开始复位。

二、关于喂狗:

              喂狗就是让狗去吃东西,分心后,这只狗就得重新倒数。

三、stm32看门狗示例程序:

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"


 

void IWDG_Init(u8 prer,u16 rlr) 
{	
 	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  //使能对寄存器IWDG_PR和IWDG_RLR的写操作
	
	IWDG_SetPrescaler(prer);                      //设置IWDG预分频值:设置IWDG预分频值为64
	
	IWDG_SetReload(rlr);                         //设置IWDG重装载值
	
	IWDG_ReloadCounter();                       //按照IWDG重装载寄存器的值重装载IWDG计数器
	
	IWDG_Enable();                             //使能IWDG
}


 int main(void)
 {	 
   //延时函数初始化		
	delay_init()
   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级        
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 
   //初始化与LED连接的硬件接口
 	LED_Init();		
   //按键初始化	   	                               
	KEY_Init();                                       
	delay_ms(500); 
  //与分频数为64,重载值为625,溢出时间为1s	     	                          
	IWDG_Init(4,625);  
   //点亮LED0                             
	LED0=0;				                           
	 

	while(1)
	{
		if(KEY_Scan(0)==WKUP_PRES)
		{
		IWDG_ReloadCounter();                 //如果WK_UP按下,则喂狗
		}
	} 
}
  

从主程序main的第一行开始运行到下面的代码时,开启看门狗

  //与分频数为64,重载值为625,溢出时间为1s	     	                          
 IWDG_Init(4,625); 

  此时,键值寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。

所以我们会看到等一亮一灭。

  此时,如果检测到按键按下,那么就会运行喂狗程序:

if(KEY_Scan(0)==WKUP_PRES)
		{
		IWDG_ReloadCounter();                 //如果WK_UP按下,则喂狗
		}

  喂狗后, 键寄存器 IWDG_KR 中被写入 0xAAAA, IWDG_RLR 中的值就会被重新加载到计数器,也就是对应到初始化设置的计数值,我们设置的1S,那么计数器就将重1s处开始递减,如果我们持续按按键,那么计数器就会持续保持在那个值,不会倒数到0,也就不会产生复位,那么灯就会始终保持亮的状态。

从而验证了看门狗和喂狗的功能。

猜你喜欢

转载自blog.csdn.net/seek97/article/details/81346505