AVR看门狗详解

2020-03-03来源: eefocus关键字:AVR  看门狗  硬件单元

简介:AVR看门狗 一个硬件单元,当程序由于某种原因跑“飞”了,它就Reset程序。就像小狗看门一样。


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的看门狗是软狗,也是硬狗! 如果熔丝位不设定,就是软狗,因为程序可以关闭,也可以打开 如果熔丝位设定了,就是硬狗,因为程序只可以清除,而无法打开或关闭!


是不是在程序中加入 WDR(); 就算“喂狗”了?喂狗好象要计算好时间吧?我每执行一个函数就喂狗一次如何?


如果你的循环体内每循环一次的时间不超过看门狗的复位时间,主要喂狗一次就可以了。


AVR看门狗程序范例,程序演示了看门狗的复位过程,使用了本站新手入门的第一个范例,普通情况下,程序最后陷入死循环,但是这个程序里,看门狗让单片机复位,你会看见LED一直闪动,效果和第一个范例程序相同。


就两点,初始化,然后喂狗,喂狗要在看门狗咬人之前,(复位之前喂狗)。



1.jpg



//ICC-AVR application builder : 2012-1-31 17:27:04


// Target : M16


// Crystal: 7.3728Mhz


// Auther: 古欣


// 看门狗复位演示程序。


#include


#include


void port_init(void)


{


PORTA = 0x03; //设置为输出


DDRA = 0x03; //高电平,两个LED都灭


PORTB = 0x00;


DDRB = 0x00;


PORTC = 0x00; //m103 output only


DDRC = 0x00;


PORTD = 0x00;


DDRD = 0x00;


}


//Watchdog initialize


// prescale: 2048K //预分频越大,定时时间越长,也就是可以更长时间不喂


// 约为2.1s复位 (根据数据手册,2048K,5V典型值)


void watchdog_init(void)


{


WDR(); //this prevents a timout on enabling


WDTCR = 0x1F; //特别注意这一条不是ICC生成的,是后来加上的。


WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs


}


//加入了喂狗的延时程序


void Delay(void)


{


unsigned char i,j;


for(i=200;i>0;i--)


{


for(j=200;j>0;j--)


;


}


WDR(); //这里喂狗


}


//call this routine to initialize all peripherals


void init_devices(void)


{


//stop errant interrupts until set up


CLI(); //disable all interrupts


port_init();


watchdog_init();


MCUCR = 0x00;


GICR = 0x00;


TIMSK = 0x00; //timer interrupt sources


SEI(); //re-enable interrupts


//all peripherals are now initialized


}


void main(void)


{


unsigned int i;


init_devices(); //初始化


for(i=10;i>0;i--) //看到程序的闪动


{


PORTA = 0x02; //1脚为高,0脚为低,0脚灯亮


Delay(); //延时


PORTA = 0x01; //0脚为高,1脚为低,1脚灯亮


Delay(); //延时


}


while(1) //普通情况下,程序会陷入这里一直循环。


; //看门狗能够让单片机复位,程序重新运行,我们看到LED闪烁。


//如果在这里加入WDR(); 喂狗,单片机就不会复位了。


}


补充,特别说明


使能看门狗不能用 |=,必须要直接赋值=。


还有数据手册上说:


改变定时器溢出时间及禁止(已经使能的)看门狗定时器需要执行一个特定的时间序列:


1. 在同一个指令内对WDCE 和WDE 写"1“,即使WDE 已经为"1“。


2. 在紧接的4 个时钟周期之内将WDE 和WDP 设置为合适的值,而WDCE 写"0”。


所以在WDTCR=0x0E;之前加上一句WDTCR=0x1F;


void watchdog(void)


{


WDR(); //看门狗计数清零


WDTCR=0x1F; //使能watchdog,并且,采用2048K分频,典型溢出时间5V时2.1S


WDTCR=0x0F; //使能watchdog,并且,采用2048K分频,典型溢出时间5V时2.1S


}


initial_WDT:


WDR ;2011-09-22增加看门狗


LDI R16, $1F


OUT WDTCR,R16 ;使能watchdog,并且,采用2048K分频,典型溢出时间5V时2.1S


LDI R16, $0F


OUT WDTCR,R16

关键字:AVR  看门狗  硬件单元 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic490267.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:利用笔记本电脑废热供能的笔记本散热器具体方案
下一篇:使用KEIL、Atmel studio将数组定义在Flash区

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

