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;
上一篇:以AVR为基础的E2PROM数据动态存储策略
下一篇:AVR单片机的定义以及优缺点汇总
推荐阅读最新更新时间:2024-11-10 17:43