AVRATMEGA16的復(fù)位檢測(cè)和控制看門狗 系統(tǒng)控制和復(fù)位
復(fù)位來源的檢測(cè)
JTAG復(fù)位指示
看門狗復(fù)位指示
BOD復(fù)位指示
RESET引腳復(fù)位指示
上電復(fù)位指示
看門狗的控制
出于簡(jiǎn)化程序考慮,各種數(shù)據(jù)沒有對(duì)外輸出,學(xué)習(xí)時(shí)建議使用JTAG ICE硬件仿真器。
熔絲位設(shè)置
1 使能BOD功能 BODEN=0
2 選擇BOD電平 BODLEVEL=1 2.7V(VCC=3V) (可選)
BODLEVEL=0 4.0V(VCC=5V) (可選)
*/
本文引用地址:http://m.butianyuan.cn/article/201611/321497.htm#include <avr/io.h>
#include
//時(shí)鐘定為內(nèi)部RC 1MHz,F_CPU=1000000 也可以采用其他時(shí)鐘
#include
//管腳定義
#define WDT_EN 7 //PA7 看門狗的喂狗控制引腳
// 高電平,不喂狗
// 低電平,喂狗
#define LED_JT 4 //PA4 JTAG復(fù)位指示
#define LED_WD 3 //PA3 看門狗復(fù)位指示
#define LED_BO 2 //PA2 BOD復(fù)位指示
#define LED_EXT 1 //PA1 RESET引腳復(fù)位指示
#define LED_PO 0 //PA0 上電復(fù)位指示
//以上信號(hào)皆為低電平有效
int main(void)
{
unsigned char CPU_STATUS;
unsigned char i;
//上電默認(rèn)DDRx=0x00,PORTx=0x00 輸入,無上拉電阻
PORTB =0xFF; //不用的管腳使能內(nèi)部上拉電阻。
PORTC =0xFF;
PORTD =0xFF;
PORTA =0xFF;
DDRA =(1< CPU_STATUS =MCUCSR; //讀取MCU控制和狀態(tài)寄存器
//可以在JTAG調(diào)試時(shí)直接觀察 MCUCSR的狀態(tài)。
CPU_STATUS&=0x1F;
switch (CPU_STATUS)
{
case (1< //JTAG引起的復(fù)位?
PORTA&=~(1< break;
case (1< //看門狗引起的復(fù)位?
PORTA&=~(1< break;
case (1< //BOD引起的復(fù)位?
PORTA&=~(1< break;
case (1< //RESET引腳引起的復(fù)位?
PORTA&=~(1< break;
case (1< //上電引起的復(fù)位?
PORTA&=~(1< break;
default: //多種復(fù)位同時(shí)發(fā)生?
PORTA=~CPU_STATUS;
break;
}
MCUCSR=0x00; //清除標(biāo)志位
for(i=0;i<200;i++)
_delay_ms(10); //延時(shí)2秒
wdt_enable(WDTO_2S); //使能看門狗,溢出時(shí)間為2秒左右
while(1)
{
if (!(PINA&(1< wdt_reset(); //如果PA7為低電平時(shí),復(fù)位看門狗(喂狗)
}
}
評(píng)論