Microchip推出全新功能安全型AVR® DA系列单片机,支持实时控制、连接和HMI应用
随着物联网(IoT)为工业和家庭应用提供更强的连接性,以及车联网提升了驾驶室和操控功能,业界需要更高性能的单片机来实现更好的实时控制以及增强的人机接口应用。Microchip Technology Inc.(美国微芯科技公司)日前宣布推出下一代AVR® DA系列单片机(MCU),是其首款带有外设触摸控制器(PTC)的功能安全型AVR MCU系列。Microchip 8位单片机事业部助理营销副总裁Greg Robinson表示:“新推出的AVR DA单片机系列继承了Microchip高性能和高代码效率器件的优势,通过搭载先进模拟和独立于内核的外设,以及比现有器件更多的电容式触摸通道,满足了多个行业的新需求。新的单片机系列产品广泛应用
发表于 2020-05-07
Microchip推出全新功能安全型AVR® DA系列单片机,支持实时控制、连接和HMI应用
Microchip推出全新功能安全型AVR® DA系列单片机
随着物联网(IoT)为工业和家庭应用提供更强的连接性,以及车联网提升了驾驶室和操控功能,业界需要更高性能的单片机来实现更好的实时控制以及增强的人机接口应用。Microchip Technology Inc.(美国微芯科技公司)今日宣布推出下一代AVR® DA系列单片机(MCU),是其首款带有外设触摸控制器(PTC)的功能安全型AVR MCU系列。 Microchip 8位单片机事业部助理营销副总裁Greg Robinson表示:“新推出的AVR DA单片机系列继承了Microchip高性能和高代码效率器件的优势,通过搭载先进模拟和独立于内核的外设,以及比现有器件更多的电容式触摸通道,满足了多个行业的新需求。新的单片机
发表于 2020-05-06
Microchip推出全新功能安全型AVR® DA系列单片机
AVR BOOTLOADER 实例开发笔记
Bootloader程序的开始也定位到那里。a)在avrstudio项目设置的Memory setting中添加一个段(段名记住要加个点在前面)。地址是bootloader首地址的一半(这是由于计算单位不同,一个是字节、一个是字)。也可以用保留段名“.text”,这样所有的内容都将默认到text段去。b)代码地址指定:在函数声明之前加一个宏指令,比如:__attribute__((section(".BootLoad")))void ABCfuntion(void){……}。3、BootLoader程序本身倒比较简单,就是通过数据接口(一般是串口,其实也可以是其它接口,比如有些AVRUSB系统)把bin文件
发表于 2020-04-28
AVR BOOTLOADER 实例开发笔记
avr bootloader学习
Spm操作步骤:1.检查SPM 操作是否已经完成2.保存状态寄存器,关中断3.检查当前是否有EEPROM写操作4.执行SPM5.恢复状态寄存器,开中断.FLASH自编程过程:1.页擦除2.全能RWW区3.把数据从RAM移到时FLASH缓冲区4.页写5.重新使能RWW区6.从FLASH读回数据,比较检查写入是否正确(此步骤为可选操作)7.检查RWW区可以安全读取,函数返回.
发表于 2020-04-28
基于AVR-BootLoader,通过霜蝉远程串口可实现单片机的远程升级
最近一直利用业余时间写自己的“基于AVR-BootLoader”,启发是由于一次在ourAVR论坛看到了绍子阳的bootloader,联想到公司在用AVR MCU,但每次升级程序都要花费很大的力气车马劳顿的跑到工程现场,而且很多机器还安装在国外,为了升级一次程序发费了很多的人力物力财力,加上公司的机器目前大部分都配有远程监控系统,所以本人决定写一个具有自有产权的“AVR-BootLoader”。    特别说明:本“AVR-BootLoad”软件代码属上海霜蝉版权所有,在此贡献发布,仅限于个人免费使用不得用于商业用途,本人也不保证代码的严谨性,如在升级中出现任何问题与本人无关,本人已测试
发表于 2020-04-28
基于AVR-BootLoader,通过霜蝉远程串口可实现单片机的远程升级
AVR C语言宏定义技巧(常用宏定义)
01: 防止一个头文件被重复包含#ifndef COMDEF_H#define COMDEF_H//头文件内容#endif02: 重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。typedef  unsigned char      boolean;     /* Boolean value type. */typedef  unsigned long int  uint32;      /* Unsigned 32 bit value */typedef  unsig
发表于 2020-04-28
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved