大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
由于外界因素,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作。所以看门狗复位应运而生。看门狗片上外设就是为了解决跑飞,程序崩溃问题。
创新互联于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元起,快前往官网查看详情吧