ATMEGA324P的AVR看门狗使用

发布者:MysticalWhisper最新更新时间:2020-02-13 来源: eefocus关键字:ATMEGA324P  AVR  看门狗使用 手机看文章 扫描二维码
随时随地手机看文章

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  看门狗使用 引用地址:ATMEGA324P的AVR看门狗使用

上一篇:以AVR为基础的E2PROM数据动态存储策略
下一篇:AVR单片机的定义以及优缺点汇总

推荐阅读最新更新时间:2024-11-10 17:43

基于AVR单片机的SPI接口的25C256
基于AVR单片机的SPI接口的25C256(EEPROM)的驱动程序 /**********************************硬件宏定义***********************************/ #define SelectMemory1() (PORTA&=~0X01) #define DeselectMemory1() (PORTA|=0X01) #define ClrHoldMemory1() (PORTA&=~(0X01 2)) #define SetHoldMemory1() (PORTA|=(0X01 2)) /***********************************初始化SP
[单片机]
AVR--IO设置编程
AVR的C语言基于ANSI C,没有像51那样扩展了位操作(布尔操作),虽然汇编指令里面有SBI/CBI/SBIC/SBIS指令。所以需要采用 位逻辑运算 来实现,这是必须要掌握的。IO口和功能寄存器的操作方法一样,但对于部分功能寄存器的读写有特殊要求,请参看手册。不必考虑代码效率的问题,如果可能,GCCAVR会自动优化为SBI/CBI/SBIC/SBIS指令,跟汇编的效率是一样的。 例如 iom16.h 里面定义了 1 例如 iom16.h 里面定义了 2 3 #define PA0 0 4 5 PA0为1 PORTA |= (1 PA0) 6 PA0为0 PORTA &= ~(1 PA0)
[单片机]
<font color='red'>AVR</font>--IO设置编程
AVR USART串口程序
usart简介: 通用同步和异步串行接收器和转发器(USART) 是一个高度灵活的串行通讯设备。主要特点为: 全双工操作( 独立的串行接收和发送寄存器) 异步或同步操作 主机或从机提供时钟的同步操作 高精度的波特率发生器 支持5, 6, 7, 8, 或9 个数据位和1 个或2 个停止位 硬件支持的奇偶校验操作 数据过速检测 帧错误检测 噪声滤波,包括错误的起始位检测,以及数字低通滤波器 三个独立的中断:发送结束中断, 发送数据寄存器空中断,以及接收结束中断 多处理器通讯模式 倍速异步通讯模式 数据读写 官方解释 USART的初始化 void USART_Init( unsigned int baud ) { /* 设置波特
[单片机]
AVR单片机PWM产生
计数器的上限值决定了 PWM 的频率,比较匹配寄存器的值决定了占空比的大小 下面是一个用t0产生PWM的例子 #include avr/io.h #include avr/interrupt.h int main(void) { DDRA=0XFF; DDRB=0XFF; PORTA=0XFF; PORTB=0X00; TIMSK=0X00; TCNT0=0; OCR0=240; TCCR0=0B01101001; while(1); }
[单片机]
AVR单片机应用经验总结
使用更好的器件只是为设计实现一个好的系统创造了一个好的基础和可能性,如果还采用和沿袭以前传统的硬件和软件设计思想和方法的话,是不能用好AVR的,甚至也不能真正的了解AVR的特点和长处。 功能越好的器件,需要具备更高技术和能力的人来使用和驾驭它。就象一部好的F1赛车,只有具备高超技术的驾驶员才能充分体会到车的特点,并能最大限度的发挥出车的性能。 AVR具有上手入门快,开发方便简单的特点,但要充分体会和发挥AVR的优点,还需要应用工程师本身的硬软件设计开发能力的不断学习、实践提高。 “外行看热闹,内行看门道”,对于有一定基础的嵌入式和单片机系统设计开发的工程师,不妨先简单尝试一下AVR。 开发环境与工具:PC+下载线+
[单片机]
AVR单片机频率计设计 频率输入源STM32口
//---------------------STM32 3.3V转5V输出电路------------------------ 完整的程序源码下载: http://www.51hei.com/f/avrplj.rar //---------------------AVR代码----------------------- //芯片用ATMEG16 #include iom16.h #define uchar unsigned char #define uint unsigned int __flash uchar seg ={0x3f,0x06,0x5b,0x4f,0x66,0
[单片机]
<font color='red'>AVR</font>单片机频率计设计 频率输入源STM32口
AVR单片机中断的学习探究(外部中断与内部中断)
最开始的一点,所有中断的配置都必须要打开全局中断控制#asm(“sei”) //打开SREG的全局使能I置位 首先博主先探究了一下AVR单片机的外部中断。 外部中断需要用的必须先看原理图的INT0 INT1的引脚。因为外部中断是通过这两个引脚来触发,只要使能引脚,而且配置引脚为输出方式,电平如果发生合适的变化(具体通过高低电平还是上升沿下降沿控制是通过MCUCR寄存器来控制),中断便会触发。 配置外部中断相应的寄存器初始化的步骤--写在init.c中: (1)还是第一点,打开全局中断使能位; (2)配置MCUCR寄存器,通过控制寄存器的位数来控制具体由什么信号来触发中断; (3)配置通用中断控制寄存器 GICR:控制哪一个外部中
[单片机]
AVR稳压电源可调控制的作用
AVR 稳压电源 可调控制可以选用三端可调稳压块LM317T,经外接大功率三极管2N3055扩流后输出。输出电压在0.8V至24V内接连可调。过载、短路维护电流为1.4A(实测值),维护电路由R1~R4、V1、V2、C2、单向可控硅VS及继电器等组成。 一、当输出端出现过载、短路,取样电阻R1 上的电流到达1.4A时,继电器吸合,输出端开关K接至 B点,输出电流被切断,实现了维护。LED1点亮,讯响器H响起,发出声光报警。待扫除过载、短路后,按复位开关S,V2导通,VS关断,继电器释放。开关K接A点输出恢复正常,维护被免除。 二、电话机测验仪本电路中的电话机测验仪具有振铃、拨号、送话三种测验功用。经过功用挑选开关SK来挑选需求的测
[电源管理]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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