×
单片机 > 单片机程序设计 > 详情

ATMEGA324P的AVR看门狗使用

发布时间:2020-08-31 发布时间:
|

AVR芯片大多数都有看门狗功能,看门狗电路实际上是一个定时电路,该定时器使用内部独立的1M的RC振荡器,根据设置看门狗的定时时间,当程序运行超过规定的时间后,如果没有及时复位看门狗(俗称喂狗),看门狗定时器就会发生溢出,这个溢出将导致程序复位,从而保证在程序跑飞的情况下,不会长时间没有响应。WIN AVR内部带有看门狗函数,需要包含头文件:#include


新的AVR系列(例如,ATMEGA324P等)使用增强功能的看门狗(Enhanced Watchdog Timer),与原来的看门狗相比较,除了有相同复位的功能以外,还增加了中断的功能设计。使用看门狗的中断功能,可以实现从Power Down状态唤醒CPU;另外同时使能中断和复位功能,可以在系统发生错误时,先进入中断状态,保存关键数据到EEPROM,然后再进行系统复位。


下面说明以ATMEGA324P作一个简单例子,简要地说明一下注意要点:

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



1.A1tmega168由于具有中断功能,所以WDTCR增加了WDIF和WDIE两个额外的bit的功能;


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


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


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


AVR的看门狗是软狗,也是硬狗! 如果熔丝位不设定,就是软狗,因为程序可以关闭,也可以打开 如果熔丝位设定了,就是硬狗,因为程序只可以清除,而无法打开或关闭!如果你的while(1)循环体内每循环一次的时间不超过看门狗的复位时间,只要喂狗一次就可以了。


最近重新设计一个项目,由原先使用的ATMEGA16更新到ATMEGA324P。把原代码转换后,测试结果异常。经过一天多的测试,才发现是新的看门狗惹的祸。以前用ATMEGA16,在初始化后才开始喂狗,可是新的AVR系列(例如ATMEGA324P等),系统复位发生时(除上电复位外) ,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。


//在AVR ICC中对M128的初始化时最近使用下种方式


void Init_watdog(void)


{


WDR();


WDTCR = 0x1F;//设置最大分频


WDTCR = 0x0f;//启动看门狗


}


WDR();


补充,特别说明


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


还有数据手册上说:


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

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

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


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

关键字:ATMEGA324P  AVR  看门狗使用 

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

热门文章 更多
ARM 汇编的必知必会