嵌入式——看门狗

xiaoxiao2021-02-28  77

实验结果:按左键中断周期为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(); } }

转载请注明原文地址: https://www.6miu.com/read-28134.html

最新回复(0)