×
嵌入式 > 技术百科 > 详情

AVR看门狗

发布时间:2022-03-23 发布时间:
|

新的avr系列(例如,atmega168等)使用增强功能的看门狗(enhanced watchdog timer),与原来的看门狗相比较,除了有相同复位的功能以外,还增加了中断的功能设计时。使用看门狗的中断功能,可以实现从power down状态唤醒cpu;另外同时能使中断和复位功能,可以在系统发生错误时,先进入中断状态,保存关键数据到eeprom,然后在进行系统复位。

avr新的看门狗与旧狗(例如,atmega16等)比较,增加了新的功能的同时脾气也有了不少改变。设计时要摸清它的脾气,以防被狗咬。

下面说明以atmega16和atmega168作一个简单比较为例,简要地说明一下注意要点:

看门狗定时器控制寄存器– wdtcr:

atmega16:

atmega168:

1.a1tmega168由于具有中断功能,所以wdtcr增加了wdif和wdie两个额外的bit的功能;

2.增加了wdp3,溢出周期可以有长达8秒;

3.新的看门狗在初始化时,wdt的值不再一定是0。只要mcusr寄存器上的wdrf置位,wdt也将被强制置位。这时,如果wde要清零,必须要wdrf先清零。

4.在设计时即使不用wdt,它也可能在无意中被能使,例如在runaway指针和调电情况下。因此即使不用wdt,在初始代码中一定要检查复位标志,如果wdt系统复位发生要采取处理步骤。

最近重新设计一个项目,由原先使用的atmega16更新到atmega168。把原代码转换后,测试结果异常。经过一天多的测试,才发现是新的看门狗惹的祸。以前用atmega16,在初始化后才开始喂狗,可是新的avr系列(例如atmega168等),系统复位发生时(除上电复位外) ,wdt可能继续运行,并使用最小溢出周期(大约15ms) ,造成了系统不断复位。根据datasheet,在程序开始时的关狗后一切就恢复正常了:

#include

#include

uint8_t mcusr_mirror;

void get_mcusr(void) \

__attribute__((naked)) \

__attribute__((section(".init3")));

void get_mcusr(void)

{

mcusr_mirror = mcusr;

mcusr = 0;

wdt_disable();

}

5.使用看门狗的中断时,当wdif和wdie置位,就会产生中断。进入相应的中断程序后,系统自动wdif和wdie清零。下次要使用看门狗的中断时必须重新wdie置位。

imgload(document.getelementbyid("bodylabel"));


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
NS推出采用第二代PowerWise技术的能源管理单元及先进电源控制器