WDT中断

175 阅读1分钟
//led
#define gpj2con	*((volatile unsigned*)0xe0200280)
#define gpj2dat *((volatile unsigned*)0xe0200284)

// wtchdog
#define  wtd_con 	*(unsigned*)0xe2700000
#define  wtd_dat 	*(unsigned*)0xe2700004
#define  wtd_cnt 	*(unsigned*)0xe2700008
#define  wtd_int_clr 	*(unsigned*)0xe270000c

//vic0int
#define vic0_select	*(unsigned*)0xf200000c	
#define vic0_int_enable	*(unsigned*)0xf2000010	
#define vic0_addr27	*(unsigned*)0xf200016c	
#define vic0_vectaddress	*(unsigned*)0xf2000f00
#define vic1_vectaddress	*(unsigned*)0xf2100f00
#define vic2_vectaddress	*(unsigned*)0xf2200f00
#define vic3_vectaddress	*(unsigned*)0xf2300f00

void wtd_init(void ); // wtd初始化
void vic0_init( void ); // vic0初始化
void cpu_int_on( void ); // cpu开中断
void isr( void ); // 中断响应函数
void led_init( void); // led灯初始化
void led_on( char ); // led点亮
void clear_int(void); // 清除中断
char on=0xf; // 初始时灯均不亮

void _start(void )
{
	led_init(); // led灯初始化
	wtd_init(); // wtd初始化
	vic0_init(); // vic0初始化
	cpu_int_on(); // cpu开中断

}

void wtd_init( void )
{
	//clock wtdcon:[3:4]=0  [8:15]=65     ==>   62500HZ
	wtd_con		=	wtd_con & ~(3<<3) & ~(0xff<<8) | (65<<8);	
	//wtdcnt[0:15]=wtddat[0:15]=62500HZ
	wtd_cnt		=	62500;
	wtd_dat		=	62500;


	//wtdcon [0]=0 [2]=1 [5]=1

	wtd_con		=	wtd_con & ~1 | ( 1<<2 ) | ( 1 << 5 );	
}

void vic0_init(void)
{
	//vic0intselect[27]=0  vic0intenable[27]=1 vic0vectaddr27=isr_c;
	vic0_select		=	vic0_select & ~(1<<27);
	vic0_int_enable		|= 	(0x1<<27);
	vic0_addr27		=	isr;
}


void clear_int( void )
{

	//清中断 wdtclr=0  vic0~3vectaddress=0
	wtd_int_clr		=	0;
	vic0_vectaddress	=	0;
	vic1_vectaddress	=	0;
	vic2_vectaddress	=	0;
	vic3_vectaddress	=	0;
	
}

void led_init( void )
{
	gpj2con		=	gpj2con & ~0xffff | 0x1111;
}
void led_on( char on)
{
	gpj2dat		=	gpj2dat & ~0xf | on;
}

void cpu_int_on(void) 
{
    __asm__ __volatile__(
    	"mrs r0, cpsr"  // 保存当前程序寄存器
        "bic r0, #0x80" // 第八位清零
        "orr r0, #0x40"
        "msr cpsr, r0"
        :
        :
    );


void isr()
{
    led_on(on);
    on = ~on;
}