嵌入式——看门狗

实验结果:按左键中断周期为2秒,led灯向左亮;按右键中断周期为3秒,led灯向右亮。超级终端上显示为按左键每两秒显示一次key0,按右键每三秒显示一次key1

#define rCPLDLEDADDR  (*(volatile unsigned char*)0x21180000) 			// LED Address
#define rCPLDIntControl  (*(volatile unsigned char*)0x22600000)
#define rCPLDIntStatus   (*(volatile unsigned char*)0x22200000)

void  __irq int_int(void);
void  __irq watchdog_int(void);
int flag=0;
void __irq watchdog_int(void)  //输出函数  输出key0 key1显示在超级终端上(key0每两秒出现一次,key1每三秒出现一次)
{   
	ClearPending(BIT_WDT);
	if(flag==0)
		uart_printf(" key0 ");
	else
		uart_printf(" key1 ");
		
}
void  __irq int_int(void) 
{
 	unsigned char Status;

	Status = rCPLDIntStatus;
	Status = ~(Status & 0x6);

    if(Status & 0x2)
	{
		
		flag=0;
		rWTDAT = 15624;		     	// 将初值设为原来的二倍,周期加长,变成2秒
  	    rWTCNT = 15624;    
		
		rCPLDIntControl |= (1<<1);
		rCPLDIntControl &= ~(1<<1);
	}
	else if(Status & 0x4)
	{
		flag=1;
		
		rWTDAT = 23436;	    		// 将初值设为原来的三倍,周期加长,变成3秒
	    rWTCNT = 23436;   
		rCPLDIntControl |= (1<<2);
		rCPLDIntControl &= ~(1<<2);
	}

	rEINTPEND=(1<<9);
    ClearPending(BIT_EINT8_23);
}

void int_init(void)              
{
    rSRCPND = rSRCPND;                			// Clear all interrupt
    rINTPND = rINTPND;                			// Clear all interrupt
    ClearPending(BIT_WDT);							// clear interrupt pending bit

    rGPGCON |= (0xf<<0);			
    rGPGCON &= (0xa<<0);		

	rCPLDIntControl = 0xFF;
	rCPLDIntControl = 0xF9;


	rEINTPEND = 0xffffff;
	rSRCPND = BIT_EINT8_23;						// Clear the previous pending states
	rINTPND = BIT_EINT8_23;
    
	rEXTINT1 &= ~((0x7<<4)|(0x7<<0));
	rEXTINT1 |= ((0x2<<4)|(0x2<<0));

	rEINTMASK &= ~(3<<8);
	rINTMSK   &= ~(BIT_EINT8_23);
}

void led_Z(void)      //从右向左亮
{
	int i,nOut;
	nOut = 0xFF;

	rCPLDLEDADDR = nOut & 0xFE;
	for(i = 0; i < 100000; i++);
	rCPLDLEDADDR = nOut & 0xFC;  
	for(i = 0; i < 100000; i++);	
	rCPLDLEDADDR = nOut & 0xF8;   
	for(i = 0; i < 100000; i++);	
	rCPLDLEDADDR = nOut & 0xF0;  
	for(i = 0; i < 100000; i++);
	nOut = 0xF0;	
	rCPLDLEDADDR = nOut | 0x01;
	for(i = 0; i < 100000; i++);	
	rCPLDLEDADDR = nOut | 0x03; 
	for(i = 0; i < 100000; i++);	
	rCPLDLEDADDR = nOut | 0x07; 
	for(i = 0; i < 100000; i++);	
	rCPLDLEDADDR = nOut | 0x0F; 
	for(i = 0; i < 100000; i++);
}

void led_Y(void)//从左向右亮
{
	int i,nOut;
	nOut = 0xFF;

	rCPLDLEDADDR = nOut & 0xF0;
	for(i = 0; i < 100000; i++);
	rCPLDLEDADDR = nOut & 0xF8;  
	for(i = 0; i < 100000; i++);	
	rCPLDLEDADDR = nOut & 0xFC;   
	for(i = 0; i < 100000; i++);	
	rCPLDLEDADDR = nOut & 0xFE;  
	for(i = 0; i < 100000; i++);
	nOut = 0xF0;	
	rCPLDLEDADDR = nOut | 0x0F;
	for(i = 0; i < 100000; i++);	
	rCPLDLEDADDR = nOut | 0x07; 
	for(i = 0; i < 100000; i++);	
	rCPLDLEDADDR = nOut | 0x03; 
	for(i = 0; i < 100000; i++);	
	rCPLDLEDADDR = nOut | 0x01; 
	for(i = 0; i < 100000; i++);
}

void wt_init(void)   //初始化看门狗,这里将所有的值都得到了,可直接在mian函数中调用
{
	pISR_EINT8_23=(UINT32T)int_int; 
	pISR_WDT = (unsigned)watchdog_int;
	rWTCON = ((PCLK/1000000-1)<<8)|(3<<3)|(1<<2);
	rWTDAT = 15624;							
	rWTCNT = 15624;
	rWTCON |=(1<<5);
	rINTMOD &= ~(BIT_WDT);
	rINTMSK &= ~(BIT_WDT);
}


void int_test(void) //执行流水灯程序
{

	uart_printf("\n External Interrupt Test Example\n");
	int_init();
	while(1)
	{
		if(flag==0)
			led_Y();
		else if(flag==1)
			led_Z();
	}
}



#include "int_test.h"
#include "sys_init.h"

int main( )
{
	sys_init();    	    // Initial s3c2410's Clock, Interrupt,Port and UART 
    wt_init();      
	int_init();
	while(1)
	{
		int_test();	
	}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值