AVRATMEGA16的复位检测和控制
看门狗 系统控制和复位
复位来源的检测
JTAG复位指示
看门狗复位指示
BOD复位指示
RESET引脚复位指示
上电复位指示
看门狗的控制
出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器。
熔丝位设置
1 使能BOD功能 BODEN=0
2 选择BOD电平 BODLEVEL=1 2.7V(VCC=3V) (可选)
BODLEVEL=0 4.0V(VCC=5V) (可选)
*/
#include avr/io.h>
#include
//时钟定为内部RC 1MHz,F_CPU=1000000 也可以采用其他时钟
#include
//管脚定义
#define WDT_EN 7 //PA7 看门狗的喂狗控制引脚
// 高电平,不喂狗
// 低电平,喂狗
#define LED_JT 4 //PA4 JTAG复位指示
#define LED_WD 3 //PA3 看门狗复位指示
#define LED_BO 2 //PA2 BOD复位指示
#define LED_EXT 1 //PA1 RESET引脚复位指示
#define LED_PO 0 //PA0 上电复位指示
//以上信号皆为低电平有效
int main(void)
{
unsigned char CPU_STATUS;
unsigned char i;
//上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻
PORTB =0xFF; //不用的管脚使能内部上拉电阻。
PORTC =0xFF;
PORTD =0xFF;
PORTA =0xFF;
DDRA =(1 CPU_STATUS =MCUCSR; //读取MCU控制和状态寄存器
//可以在JTAG调试时直接观察 MCUCSR的状态。
CPU_STATUS&=0x1F;
switch (CPU_STATUS)
{
case (1 //JTAG引起的复位?
PORTA&=~(1 break;
case (1 //看门狗引起的复位?
PORTA&=~(1 break;
case (1 //BOD引起的复位?
PORTA&=~(1 break;
case (1 //RESET引脚引起的复位?
PORTA&=~(1 break;
case (1 //上电引起的复位?
PORTA&=~(1 break;
default: //多种复位同时发生?
PORTA=~CPU_STATUS;
break;
}
MCUCSR=0x00; //清除标志位
for(i=0;i<200;i++)
_delay_ms(10); //延时2秒
wdt_enable(WDTO_2S); //使能看门狗,溢出时间为2秒左右
while(1)
{
if (!(PINA&(1 wdt_reset(); //如果PA7为低电平时,复位看门狗(喂狗)
}
}