网站建设资讯

NEWS

网站建设资讯

看门狗学习笔记-创新互联

看门狗的作用:

由于外界因素,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作。所以看门狗复位应运而生。看门狗片上外设就是为了解决跑飞,程序崩溃问题。

创新互联于2013年创立,先为泰和等服务建站,泰和等地企业,进行企业商务咨询服务。为泰和企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。看门狗原理概述:

看门狗类似一个定时复位,从启动看门狗时开始计数减减,然后在程序运行当中不断喂狗即:重新写入计数,看门狗就不会产生复位信号。如果程序崩了就不会喂狗,就会计数到0产生复位。从而重新开始程序。

独立看门狗应用配置过程概述

1、初始化先卸掉写保护,通过写关键字寄存器0x5555;
2、写预分频寄存器,独立看门狗的输入时钟为低速32k。如分频32,就是1K时钟的重装载的计数减1.,也就是一个毫秒MS一个装载值减减。
3、重载寄存器:填入的计数值,再关键字寄存器写入0xAAAA后装入。假设分频32,就是一个装载值一个1ms*填入装载值,就是看门狗溢出时间。
4、关于看门狗的状态寄存器,可以不使用。因为执行看门狗的操作指令只执行一次,而且不是频繁执行。所以无需等待状态。

主程序:

#include "main.h"

int main(void)
{ 
  u8 key;           //保存键值
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	delay_init(168);  //初始化延时函数
	uart_init(115200);
	start_independent_watchdog_init( IWDG_Prescaler_32,4000);//看门狗初始化32分频,4000重装载值
	LED_Init();				//初始化LED端口 
	BEEP_Init();      //初始化蜂鸣器端口
	KEY_Init();       //初始化与按键连接的硬件接口
	LED0=0;				  	//先点亮红灯
	delay_ms(1000);
	LED0=1;
	while(1)
	{key=KEY_Scan(0);		//得到键值
	   	if(key)
		{   
			switch(key)
			{		 
				case WKUP_PRES:	//控制蜂鸣器
					 
				   independent_current_relod();//通过按键,不断喂狗
					//BEEP=!BEEP;
					break;
				case KEY0_PRES:	//控制LED0翻转
					LED0=!LED0;
					break;
				case KEY1_PRES:	//控制LED1翻转	 
					LED1=!LED1;
					break;
				case KEY2_PRES:	//同时控制LED0,LED1翻转 
					LED0=!LED0;
					LED1=!LED1;
					break;
			}
		}else delay_ms(10); 
	}

}

看门狗配置程序:

#include "independentwatchdog.h"

void start_independent_watchdog_init( uint8_t IWDG_Prescaler,uint16_t Reload  )
{IWDG_WriteAccessCmd(0x5555);//卸下写保护指令
 while(!(IWDG_GetFlagStatus(IWDG_FLAG_PVU)==0)); //等待可以分频状态
 IWDG_SetPrescaler(IWDG_Prescaler);         //32K低速时钟分频为1K。所以每个节拍1us,每个重装载为1us
 while(!(IWDG_GetFlagStatus(IWDG_FLAG_RVU)==0));//等待可以重装状态
 IWDG_ReloadCounter();//重装载指令0xAAAA,喂狗
 IWDG_SetReload(Reload);//重装
 IWDG_Enable(); //启动看门狗
	
}


void independent_current_relod(void)
{IWDG_ReloadCounter();//喂狗

}
窗口看门狗应用及配置过程

PS:窗口看门狗顾名思义,就是喂狗的时间有个范围,只能在计数范围内喂狗,否则复位。
1、使能看门狗时钟:挂载在APB1上面
RCC_APB1PeriphClockCmd();
② 设置分频系数:
WWDG_SetPrescaler();
③ 设置上窗口值:上窗口值要大于0x3f,下窗口值固定为0x3f
WWDG_SetWindowValue();
④ 开启提前唤醒中断并分组(可选):
WWDG_EnableIT();
NVIC_Init();
⑤ 使能看门狗:
WWDG_Enable();
⑥ 喂狗:个人认为大设置0x7f到0x40,因为0x40就会进入中断喂狗了,小于0x40就无法进入中断喂狗
WWDG_SetCounter();
⑦编写中断服务函数:计数到0x40的时候都会进入中断,然后在中断写喂狗就可以防止产生复位
WWDG_IRQHandler();

超时值的计算公式如下:tWWDG=(4096 *2^WDGTB * ( t [5:0 ]+ 1) ))/tPCLK1
其中:公式描述4096是分频的固定系数,4096 *2^WDGTB乘以计数值+1的时钟占了多少个tPCLK1,设tPCLK1=42000,(4096 *2^WDGTB * ( t [5:0 ]+ 1) ))占了多少个42000。也就是占了多少MS
tWWDG:WWDG 超时时间 以 ms 为测量单位
tPCLK1:APB1 时钟周期,以 KHZ 为测量单位
t [5:0 ]为递减计数器值
有关 TWWDG 的最小值和大值,请参见下表。
在这里插入图片描述
看门狗配置程序:

#include "WindowWatchDog.h"
#include "main.h"

void windowwatchdog_init(uint8_t Counter,uint8_t WindowValue,uint32_t WWDG_Prescaler)
{NVIC_InitTypeDef NVIC_InitStruct;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
  WWDG_SetPrescaler( WWDG_Prescaler); //分频参数
  WWDG_SetWindowValue( WindowValue);  //上窗口设置

	WWDG_Enable( Counter); //使能并赋予计数值
	
	NVIC_InitStruct.NVIC_IRQChannel=WWDG_IRQn;//优先级通道是看门狗
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;//优先级2
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//子优先级1
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(& NVIC_InitStruct);
	
	WWDG_ClearFlag();//清除标志位
	WWDG_EnableIT();//使能中断
}


void WWDG_IRQHandler(void )
{WWDG_SetCounter(0x7f); LED1=~LED1;//屏蔽这句话,就是不喂狗,系统一直复位,可以观察LED0
  WWDG_ClearFlag();
  
}

主程序

#include "main.h"

int main(void)
{ 
  u8 key;           //保存键值
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	delay_init(168);  //初始化延时函数
	uart_init(115200);
	//start_independent_watchdog_init( IWDG_Prescaler_32,4000);//看门狗初始化32分频,4000重装载值

	LED_Init();				//初始化LED端口 
	BEEP_Init();      //初始化蜂鸣器端口
	KEY_Init();       //初始化与按键连接的硬件接口
	LED0=0;				  	//先点亮红灯
	
	
	delay_ms(2000);
	
	LED0=1;
	delay_ms(2000);//复位LED0闪烁,观察LED0就知道
	windowwatchdog_init(0x7f ,0x4f ,WWDG_Prescaler_8 ) ; //42m分频8*4096=1281,分成1281频率,溢出时间=(0x7f-0x40+1)*1/1281
	while(1)
	{key=KEY_Scan(0);		//得到键值
	   	if(key)
		{   
			switch(key)
			{		 
				case WKUP_PRES:	//控制蜂鸣器
					 
				  // independent_current_relod();//通过按键,不断喂狗
					//BEEP=!BEEP;
					break;
				case KEY0_PRES:	//控制LED0翻转
					LED0=!LED0;
					break;
				case KEY1_PRES:	//控制LED1翻转	 
					LED1=!LED1;
					break;
				case KEY2_PRES:	//同时控制LED0,LED1翻转 
					LED0=!LED0;
					LED1=!LED1;
					break;
			}
		}else delay_ms(10); 
	}

}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前文章:看门狗学习笔记-创新互联
网址分享:http://cdweb.net/article/hgses.html