AVR单片机看门狗的使用
Arm实验看门狗
ARM实验姓名唐珊珊学号2011412614实验目的:掌握独立看门狗的工作原理和使用方法。
实验原理:调用固件库设置和初始化独立看门狗,通过Led4的状态指示系统运行,同时按下按键SW1不断重置看门狗寄存器(俗称喂狗),当停止按键后,,则MCU会在看门狗超时的作用下系统重启。
实验步骤:要实现本实验功能设计,需要进行必要的设置,其步骤如下:1)设置Led驱动管教为推挽输出,Sw1管脚为浮空输入。
2)Led4熄灭一下,以表示刚刚复位,3)调用IWDG_writeAccessCmd函数向IWDG_KR写入0X5555。
通过这步,我们取消看门狗寄存器的写保护。
4)设置看门狗的分频系数,本例中为32。
在固件库中,可以调用IWDG_SetPrescaler函数实现。
5)设置看门狗的重装载的值,本例中为625.在固件库中,可以调用IWDG_SetReload函数实现。
6)调用IWDG_Enable函数向IWDG_KR写入0xcccc。
通过这句,来启动STM32的看门狗。
7)检测按键Sw1,如果按下则调用IWDG_ReloadCounter函数使STM32重新加载IWDG_RlR的值到看门狗计数器里面。
也可以用该命令来喂狗。
程序为:独立看门狗#include "stm32f10x.h"void GPIO_Config(void);void delay(void);int main(void){GPIO_Config();GPIO_SetBits(GPIOC,GPIO_Pin_9);delay();GPIO_ResetBits(GPIOC,GPIO_Pin_9);IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);IWDG_SetPrescaler(IWDG_Prescaler_32);IWDG_SetReload(625);IWDG_Enable();while(1){if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_3)==0)IWDG_ReloadCounter();}}void delay(void){uint32_t i;for(i=0;i<6000000;i++){}}void GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC,ENA BLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOC,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOD,&GPIO_InitStructure);}中断函数uint32_t led=1;void WWDG_IRQHandler(void){uint8_t cr;cr=WWDG->CR;cr&=0x7f;if(cr<0x50){WWDG_SetCounter(0x70);WWDG_ClearFlag();led=~led;if(led==0)GPIO_ResetBits(GPIOC,GPIO_Pin_9);elseGPIO_SetBits(GPIOC,GPIO_Pin_9);}}#include "stm32f10x.h"void GPIO_Config(void);void delay(void);//uint32_t led=0;int main(void){NVIC_InitTypeDef NVIC_InitStructure;GPIO_Config();GPIO_ResetBits(GPIOC,GPIO_Pin_9);delay();GPIO_SetBits(GPIOC,GPIO_Pin_9);delay();RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);WWDG_SetPrescaler(WWDG_Prescaler_8);WWDG_EnableIT();WWDG_SetWindowValue(0x50);WWDG_Enable(0x70);NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x07; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x07;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);while(1){;}}void GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOC,&GPIO_InitStructure);}void delay(void){uint32_t i;for(i=0;i<6000000;i++){}}中断函数为void WWDG_IRQHandler(void){uint8_t cr;cr=WWDG->CR;cr&=0x7f;if(cr<0x50){WWDG_SetCounter(0x70);WWDG_ClearFlag();led=~led;if(led==0)GPIO_ResetBits(GPIOC,GPIO_Pin_9);elseGPIO_SetBits(GPIOC,GPIO_Pin_9);}}一秒定时看门狗#include "stm32f10x.h"void GPIO_Config(void);void NVIC_Config(void);void TIM1_Config(void);void EXTI_Config(void);void IWDG_Config(void);int main(){GPIO_Config();NVIC_Config();TIM1_Config();EXTI_Config();IWDG_Config();while(1){}}void GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENA BLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOC,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOD, &GPIO_InitStructure);}void NVIC_Config(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=TIM1_UP_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x07;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x07;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}void TIM1_Config(){TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);TIM_TimeBaseInitStructure.TIM_ClockDivision=0;TIM_TimeBaseInitStructure.TIM_Period=(10000-1);TIM_TimeBaseInitStructure.TIM_Prescaler=(7200-1);TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);TIM_ClearITPendingBit(TIM1,TIM_IT_Update);TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);TIM_Cmd(TIM1,ENABLE);}void EXTI_Config(void){EXTI_InitTypeDef EXTI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3);EXTI_InitStructure.EXTI_Line = EXTI_Line3;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);}void IWDG_Config(void){IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);IWDG_SetPrescaler(IWDG_Prescaler_32);IWDG_SetReload(4000);IWDG_Enable();}中端函数为int led=1;void TIM1_UP_IRQHandler(void){if(TIM_GetITStatus(TIM1,TIM_IT_Update)!=RESET){IWDG_ReloadCounter();led=~led;if(led==1)GPIO_SetBits(GPIOC,GPIO_Pin_9);elseGPIO_ResetBits(GPIOC,GPIO_Pin_9);TIM_ClearITPendingBit(TIM1,TIM_IT_Update);}}void EXTI3_IRQHandler(void){/* 检测EXTI3是否有效*/if(EXTI_GetITStatus(EXTI_Line3)!= RESET){while(1){/*可随便加入现象,便于观察*/GPIO_ResetBits(GPIOC,GPIO_Pin_9|GPIO_Pin_8|GPIO_Pin_7|GPIO_Pin_6);/* 清除EXTI3的悬起标志位*/EXTI_ClearITPendingBit(EXTI_Line3);}}}。
单片机-系统复位与看门狗
真实案例:
• 一湖南女孩(大专生)到广东东莞找工作; • 联系好了一家企业,确定面试时间; • 面试时,被这假企业的人员绑架,并逼迫她 向家人要钱,此女孩死活不从; • 四小时后,警察突然出现,人获救。为什么 警察会在这时出现? • 因为女孩出门前与朋友约好了,若四小时内 没有电话,就报警。 • 看门狗电路在实际中的应用 12
15
三、看门狗技术
• 监控实现:看门狗需要通过两根信号线与 CPU联系,一根由CPU发出的喂狗信号,另 一根是由看门狗发出的复位信号。 • 看门狗是一个相对独立的特殊的定时器,启 用它后,喂狗就是让定时器清零、重新计数 ,使其无法加到最大值而溢出产生复位信号 • 所以要在程序里适当位置加入清看门狗指令 (喂狗) • 此技术只对瞬间干扰造成的问题有效
8
二、复位系统
• 为什么要复位?
– 上电时电压不稳定(有波动),单片机不能正 常工作,需要延时一小段时间; – 开始工作后,要初始化各寄存器的初值,从特 定的地方开始执行程序,也需要一点时间;
• 复位源有哪几个?
– 上电复位,外部复位,掉电检测复位,看门狗 复位
9
10
二、复位系统
PORF—上电复位标志,写0可清除 EXTRF—RESET复位标志,上电或写0可清除 BORF—掉电检测复位标志,上电或写0可清除 WDRF—看门狗复位标志,上电或写0可清除
低功耗晶振
满振幅晶振 低频晶振
1111 – 1000
011熔丝
位已经被编程,故系
内部128KHz RC振荡器 校准的内部 RC振荡器
外部时钟
0011 0010
0000
7
统默认主频:1MHz
(见手册P27)
一、AVR时钟系统—主频调整
51单片机的看门狗
“看门狗”概念及其应用在由单片机构成的系统中,由于单片机的工作有可能会受到来自外界电磁场的干扰,造成程序的跑飞,从而陷入死循环,程序的正常运行被打断,由单片机控制的系统便无法继续工作,这样会造成整个系统陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称“看门狗”(watch dog)。
加入看门狗电路的目的是使单片机可以在无人状态下实现连续工作,其工作过程如下:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过单片机的程序控制,使它定时地往看门狗芯片的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,给看门狗引脚送电平的程序便不能被执行到,这时,看门狗电路就会由于得不到单片机送来的信号,便将它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,从而单片机将从程序存储器的起始位置重新开始执行程序,这样便实现了单片机的自动复位。
通常看门狗电路需要一个专门的看门狗芯片连接单片机来实现,不过这样会给电路设计带来复杂,STC单片机内部自带有看门狗,通过对相应特殊功能寄存器的设置就可实现看门狗的应用,STC89系列单片机内部有一个专门的看门狗定时器寄存器,Watch Dog Timer 寄存器,其相应功能见下个知识点。
看门狗定时器寄存器(WDT_CONTR)STC单片机看门狗定时器寄存器在特殊功能寄存器中的字节地址为E1H,不能位寻址,该寄存器用来管理STC单片机的看门狗控制部分,包括启停看门狗、设置看门狗溢出时间等。
单片机复位时该寄存器不一定全部被清0,在STC下载程序软件界面上可设置复位关看门狗或只有停电关看门狗的选择,大家根据需要可做出适合自己设计系统的选择。
其各位的定义如表4.2.1所示。
表1看门狗定时器寄存器(WDT_CONTR)EN_WDT:看门狗允许位,当设置为“1”时,启动看门狗。
看门狗的使用
看门狗定时器用来防止程序因供电电源、空间电磁干扰或其它原因引起的强烈干扰噪声而跑飞的事故。
在很多单片机中都内置了看门狗,看门狗本身是一个定时器,当定时器溢出时即进行系统复位,因此需要在程序中对看门狗定时器进行清零,即常说的喂狗。
由于我用过AVR的单片机,和AVR的相比,MSP430的看门狗要灵活的多,首先默认看门狗是开着的,因此如果不使用看门狗的话要关闭,指令如下:WDTCTL = WDTPW + WDTHOLD如果打开看门狗则需要在程序中清零,指令如下:WDTCTL=WDTPW+WDTCNTCL从头文件的定义中可以看出主要有两种方式,一种就是当做普通的定时器使用,一种才是作为看门狗,另外就是时钟源可选,选择8M或者32K的晶振来获得不同的延时,通过上面可以看出看门狗定时器最大的时间可以到1S,在程序中可以灵活的利用看门狗定时器实现想要的功能。
下面介绍两个典型应用:1、在动态数码管显示中的应用,具体代码可以参考我之前的笔记,部分代码如下:WDTCTL = WDT_ADLY_1_9; // 设置内部看门狗工作在定时器模式,1.9ms中断一次//可以去看头文件中具体的配置,这里使用的手表晶振64分频计算可得是1.9msIE1 |= WDTIE; // 使能看门狗中断__interrupt void watchdog_timer(void){}这个程序主要是将看门狗定时器当做普通定时器使用,1.9ms刚好适合动态扫描间隔,在看门狗中断中对数码管进行动态扫描,这样使用相对于开一个定时器来说要有所方便。
因此在需要的定时与看门狗定时器的几个时间相同时可以考虑使用看门狗。
2、普通延时WDTCTL = WDT_ADLY_1000; //间隔定时器,定时1000ms//延时2sfor(i = 0; i< 3; i++){IFG1 &= ~WDTIFG;while(!(IFG1 & WDTIFG));IFG1 &= ~WDTIFG;}这个程序同样是将看门狗当普通定时器使用,在主程序中读取中断标志位,实现延时效果,上面的程序为什么是延时2S自己分析。
关于AVR单片机的看门狗
关于AVR单片机的看门狗看门狗这个东西以前没接触过理解它费了一点周折。
使用它的复位MCU 的功能实现LED 的闪烁。
准备工作是设定WDT 的超时时间(如1s)首先使能看门狗(wdt_enable),然后喂狗(wdt_reset),再延时灯的闪烁时间(delay=0.5s),使灯亮(SET_LED);再用一个恰当的比较长的延时(delay>0.5s)饿死狗。
之后MCU 重启,如此往复。
(1)延时可以调用库函数,还可以使用定时器;(2)SET_LED; while(1) wdt_reset(); 表示不断喂狗,从而不让MCU 重启,使灯一直亮着。
程序中使用这些代码的用途待考证,可以给作者发email 嘿嘿~(3)软件看门狗和硬件看门狗。
软件看门狗可以用wdt_disable 来禁掉。
而硬件看门狗不能。
AVR 可以通过修改熔丝位来分别实现软硬看门狗。
(4)wdt_enable(timeout)的参数timeout 表示看门狗的超时时间,即timeout时间内不喂狗,狗就会叫,mcu 就会复位。
=================================================================================================#include#include#include#define uchar unsigned char#define uint unsigned int#define SET_LED PORTA&=0XFE //PA0 输出低电平,黄灯亮#define CLR_LED PORTA|=0X01//PA0 输出高电平,黄灯灭。
AVR 看门狗WDT程序
AVR 看门狗WDT程序点击: 215, 文章入库日期: 2008-06-19 01:02:43, 来源: 很多人喜欢养宠物狗,很多单片鸭大侠则喜欢养看门狗,如果您也希望搞条AVR的看门狗养养,很适合您。
养看门狗的用意,在于用它监控系统:在程序本该运行的地方喂狗,如果程序卡死或跑飞,行到那,那样狗没有被喂到,饿死了,控制器复位,得以重启从而进行控制。
本节演示功能:养一只AVR内部看门狗,及时喂狗,狗不饿死,AVR单片鸭不复位;不及时喂饿死了,AVR单片鸭就复位。
本节的程序设计较为简单,旨在给出养狗、喂狗,不让狗饿死的简单示例。
实际应用时考虑的要注意什么时候喂狗,放狗。
硬件设计AVR主控电路原理图(点击图片放大,不需要放大镜!)LED控制电路原理图(点击图片放大,不需要放大镜!)下面部分从TXT拷出,拷到网页,代码部分缺省了很多空格,比较凌乱,请谅解!//目标系统: 基于AVR单片机//应用软件: ICC AVR/*01010101010101010101010101010101010101010101010101010101010101010101----------------------------------------------------------------------实验内容:观察喂狗与不喂狗的区别,使用PB口的LED指示灯做状态指示。
----------------------------------------------------------------------硬件连接:将PB口的LED指示灯使能开关切换到"ON"状态。
----------------------------------------------------------------------注意事项:(1)若有加载库程序,请将光盘根目录下的“库程序”下的“ICC_H”文件夹拷到D盘(2)请详细阅读:光盘根目录下的“产品资料开发板实验板SMK系列SMK1632说明资料”---------------------------------------------------------------------- 10101010101010101010101010101010101010101010101010101010101010101010*/#include <iom16v.h>#include "D:ICC_HCmmICC.H"#define DISP_DDR DDRB#define DISP_PORT PORTB/*--------------------------------------------------------------------程序名称:看门狗WDT初始化程序程序功能:注意事项:提示说明:输入:返回:--------------------------------------------------------------------*/void wdt_init(void){asm("wdr"); //clr wdtWDTCR=0x0F; //enable wdt,clk = 2048,2.1S}/*--------------------------------------------------------------------程序名称:程序功能:注意事项:提示说明:输入:返回:--------------------------------------------------------------------*/void main(void){uint8 i;DISP_DDR = 0XFF;wdt_init();while(1){DISP_PORT++; //数据显示向上加,作AVR正常运行的指示asm("wdr"); //喂狗,去除此句将导致狗饿死,AVR复位delay50ms(20);}}在AVR的运行程序中设置让PB显示端口自加。
单片机看门狗(Watchdog)的工作原理及其应用
单片机看门狗(Watchdog)的工作原理及其应用2010年05月16日星期日 23:00在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环。
程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果。
所以,出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称"看门狗"(watchdog)。
看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行。
这个时候,看门狗电路就会由于得不到单片机送来的信号。
便在它和单片机复位引脚相连的引脚上送出一个复位信号。
使单片机发生复位,即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。
看门狗,又叫 watchdog timer,是一个定时器电路。
一般有一个输入,叫喂狗(kicking the dog or service the dog),一个输出到MCU的RST端,MCU 正常工作的时候,每隔一端时间输出一个信号到喂狗端,给 WDT 清零。
如果超过规定的时间不喂狗,(一般在程序跑飞时),WDT 定时超过,就会给出一个复位信号到MCU,是MCU复位,防止MCU死机。
看门狗的作用就是防止程序发生死循环,或者说程序跑飞。
工作原理:在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。
所以,在使用有看门狗的芯片时要注意清看门狗。
单片机看门狗工作原理
单片机看门狗工作原理
单片机看门狗(Watchdog)是一种硬件电路,可监视程序运行的状态,并在程序出现故障或死锁的情况下,自动重启系统或执行特定的故障处理程序,保障系统的稳定运行。
单片机看门狗的工作原理如下:
1. 由程序周期性定时启动看门狗计数器,计数器的初始值需要预设。
2. 在规定的时间内(通常为几秒钟至十几秒钟),程序必须定时往计数器中喂给一个足够的脉冲,否则看门狗计数器就会超时。
3. 当看门狗超时时,看门狗电路会自动复位系统,并执行特定的故障处理程序。
4. 看门狗计数器重置后,上述过程会重新开始,保证系统在运行中不断重复的维护状态的监测,以确保系统的正常和可靠工作。
需要注意的是,单片机看门狗必须在程序中明确地初始化、启动和清除,以便防止误触和误操作,确保其正常可靠工作。
在程序中设置合适的看门狗定时器周期和喂狗脉冲,能够有效地保护单片机系统免受一些错误、异常、嵌套和死循环等异常情况的侵袭。
AVR单片机 看门狗范例 GCCAVR WDR 复位检测和控制看门狗
AVR单片机看门狗范例GCCAVR WDR 复位检测和控制看门狗内容来源:OURAVR发布时间:[2010-10-28]查看次数:805/*************************************************** AVR 复位检测和控制看门狗的范例******* ******* 作者:HJJourAVR ******* 编译器:WINAVR20050214 ******* ******* 2005.9.28 **************************************************//*本程序简单的示范了AVRATMEGA16的复位检测和控制看门狗系统控制和复位复位来源的检测JTAG复位指示看门狗复位指示BOD复位指示RESET引脚复位指示上电复位指示看门狗的控制出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器。
熔丝位设置1 使能BOD功能BODEN=02 选择BOD电平BODLEVEL=1 2.7V(VCC=3V) (可选)BODLEVEL=0 4.0V(VCC=5V) (可选)*/#include <avr/io.h>#include <avr/delay.h>//时钟定为内部RC 1MHz,F_CPU=1000000 也可以采用其他时钟#include <avr/wdt.h>/*wdt.h里面看门狗溢出时间常量定义#define WDTO_15MS 0#define WDTO_30MS 1#define WDTO_60MS 2#define WDTO_120MS 3#define WDTO_250MS 4#define WDTO_500MS 5#define WDTO_1S 6#define WDTO_2S 7下面的4S/8S定义只能用于 ATtiny2313, ATmega48, ATmega88 and the ATmega168.#define WDTO_4S 8#define WDTO_8S 9看门狗操作函数wdt_disable()关闭看门狗wdt_enable(timeout)使能看门狗及溢出时间设定wdt_reset()复位看门狗(喂狗)*///管脚定义#define WDT_EN 7 //PA7 看门狗的喂狗控制引脚// 高电平,不喂狗// 低电平,喂狗#define LED_JT 4 //PA4 JTAG复位指示#define LED_WD 3 //PA3 看门狗复位指示#define LED_BO 2 //PA2 BOD复位指示#define LED_EXT 1 //PA1 RESET引脚复位指示#define LED_PO 0 //PA0 上电复位指示//以上信号皆为低电平有效int main(void){unsigned char CPU_STATUS;unsigned char i;//上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻PORTB=0xFF;//不用的管脚使能内部上拉电阻。
看门狗应用
看门狗应用看门狗:看门狗是单片机的一种超时复位机制。
实际上看门狗是一个硬件的计时器,在到达一定的时间后令单片机复位,即程序从头开始重新运行。
在很多种单片机中都有看门狗,除了STC89系列单片机,还有凌阳等。
看门狗的功能:在工业应用中由于一些意外的原因,如电磁干扰、内部硬件错误等,造成单片机死机或陷入死循环中,这样可能会出现很严重的后果,这就需要一种自我检测复位的功能。
在对看门狗进行设置之后,它便开始计时。
在程序运行的过程中对计时器的值定时清零,这就是通常所说的“喂狗”。
如果程序运行正常,则看门狗由于可以及时得以清零,所以不会出溢出。
但是如果程序停滞或进行死循环,就使得看门狗不能清零(看门狗是硬件实现的,与程序的运行是无关的),从而在到达设定的时间后产生溢出,使单片机复位。
STC89系列单片机看门狗的应用:表2.1 STC89的看门狗定时器特殊功能寄存器如表2.1所示,要使用STC89的看门狗只需对寄存器进行设置即可。
WDT_CONTR中的各位的功能详述如下:EN_WDT:Enable Watch Dog Timer,使能看门狗定时器,允许看门狗工作,1允许,0禁止。
CLR_WDT:Clear Watch Dog Timer,看门狗定时器清零,1清零,随后会硬件置0。
IDLE_WDT:Idle Watch Dog Timer,看门狗定时器在空闲模式时是否计时,1为计时,0为停止。
PS2、PS1、PS0:看门狗定时器的预分频,设置成不同的值,会影响到溢出时间。
如果预分频为1(即1分频)的时候,溢出时间为1s,那么当预分频为2时,溢出时间就是2s。
STC89的预分频如表2.2所示:表2.2 STC89的预分频值综上规律,预分频值P=2^(PS+1)。
那么具体的溢出时间是怎么样算出来的呢?这个溢出时间与所用的晶体震荡器频率是有关的,下面介绍其计算方法。
T_WDT=(N • P• 32768)/F_Osc其中参数意义如下:T_WDT:溢出时间N:单片机的时钟数(所谓时钟数就是外部时钟的频率经过N分频后作为单片机工作的时钟,比如外部时钟频率是12M,如果单片机的时钟数N=12的话,那么单片机内部的工作时钟频率便为1M,STC89系列单片机有两种时钟数模式,6时钟与12时钟,当然不同的单片机可能有不同的时钟数,这在相应的芯片文档中会有所说明,如STC12系列单片机的时钟数为1时钟,即外部时钟频率就是工作频率,我们在这里对STC12单片机不作详述)P:就是上面所提到的看门狗定时器的预分频值。
看门狗实验解密版
} ================================================================================
以上的程式状态时没有喂狗的状态,所以每超过 2 秒 LED 就会闪耀一下。
如果试着将 WDR();的注释拿掉,那么 LED 就不会闪耀了。
源码: ===================================================================
//1600-WDT.c //看门狗演示程式 //akuei2 22-01-10
#include "iom16v.h" #include "macros.h"
WDTCR&=~BIT(WDE);
//关闭看门狗
}
为什么关闭看门狗需要同时置一 WDTOE 和 WDE 位呢?具体我也不是很清楚,但是根 据手册说:当 WDTOE 和 WDE 一同置一时,会产生 4 个有效的关闭周期。如果在这四 个周期内,将 WDE 位设置位 0,那么久会成功关闭看门狗。
"喂狗" - 喂狗实现的方法如下: #include "macros.h"
15.4 试验: 看门狗演示 该试验的思路基本上是利用 8 位 LED。程式一开始的时候启动看门狗,关闭 LED,然 后点亮 LED,程式停止。如果程式预设没有喂狗,当超过最长的喂狗时间后,程式就会 自动复位,这时候就会看到 LED 闪耀。相反的,如果在有效喂狗的时间内,重复喂狗 的话,那么 LED 永远会亮着。
... ...
while(1)
{
PORTB=0x00; //点亮 8 位 LED
AVR单片机看门狗定时器WDT操作过程
WDT:(Watch Dog Timer)看门狗定时器,简写WDT,主要有一个专用的定时器组成,当启动看门狗后,定时器开始计数,计数满后将产生一个中断,复位单片机。
作用:单片机很容易收到外界的干扰,如电源电压波动,电机起停,受到干扰后,程序有可能跑飞,不按原来的逻辑顺序执行,跳到另一地方执行,或者陷入一个死循环。
启用看门狗后,如果在设定的定时时间内没有执行清0看门狗定时器的指令,单片机将复位,回到程序的开始处,重新开始执行程序,保证系统的正常运行。
WDE为"1“ 时,看门狗使能,否则看门狗将被禁止。
只有在WDTOE为"1“ 时WDE 才能清
零。
以下为关闭看门狗的步骤:
1. 在同一个指令内对WDTOE 和WDE 写"1“,即使WDE 已经为"1“
2. 在紧接的4 个时钟周期之内对WDE 写"0”
步骤如下:
一、启动看门狗:WDTCR|=(1<<WDTOE)|(1<<WDE);
二、禁止看门狗:WDTCR=0X00; //再次启动看门狗必须先禁止看门狗,
三、WDTCR|=(1<<WDTOE)|(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0); //看门狗定时时间1S
在1s内重复执行上述指令,清0看门狗。
小企鹅diy 科学探究学习网
更多文章转到/wqb_lmkj/blog文章分类单片机。
任务四 看门狗报警_AVR单片机(C语言)项目开发实践教程_[共4页]
看门狗复位硬件电路图如图 7-8 所示。
95
任务四 看门狗报警
一、任务要求
利用 ATmega16 单片机内部的看门狗定时器,设计一个单片机抗干扰应用系统。当霓虹灯 显示系统启动时,8 个 LED 等短暂闪烁,正常运行后 8 个 LED 循环点亮,由外部按键触发模 拟干扰源(停止“喂狗”,LED 不正常点亮),系统自动重新启动进入正常运行状态。
项目七 中断控制应用
int main() {
uint8_t a,b,c,d; DDRB|=0x03; PORTB|=0x04; DDRD&=0xf7; PORTD|=0x08; cli(); GICR|=0xa0; MCUCR|=0x08; MCUCSR|=0x40; GIFR|=_BV(5); sei();
while(1) {
a=i%10; b=i%100/10; c=i/100%10; d=i/1000; play(a); play(b); play(c); play(d); delay_ms(300); } }
五、项目实施
1.根据元器件清单选择合适的元器件。 2.根据硬件设计原理图,在万能电路板进行元器件布局,并进行焊接工作。 3.焊接完成后,重复进行线路检查,防止短路、虚接现象。 4.在 AVR Studio 软件中创建项目,输入源代码并生成*.hex 文件。 5.在确认硬件电路正确的前提下,通过 JTAG 仿真器进行程序的下载与硬件在线调试。
AVR单片机的看门狗详解
AVR单片机的看门狗详解
AVR 看门狗一个硬件单元,当程序由于某种原因跑“飞”了,它就Reset 程序。
就像小狗看门一样。
//Watchdog initialize
// prescale: 2048K
void watchdog_init(void)
{
WDR(); //this prevents a timout on enabling
WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
}
上面是用ICC 的App Builder 生成的看门狗初始化程序,这些语句达不到初始化看门狗的目的,需要在中间加一句WDTCR = 0x1F; 。
最后一行代码提醒狗主人,别忘了及时清零看门狗定时器(喂狗),否则,小狗就咬人了。
一个相对独立的计数自动重启单片机的硬件部件,如果启用它后,不在一定的时间内清除它的计数值,就会达到计数的最高值而溢出,然后它就指挥单片机重启。
所以要在你的程序里适当的加入清看门狗的指令,一旦你的单片机程序出了问题,当然就不能按照你的程序原先设定那样自动清看门狗了,也就是常说的程序跑飞了,这个时候看门狗就会重启单片机试图解决问题。
一般只对瞬间干扰造成的问题有效,要是长时间的干扰或是软硬件问题,看门狗的意义不是很大。
我的理解就象是监视程序执行的保安一样, 程序正常执行时会在他的益处时间之内给他一个复位信号,当程序跑飞的时候他在溢出时间之内是收不到复位信号的,这时看门狗就会在设定的时间内产生系统复位的信号!。
第十二章AVR看门狗及EEPROM
寄存器EEAR。
第十二章AVR看门狗及EEPROM
AVR 内置EEPROM
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
AVR 内置EEPROM
n EEPROM 数据寄存器 - EEDR
n 对于EEPROM 写操作, EEDR 是需要写到 EEAR 单元的数据;
n 对于读操作, EEDR 是从地址EEAR 读取的 数据。
第十二章AVR看门狗及EEPROM
AVR 内置EEPROM
n EEPROM 控制寄存器- EECR
n 从EEPROM 指定位置处开始写"size"个字节写的内容由"ptr."指向 的缓冲区提供
第十二章AVR看门狗及EEPROM
ICC读写EEPROM内置函数原型
unsigned char EEPROMread( int location) {
EEAR = location;
EECR |= 0x01; strobe
n EERIE: 使能EEPROM 准备好中断
n 当EEWE 清零时EEPROM 准备好中断即可发 生。
第十二章AVR看门狗及EEPROM
AVR 内置EEPROM
n EEPROM 控制寄存器- EECR
n EEMWE: EEPROM 主机写使能
n EEMWE决定了EEWE置位是否可以启动EEPROM写 操作。
n 当EEMWE为“1”时,在4个时钟周期内置位EEWE 将把数据写入EEPROM 的指定地址;
看门狗使用说明书
目录第一章查看工控机是否已安装看门狗 (1)第二章安装看门狗程序步骤 (2)第三章看门狗具体事项设置 (5)第四章查看看门狗运行状况 (8)第一章查看工控机是否已安装看门狗步骤如下:在开始菜单中打开控制面板,查看是否有一个WatchServiceConfiguration程序,如下图所示:如果有的话就直接按照第三章进行设置即可,否则,按照第二章进行安装,安装完以后再按照第三章进行设置。
第二章安装看门狗程序步骤第一步:打开看门狗程序,界面显示如下图所示:第二步:点击Next按钮后,选中第三项Adwantech[w83627HF]WDT,然后点击下一步,界面显示如下图所示:第三步:点击Install进行安装,界面显示如下图所示:程序自行安装完成以后,点击Finish完成。
如下图所示:第四步:安装完成以后会提示重启系统,选中Yes,I want to restart my computer now,点击OK按钮重启即可安装完毕,系统重启以后再根据第三章设置看门狗的事项。
第三章看门狗具体事项设置具体设置步骤如下所示:第一步:在控制面板中找到已安装好的WatchServiceConfiguration程序,打开此程序后,在General窗口中显示如下图所示:提示:如果在安装过程中,General窗口并没有Start watchdogservice on boot复选框和StartService按钮的话,就直接跳到第三步进行设置,如下图所示:第二步:在Start watchdogservice on boot复选框中打上对勾,然后点击Start Service后,该窗口显示如下图所示:第三步:点击Setting窗口,该窗口显示如下图所示:第四步:在Setting窗口中,Timer Span设置问15s,在Watch Mode模式中选中System,并且在Log Event复选框中打上对勾。
如下图所示:第五步:鼠标点击Apply按钮,再点击Enable按钮,最后点击OK按钮即可。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
开
验评 资 ¥ 150
开
USB转RS232开 4 数码 静态显 8 数码 态扫 4x4 键 ¥ 65 ¥ 40 显 ¥ 15 ¥ 40
/study/J0022.html
1
3
[2009/2/15 2:50:07]
单
开
验
创
单
MSP430单 AVR单 C8051F单 PIC单
开
TI
图讲 请 阅 骤 AVRmega16 册 “ 时 ” 节 P40 关内
导 HOLTEK单 STC单 ANALOG DEVICES IAR SYSTEM ICC Keil Protel IAR AVR 将 贴 项 JTAG main.c 讲 称为 AVRmega16 WatchDog 项
/************************************************** * * WatchDog 试验——AVRmega单 * * : __watchdog_reset();语 释 CPU * *时 2007 12 * * * * 编译环 IAR AVR V4.20A * 验 **************************************************/
单
开
验
创
[
绍] [
] [MSP430] [AVR] [51] [
][
][
载] [
购] [
论
][
][
][ 单
]
MSP430开
MSP430FET JTAG-I ¥ 120 MSP430FET JTAG-II ¥ 150 MSP430F135 验 -I ¥ 120 MSP430 验 -I ¥ 180 MSP430开 -II ¥ 200 MSP430 USB JTAG 资 EZ430 资 习 执 验 为 CPU 图 AVRmega16单 带
习单
WatchDog
战
---AVR单
为AVRMEGA16
开
试验 释 观 还没 过
AVR单
开
__watchdog_reset();语
Hale Waihona Puke AVR单 编 -I ¥ 30 AVR单 编 -II ¥ 60 STK500 编 ¥ 80 STK500 USB 编 ¥ 150 AVR JTAG USB ¥ 150 AVRMEGA16 开 ¥ 170 AVRMEGA16编 载 ¥ 100 AVRMEGA16 册
/study/J0022.html
3
3
[2009/2/15 2:50:07]
WDTCR=(1<<WDE)|(7<<WDP0);
while(1) {
__watchdog_reset();/*
*/ : LED on
PORTB = ~led; // led <<= 1; //
/study/J0022.html 2 3 [2009/2/15 2:50:07]
C8051F单
C8051f330开 C8051f350开 C8051F330单 C8051F350单
开
验评 验评 册 册 ¥ 160 ¥ 160
MCS51单
开
MCS51 ¥ 90 MCS51USB ¥ 120 MCS51综 试验 ¥ 160 MCS51USB 综 试验 ¥ 180
PIC单
PIC16F877开 PIC ICD2 DIY
单
开
验
创
if (!led)led = 1; // __delay_cycles(500000); // } }
则 环
开 时
IAR AVR 项 编译 AVR单 PonyProg2000 ISP编
JTAG 调试 进 项 编译 JTAG调试 载 编 AVR Studio 4.x | AVR单 将 载 开 观 验结
载
编
SL ISP | AVR单
载
编
:Goodmcu 时
:2007-11-28 MSN:dearliujian@ QQ:313221948
:13652037001
权 Copyright 2007,All Rights Reserved. 13652037001 术QQ 313221948 8:30 17:00 线隐 MSN dearliujian@ ICP 08000152
#include <ioavr.h> #include <intrinsics.h>
观
还没
过
int main( void ) { unsigned char led; PORTB = 0xFF; // PORTB led = 1; // 开 时 LED0 DDRB = 0xFF; // PORTB为