嵌入式——看门狗

来源:互联网 发布:什么是网络协议 编辑:程序博客网 时间:2024/06/02 02:59

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


原创粉丝点击