AVRATMEGA16的復位檢測和控制看門狗 系統(tǒng)控制和復位
復位來源的檢測
JTAG復位指示
看門狗復位指示
BOD復位指示
RESET引腳復位指示
上電復位指示
看門狗的控制
出于簡化程序考慮,各種數(shù)據(jù)沒有對外輸出,學習時建議使用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
//時鐘定為內(nèi)部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; //不用的管腳使能內(nèi)部上拉電阻。
PORTC =0xFF;
PORTD =0xFF;
PORTA =0xFF;
DDRA =(1< CPU_STATUS =MCUCSR; //讀取MCU控制和狀態(tài)寄存器
//可以在JTAG調(diào)試時直接觀察 MCUCSR的狀態(tài)。
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: //多種復位同時發(fā)生?
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為低電平時,復位看門狗(喂狗)
}
}
評論