实验5-2 看门狗实验
- 格式:doc
- 大小:42.50 KB
- 文档页数:4
窗口看门狗实验心得体会作为一种新兴的网络安全方案之一,窗口看门狗近年来备受关注。
作为一名从业人员,为了更好地掌握这项技术,我特地进行了一次窗口看门狗实验,并在此分享一下我的心得体会。
首先,我想简单介绍一下什么是窗口看门狗。
窗口看门狗实际上是一种Windows平台上的安全技术,主要是通过监控系统中的进程和网络通信来检测和预防恶意行为的发生。
简单来说,就是将一只“看门狗”放到了我们的电脑里,时刻“守护”着我们的安全。
那么,具体来说,窗口看门狗是如何实现的呢?其实,窗口看门狗主要通过以下四个方面来进行检测和防护:1. 监控系统中的进程。
窗口看门狗可以监控所有正在运行的进程,并对这些进程的行为进行监测,如进程的创建、关闭等。
如果发现某个进程的行为异常,窗口看门狗会立即进行预警或者阻止其继续运行。
2. 监控系统中的网络通信。
窗口看门狗可以监控所有的网络通信,包括传入和传出的数据包。
如果发现某个数据包包含恶意代码或者连接了不受信任的服务器,窗口看门狗会同样立即进行预警或者阻止其继续传输。
3. 杀毒软件兼容性。
窗口看门狗与杀毒软件相辅相成。
在进行防护的同时,窗口看门狗可以实时监测杀毒软件的状态,防止恶意软件对杀毒软件进行攻击,从而保证我们电脑的安全。
4. 无缝衔接Windows系统。
窗口看门狗的最大优点是它与Windows系统无缝衔接,并且对系统的影响极小。
所以即使我们安装了窗口看门狗,我们也感受不到什么不同,而且它不会影响我们使用电脑的速度。
说了这么多,其实窗口看门狗最最重要的作用还是能够为我们提供实时的安全保障。
在进行实验的过程中,我发现窗口看门狗可以监控系统中所有进程和网络通信,并进行智能的行为分析。
如果它发现有威胁性的行为发生,就会立即进行预警和阻止,从而保证我们电脑的安全。
当然,窗口看门狗也有一些不足之处。
比如,它只能保护我们的电脑防止恶意行为,但它不能修复或者清除已经感染的病毒。
所以,我们还需要配合使用杀毒软件等其他安全工具一起,才能更好地保护我们的电脑。
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);}}}。
看门狗定时器实验1.实验目的(1)掌握LM3S8962中的看门狗定时器(WDT)的功能和使用方法(2)掌握正确使用看门狗的方法2.实验内容(1)ARM的初始化配置(2)WDT的初始化和中断/复位设置(3)编程演示使用看门狗对系统进行监控3.WDT的功能图1 WDT模块结构图嵌入式控制系统运行时受到外部干扰或者系统错误,程序有时会出现“跑飞”,导致整个系统瘫痪。
为了防止这一现象的发生,在对系统稳定性要求较高的场合往往要加入看门狗(Watchdog)电路。
看门狗电路的作用就是当系统“跑飞”而进入死循环时,恢复系统的运行。
在Stellaris 系列ARM里集成有硬件的看门狗定时器模块。
该模块有两个功能:当看门狗定时器的复位功能禁能时,可以把看门狗作为一个普通定时器来使用;当看门狗定时器的复位功能使能时,用作看门狗定时器,一旦产生了“二次超时”事件,将引起处理器复位。
看门狗定时器具有“二次超时”特性。
当32位计数器在使能后递减计数到0 状态时,看门狗定时器模块产生第一个超时信号,并产生中断触发信号。
在发生了第一个超时事件后,32 位计数器自动重装看门狗定时器装载寄存器(WDTLOAD)的值并重新递减计数。
如果没有清除第一个超时中断状态,则当计数器再次递减到0 时,且复位功能已使能,则看门狗定时器会向处理器发出复位信号。
如果中断状态在32位计数器到达其第二次超时之前被清除,则自动重装32位计数器,并重新开始计数,从而可以避免处理器被复位。
为了防止在程序跑飞时意外修改看门狗模块的配置,特意引入了一个锁定寄存器。
在配置看门狗定时器之后,只要写入锁定寄存器一个不是十六进制0x1ACCE551的任何数值,看门狗模块的所有配置都会被锁定,拒绝软件修改。
因此以后要修改看门狗模块的配置,包括清除中断状态(即喂狗操作),都必须要首先解锁。
解锁方法是向锁定寄存器写入十六进制数值0x1ACCE551 。
如果在看门狗定时器计数器正在计数时把新的值写入WDTLOAD,则计数器将装入新的值并继续计数。
华清远见嵌入式系统实训报告(2017—2018学年第一学期)姓名:******专业班级:************学号:**************学院:电气工程与自动化学院带队教师: 乔美英,胡伟2017年9月25日华清远见嵌入式系统实训报告一、实习时间2017.9.25--2017.9.29二、实习的性质、目的2.1 实习性质虽然嵌入式系统是近几年才开始真正风靡起来的,但事实上嵌入式这个概念却很早就已经存在了。
从上个世纪70年代单片机的出现到今天各种嵌入式微处理器、微控制器的广泛应用,嵌入式系统少说也有了近30年的历史。
从嵌入式系统的构成上看,嵌入式系统是集软硬件于一体的、可独立工作的计算机系统。
从外观上看,嵌入式系统像是一个“可编程”的电子“器件”从功能上看。
它是对宿主对象进行控制,使其具有“智能”的控制器。
从应用的角度看,嵌入式系统与通用计算机系统相比,有如下一些特点:(1)专用性强由于嵌入式系统通常是面向某个特定应用的,所以嵌入式系统的硬件和软件,尤其是软件,都是为特定用户群来设计的,它通常都具有某种专用性的特点。
(2)实时性好目前,嵌入式系统广泛应用于生产过程控制、数据采集、传输通信等场合,主要用来对宿主对象进行控制。
所以都对嵌入式系统有或多或少的实时性。
例如,对嵌入在武器装各中的嵌入式系统、在火箭中的嵌入式系统、一些工业控制装置中的控制系统等应用中的实时性要求就极高。
也正因为这种要求,在硬件上嵌入式系统极少使用存取速度慢的磁盘等存储器。
在软件上更是加以精心设计,从而可使嵌入式系统快速地响应外部事件。
当然,随着嵌入式系统应用的扩展,有些系统对实时性要求也并不是很高,例如近年来发展速度比较快的手持式计算机、掌上电脑等。
但总体来说,实时性是对嵌入式系统的普遍要求,是设计者和用户重点考虑的一个重要指标。
(3)可裁剪性好从嵌入式系统专用性的特点来看,作为嵌入式系统的供应者,理应提供各式各样的硬件和软件以各选用。
“看门狗”概念及其应用在由单片机构成的系统中,由于单片机的工作有可能会受到来自外界电磁场的干扰,造成程序的跑飞,从而陷入死循环,程序的正常运行被打断,由单片机控制的系统便无法继续工作,这样会造成整个系统陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称“看门狗”(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”时,启动看门狗。
实验八看门狗实验一、实验目的1、了解看门狗的作用;2、掌握看门狗的使用方法。
二、实验内容1、编程实现看门狗功能,观察看门狗作用;2、编程实现看门狗喂狗。
三、实验设备1、硬件:JX44B0实验板;PC机;JTAG仿真器;2、软件:PC机操作系统(WINDOWS 2000);ARM Developer Suite v1.2;Multi-ICE V2.2.5(Build1319);四、基础知识1、用ADS集成开发环境,编写和调试程序的基本过程;2、应用程序的框架结构。
五、实验说明1、看门狗的功能和工作原理嵌入式系统运行时受到外部干扰或者系统错误,程序有时会出现“跑飞”,导致整个系统瘫痪。
为了防止这一现象的发生,在对系统稳定性要求较高的场合往往要加入看门狗电路。
看门狗的作用就是当系统“跑飞”而进入死循环时,恢复系统的运行。
其基本原理为:当本系统程序完整运行一周期的时间为Tp,看门狗的定时周期时Ti,Ti>Tp,在程序运行一周期后,就修改定时器的计数值,(俗称“喂狗”),只要程序正常运行,定时器就不会溢出,若由于干扰等原因使系统不能在Tp时刻修改定时器的计数值,定时器将在Ti时刻溢出,引发系统复位,使系统得以重新运行,从而起到监控作用。
在一个完整的嵌入式机系统或单片机最小系统中通常都有看门狗定时器。
而且一般集成在处理芯片中,看门狗实际上就是一个定时器,只是它在期满后将自动引起系统复位。
2、S3C44B0看门狗的控制S3C44B0的看门狗定时器有两个功能:1)为常规定时器使用,而且可以引发中断;2)为看门狗定时器使用,期满时,它可以产生128个时钟周期的复位信号。
下图是S3C44B0看门狗的示意图。
输入时钟为MCLK(该时钟频率等于系统的主频),它经过两级分频,最后将分频后的时钟作为该定时器的输入时钟,当计数器期满后可以产生中断或者复位信号。
S3C44B0看门狗电路示意图看门狗定时器计数值的计算公式如下:t_watchdog = 1 / (PCLK / (Prescaler value + 1 ) / Division_factor)看门狗的定时周期:T = WTCNT * t_watchdog看门狗定时器相关寄存器如下:控制寄存器(WTCON)通过该寄存器,可以使能/禁止看门狗、选择输入时钟源、使能/关闭中断、使能/关闭输出。
STM32学习笔记---WWDG窗⼝看门狗实验继做了SYSTICK实验后,继续进⾏第8个实验-WWDG窗⼝看门狗实验,本实验通过设置窗⼝看门狗WWDG间断时间来中断来定期的检查是否出错,在WWDG中断函数中加⼊了流⽔灯⽤来测试是否运⾏了看门狗程序中断,⽤PB5-LED1通过窗⼝看门狗间断时间来闪烁,编程⼯程⼤致和USART实验过程差不多,先是开启系统时钟,然后GPIO端⼝时钟,然后复⽤功能时钟AFIO,然后各个模块⽤的的时钟,,呵呵,之后进⼊各个模块初始化,设置,编写⼦程序,中断的话,要在中断函数中填写某模块的中断触发处理函数,重要的是在CONFG.H函数中开启模块的声明,差不多是这样的了。
以下为WWDG函数主要部分://WWDG窗⼝看门狗设置初始化void WWDG_Config(void){//软件看门狗初始化RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);WWDG_SetPrescaler(WWDG_Prescaler_8); //时钟8分频4ms// (PCLK1/4096)/8= 244 Hz (~4 ms)WWDG_SetWindowValue(65); //计数器数值WWDG_Enable(127); //启动计数器,设置喂狗时间// WWDG timeout = ~4 ms * 64 = 262 msWWDG_ClearFlag(); //清除标志位WWDG_EnableIT(); //启动中断}*****************************************************void WWDG_IRQHandler(void){WWDG_SetCounter(0x7F); //更新计数值WWDG_ClearFlag(); //清除标志位switch(WWDGFLAG){case 0:GPIO_SetBits(GPIOB, GPIO_Pin_5);break;case 1:GPIO_ResetBits(GPIOB, GPIO_Pin_5);break;default:break;}WWDGFLAG=!WWDGFLAG;}以下为WWDG函数结果部分:。
计算机科学与技术学院
实验报告
课程名称:无线传感器网络原理与应用
实验七 CC 2530看门狗实验
一、实验目的
有些稳定性要求高的应用中,需要使用看门狗(Watchdog)机制来重启系统。
本实验主要介绍看门狗看门狗模式的使用方法及作用。
CC250 芯片中已集成看门狗硬件模块,无需插入扩展板。
二、实验内容
利用看门狗重启系统,实现 LED 的闪烁。
三、实验环境
硬件:鼎轩 WSN 实验箱(汇聚网关、烧录线),PC 机;
软件:IAR 软件。
四、实验步骤
1)打开鼎轩 WSN 实验箱,检查实验箱设备,确保实验箱设备完整、连接无误后,连接电源线,打开电源开关;
2)用烧录线连接汇聚网关上的烧录接口与电脑 USB 接口;
3)点击(\CC2530_simple_demo\cc2530-simple-demo\WATCHDOG)目录下的工程图标 watchdog.eww 打开工程;
4)点击 IAR 中的图标按钮编译程序;
5)完成编译后若没有错误信息,将实验箱节点编程开关上汇聚网关开关拨上去,点击调试并下载按钮将程序下载到汇聚网关上;
6)调试运行程序,可以看到,红绿灯闪烁,这是看门狗重启系统的效果。
7)加入喂狗函数,查看实验现象,验证看门狗的看门狗模式的工作原理,学生还可以配置 WDCTL 使看门狗工作与定时器模式。
程序代码
程序源文件路径为/cc2530-simple-demo/ DMA_Test/ watchdog.c
实验总结
本实验验证了看门狗重启系统的效果,while 循环中,注释掉的是喂狗函数,如果即时喂狗,系统便不会重启,小灯也就不会闪烁。
/*-----------------------------------------------名称:看门狗溢出实验按键不停喂狗论坛:编写:shifang日期:2009.5修改:无内容:通过按键喂狗防止溢出复位看门狗演示程序在16383个机器周期内必须至少喂狗一次标准A T89s52单片机试验通过。
------------------------------------------------*/#include <reg52.h>sfr WDTRST = 0xA6;sbit K1 = P3^0;sbit K2 = P3^1;sbit LED1=P1^1;sbit LED2=P1^2;void DelayUs2x(unsigned char t);//us级延时函数声明void DelayMs(unsigned char t); //ms级延时/*------------------------------------------------主函数------------------------------------------------*/main(){LED1=0;DelayMs(100);LED1=1;DelayMs(100);TMOD=0x01;TH0=0xc6; //定时16msTL0=0x66;EA=1;ET0=1;WDTRST=0x1e; //在程序初始化中激活看门狗。
WDTRST=0xe1; //先送1E,后送E1if(K1==0){TR0=1;}while(1){if(K2==0){TR0=0;}LED2=1;LED1=1;DelayMs(100);LED2=0;DelayMs(100);}}/*------------------------------------------------定时器中断函数------------------------------------------------*/void T ime0(void) interrupt 1{TH0=0xc6; //定时16msTL0=0x66;WDTRST=0x1e; //喂狗指令WDTRST=0xe1;}/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}。
实验5 S3C2410 看门狗定时器中断实验一、实验目的掌握S3C2410 看门狗定时器的工作原理和定时时间的计算方法,会在MDK中可视化配置看门狗,理解看门狗中断的触发过程,熟练掌握和中断相关寄存器的使用以及中断服务函数的编程方法。
二、实验预备知识熟悉UP-NETARM2410实验箱的结构,S3C2410的外设接口电路,熟悉MDK编程软件的使用方法,熟悉C语言程序设计的一般方法。
三、实验内容在MDK的配置向导中配置WDT,使其定时一秒,定时时间到后触发WDT中断,控制三个LED每隔一秒循环闪烁,编写C语言程序编译并下载到UP-NETARM2410实验箱,可以看到GPC5/GPC6/GPC7上所接的三个LED循环闪烁,实现精确定时一秒。
图1 MDK中看门狗定时器的配置四、参考程序本工程中包括三个文件:S3C2410A.s、ledflash.c和cvectaddr.c主程序文件ledflash.c的内容如下:1 extern void openDog(void);23 extern void c_Wdt_ISR(void);45 int main()6 {7 // 0x010FFF20+0x24 is the address of Watchdog jumper8 *(volatile unsigned int *)(0x010FFF20+4*9)=(unsigned)c_Wdt_ISR;9 openDog();10 while(1)11 {1213 }14 }文件cvectaddr.c的内容如下:1 #define LED1_MASK 0x202 #define LED2_MASK 0x403 #define LED3_MASK 0x8045 #define GPCDAT_ADDR (*(volatile unsigned int *)0x56000024)67 #define SRCPND (*(volatile unsigned int *)0x4A000000)8 #define INTMOD (*(volatile unsigned int *)0x4A000004)9 #define INTMSK (*(volatile unsigned int *)0x4A000008)10 #define PRIORITY (*(volatile unsigned int *)0x4A00000C)11 #define INTPND (*(volatile unsigned int *)0x4A000010)12 #define INTOFFSET (*(volatile unsigned int *)0x4A0000141314 // enable watchdog timer intterupt15 void openDog(void)16 {17 INTMOD = 0x0; // set as IRQ18 INTMSK &= ~(0x200); //open Dog19 PRIORITY = 0x7F;20 }21 int number=0;22 int nLED=0;23 __irq void c_Wdt_ISR()24 {2526 int iReg=0;27 if(SRCPND | 0x200)28 SRCPND = 0x200;29 if(INTPND | 0x200)30 INTPND = 0x200;31 //INTMSK |= 0xFFFFFFFF; //close all, include Dog32 nLED = 0;33 switch(number)34 {35 case 0: // SWI number 0 code36 nLED ^=(LED2_MASK | LED3_MASK);// LED1 light37 break;38 case 1:39 nLED ^=(LED1_MASK | LED3_MASK);// LED2 light40 break;41 case 2:42 nLED ^=(LED1_MASK | LED2_MASK);// LED3 light43 break;44 }45 number++;46 if(number>2)47 number=0;48 GPCDAT_ADDR = nLED; // Led shine in turn4950 __asm // open IRQ51 {52 MRS iReg, CPSR53 BIC iReg, iReg, #0x8054 MSR CPSR_c, iReg55 }56 //INTMSK &= ~(0x200); // open Dog57 }五、实验结果请自己作答。
watchdog 原理看门狗,⼜叫watchdog timer,主要⽤来监控、管理CPU的运⾏状态,并对处于异常状态中的CPU进⾏复位操作,使其能重新⼯作。
看门狗可分为硬件看门狗和软件看门狗两种。
硬件看门狗的主体是⼀个定时电路,并由被监控CPU提供周期性“喂狗”信号,对定时器清零(俗称“清狗”)。
CPU正常⼯作时,由于能定时“清狗”,看门狗内的定时器不会溢出。
当CPU出现故障,则不能继续提供“清狗”信号,使得看门狗内定时器不断累加⽽溢出,从⽽触发⼀个复位信号对CPU进⾏复位,使CPU重新⼯作。
软件看门狗原理上⼀样,只是将硬件电路上的定时器⽤处理器的内部定时器代替,这样可以简化硬件电路设计,但在可靠性⽅⾯不如硬件定时器,⽐如系统内部定时器⾃⾝发⽣故障就⽆法检测到。
当然也有通过双定时器相互监视,这不仅加⼤系统开销,也不能解决全部问题,⽐如中断系统故障导致定时器中断失效。
看门狗本⾝不是⽤来解决系统出现的问题,在调试过程中发现的故障应该要查改设计本⾝的错误。
加⼊看门狗⽬的是对⼀些程序潜在错误和恶劣环境⼲扰等因素导致系统死机⽽在⽆⼈⼲预情况下⾃动恢复系统正常⼯作状态。
看门狗也不能完全避免故障造成的损失,毕竟从发现故障到系统复位恢复正常这段时间内是不能正常⼯作的。
同时⼀些系统也需要复位前保护现场数据,重启后恢复现场数据,这可能也需要⼀笔软硬件的开销。
常⽤的看门狗芯⽚有ADM706/MAX706,这两种芯⽚的封装⽅式⼀样,如下图所⽰:1).MR#:Manual-Reset,⼿动复位输⼊信号,低电平有效,当此管脚的输⼊电平低于0.6V 时,会触发Reset#管脚输出⼀个复位信号,此管脚内部有 70uA 上拉电流。
如要不使⽤此管脚,需要将此管脚接到VCC或者悬空,不可接地;2).VCC:芯⽚⼯作电压,接5V或3.3V;3).GND:芯⽚参考地,直接与单板GND相连;4).PFI:Power-Fail Comparator Input,电压监控输⼊管脚,当此管脚的输⼊电压低于1.25 V时,FPO#及Reset#会输出低电平信号;5).PFO#:Power-Fail Output,电压监控输出管脚,当PFI的输⼊电平低于1.25V时,输出低电平,不使⽤此管脚时可将其悬空;6).WDI:Watchdog Input,清狗信号输⼊,WDI遇到⼀个上升沿/下降沿,内部看门狗定时器都将清0。
Zigbee 之旅(八):几个重要的CC2430基础实验——看门狗作者:秋水寒 文章来源:秋水寒 点击数: 366 更新时间:2011-4-19一、承上启下再好的操作系统,不管是现在的Win7还是以后Win8、Win9,总会出现BlueScreen 的时候,更何况是小小的单片机呢~ 电气噪声、电源故障、静电放电等不可预知的原因,都可能造成嵌入式系统的运行出现异常。
而看门狗(Watch Dog ),准确的说应该是看门狗定时器,则正是专门用来监测单片机程序运行状态的电路结构。
其基本原理是:启动看门狗定时器后,它就会从0开始计数,若程序在规定的时间间隔内没有及时对其清零,看门狗定时器就会复位系统(相当于重启电脑),如下图所示(word 画的,画得比较eggache~):下面我们就来介绍简单的看门狗应用方法:怎么放狗?怎么喂?若不喂,会出现什么情况?二、看门狗的故事(1)实验简介若喂狗,系统正常运行;若不喂狗,系统不断重启。
#include <ioCC2430.h>#define led1 P1_0#define led2 P1_1#define led3 P1_2#define led4 P1_3/*系统时钟初始化-------------------------------------------------------*/void xtal_init(void){SLEEP &= ~0x04; //都上电while(!(SLEEP & 0x40)); //晶体振荡器开启且稳定CLKCON &= ~0x47; //选择32MHz 晶体振荡器SLEEP |= 0x04;}/*LED初始化-------------------------------------------------------*/void led_init(void){P1SEL = 0x00; //P1为普通I/O 口P1DIR |= 0x0F; //P1.0 P1.1 P1.2 P1.3 输出led1 = 1; //关闭所有LEDled2 = 1;led3 = 1;led4 = 1;}/*看门狗初始化-------------------------------------------------------*/void watchdog_Init(void){WDCTL = 0x00; //看门狗模式,时间间隔一秒WDCTL |= 0x08; //启动看门狗}/*喂狗程序-------------------------------------------------------*/void FeetDog(void){WDCTL = 0xa0;WDCTL = 0x50;}/*延时函数(小于1秒。
实验5-2 看门狗定时器应用实验1、实验目的了解watchdog 的作用掌握S3C2410A 的watchdog 定时器的使用方法2、实验内容实现看门狗复位编程实现看门狗喂狗3、实验设备S3C2410A 开发板ADS1.2 集成开发环境,ARM 仿真器、串口连接线4、实验原理4.1 看门狗功能简述嵌入式系统运行时受到外部干扰或者系统错误,程序有时会出现“跑飞”,导致整个系统瘫痪。
为了防止这一现象的发生,在对系统稳定性要求较高的场合往往要加入看门狗(watchdog)电路。
看门狗的作用就是当系统“跑飞”而进入死循环时,恢复系统的运行。
4.2 看门狗的工作原理其基本原理为:设本系统程序完整运行一周期的时间是Tp,看门狗的定时周期为Ti,Ti>Tp,在程序正常运行时,定时器就不会溢出,若由于干扰等原因使系统不能在Tp 时刻修改定时器的记数值,定时器将在Ti 时刻溢出,引发系统复位,使系统得以重新运行,从而起到监控的作用。
4.3 S3C2410A 的看门狗S3C2410A 的看门狗定时器有两个功能:作为常规时钟,并且可以产生中断;作为看门狗定时器使用,当时钟计数减为0(超时)时,它将产生一个128 个时钟周期(PCLK)的复位信号。
主要特性如下:通用的中断方式的16bit 定时器。
当计数器减到0(发生溢出),产生128 个PCLK 周期的复位信号。
下图为看门狗的电路示意图,看门狗时钟使用PCLK 作为他的时钟源,PCLK 通过预分频产生适合的看门狗时钟。
看门狗模块包括一个预比例因子放大器,一个是四分频器,一个16bit 计数器。
看门狗的时钟源来自PCLK,为了得到较宽范围的看门狗信号,PCLK 先被预分频,之后再经过分频器分频。
预分频比例因子的分频值,都可以由看门狗控制器(WTCON)决定,预分频值的有效范围从0 到256-1。
分频因子可以选择16、32、64 或者128。
看门狗定时器记数值的计算公式如下:t_watchdog=1/ [PCLK/( prescaler value +1)/ Division_factor ]看门狗的定时周期为T=WTCH×t_watchdog一旦看门狗定时器被允许,看门狗定时器数据寄存器(WTDAT)的值不能被自动的装载到看门狗计数器(WTCNT)中。
因此,看门狗启动前要将一个初始值写入看门狗计数器(WTCNT)中。
调试环境下的看门狗当S3C2410A 用嵌入式ICE 调试的时候,看门狗定时器的复位功能不能启动,看门狗定时器能从CPU 内核信号判断出当前CPU 是否处于调试状态,如果看门狗定时器确定当前模式是调试模式,尽管看门狗能产生溢出信号,但是仍然不会产生复位信号。
5、S3C2410A 相关寄存器WTCON――看门狗定时器控制寄存器看门狗控制寄存器能够禁止或者允许看门狗时钟,从四个不同的时钟源中挑选时钟信号,允许或禁止中断,并且能允许或禁止看门狗时钟输出。
如果用户想要使用看门狗作为普通时钟,应该中断使能,禁止看门狗定时器复位。
WTDAT――看门狗定时器数据寄存器WTDAT 用于设置看门狗定时器的超时时间值,在初始化看门狗过程中,WTDAT 的值不会自动加载到定时计数器中,首次使用定时器超时值为其初始值即0x8000,以后该寄存器的值会被自动加载到WTCNT 寄存器中。
WTCNT――看门狗定时器计数寄存器WTCNT 为看门狗定时器工作的时间计数器的当前计数值,注意在初始化看门狗操作后,看门狗数据寄存器(WTDAT)的值不能自动装载到看门狗计数寄存器(WTCNT)中,所以看门狗被允许之前应该初始化看门狗计数寄存器的值。
6、实验程序由于看门狗是对系统的复位或者中断的操作,所以不需要外围的硬件电路。
要实现看门狗的功能,只需要对看门狗的寄存器组进行操作。
即对看门狗的控制寄存器(WTCON)、看门狗数据寄存器(WTDAT)、看门狗计数寄存器(WTCNT)的操作。
设计流程如下:设置看门狗中断操作,包括全局中断和看门狗中断的使能,看门狗中断向量的定义。
频值、中断使能和复位使能等。
对看门狗数据寄存器(WTDAT)和看门狗计数寄存器(WTCNT)的设置。
启动看门狗定时器。
6.1 主功能函数int Main(void){ChangeClockDivider(1,1);ChangeMPllValue(0xa1,0x3,0x1);Port_Init();Uart_Select(0);Uart_Init(0,115200);Uart_Printf("watchdog test is beginning\n");watchdog_test();while(1);6.2 看门狗复位功能程序实现void watchdog_test(void){//Prescaler value=100;lock division factor=128 ;PCLK=67.5MHz//t_watchdog=1/[PCLK/(Prescaler value+1)/Division_factor]=0.0002//disable watchdogrWTCON=((100<<8)|(3<<3));//看门狗时钟周期T=WTCNT*t_watchdog=3S//看门狗喂狗rWTDAT=15000;rWTCNT=15000;//disable watchdog interruptrWTCON &= ~(3<<1);//enable Watchdog timer;reset signal.rWTCON|=((1<<5)|(1<<0));while(1);}6.3 看门狗定时器功能程序实现void watchdog_test(void){{//initialize interrupt registersClearPending(BIT_WDT);//建立WatchDog 中断pISR_WDT=(unsigned)watchdog_int;//Prescaler value=100、clock division factor=128//t_watchdog=1/[PCLK/(Prescaler value+1)/Division_factor]=0.00025856 //disable watchdogrWTCON=((100<<8)|(3<<3));//看门狗时钟周期T=WTCNT*t_watchdog=4S//看门狗喂狗rWTDAT=15000;rWTCNT=15000;rWTCON|=((1<<5)|(1<<2));//enable Watchdog timer ang watchdog interrupt //rWTCON|=((1<<5)|(1<<2)|1);//watchdog 复位,时间间隔为4S。
rWTCON|=(1<<5)|(1<<2);//每4S watchdog 一次中断。
//设置watchdog 为IRQ 中断模式rINTMOD&=0xFFFFFDFF;//开中断EnableIrq(BIT_WDT);while(f_ucSencondNo<11);/**** watchdog_int ****/void __irq watchdog_int(void){//清除中断ClearPending(BIT_WDT);f_ucSencondNo++;if(f_ucSencondNo<11)Uart_Printf("%ds",f_ucSencondNo);else{//mask watchdog timer interruptDisableIrq(BIT_WDT);Uart_Printf("watch dog is ok\n");}}7、实验步骤1. 连接好实验环境,将仿真器的一端通过并口连接到PC 机,将仿真器的另一端通过JTAG 线连接到GEC2410 的JTAG 接口。
2. 将串口线一端接到PC 机,另一端接到GEC2410 的UART0 接口(即P1 口);打开串口超级终端dnw.exe,设置串口Baud Rate 为115200,选择COM1。
3. 重起GEC2410,开发板会执行flash 中的BIOS 程序,选择GEC2410_Watchdog 目录下的可执行映象文件GEC2410_Watchdog.bin 将该文件下载到SDRAM。
4. 下载结束后,会提示是否要立即运行,这时输入“Y”,执行GEC2410_Watchdog.bin。
5. 在dnw 中观察实验结果。
注意:如果做看门狗复位功能实验,打开ADS CodeWarrior,在ADS CodeWarrior 中打开实验工程GEC2410_Watchdog.mcp;将文件watchdog_reset.c 加载到工程中,删除watchdog.c 文件,并对工程进行编译。
然后在对新的GEC2410_Watchdog.bin 按照上述方法下载到SDRAM 内调试,运行映象文件,从串口观察实验结果,经过几秒钟开发板重新启动,串口输出bios 字符。
8、实验结果1、观察看门狗定时器功能。
2、观察看门狗复位功能。