INT32U InstallHandler(INT32U routine, INT8U vector, INT8U channel, INT8U irq_mode)<br />{<br /> INT32U old_routine;<br /> volatile INT32U *addr;<br /> <br /> addr = (volatile INT32U *)&VICVectAddr0;<br /> old_routine = addr[vector];<br /> if (vector > 15 || channel > 20)<br /> return old_routine; <br /> <br /> addr[vector] = routine;<br /> addr = (volatile INT32U *)&VICVectCntl0;<br /> addr[vector] = 0x20 | channel;<br /> if (FIQ_MODE == irq_mode)<br /> VICIntSelect |= (1 << channel);<br /> VICIntEnable = 1 << channel;<br /> <br /> return old_routine;<br />}<br /><br /><br />void IRQ_Def_Exception(void)<br />{ <br /> //VICVectAddr = 0; // change it to your code ÕâÒ»¾äÌæ»»Îª×Ô¼ºµÄ´úÂë<br />}<br /><br /> void VICInit(void)<br />{<br /> //extern void IRQ_Handler(void);<br /> //extern void Timer0_Handler(void);<br /> unsigned long *vec_addr;<br /> unsigned long *ctr_addr;<br /> unsigned char i;<br /><br /> <br /> vec_addr = (unsigned long *)&VICVectAddr0;<br /> ctr_addr = (unsigned long *)&VICVectCntl0;<br /> VICIntEnClr = 0xffffffff;<br /> VICDefVectAddr = (uint32)IRQ_Def_Exception;<br /> VICVectAddr = 0;<br /> for (i=0; i<16; i++)<br /> {<br /> *vec_addr = (unsigned long)IRQ_Def_Exception;<br /> *ctr_addr = 0;<br /> vec_addr++;<br /> ctr_addr++;<br /> }<br /> }<br /><br /><br />typedef void (*BSP_PFNCT)(void);<br /><br /><br /><br />/*********************************************************************************************************/<br />void IRQ_Handle_Exception (void)<br />{<br /> BSP_PFNCT pfnct;<br /> while(1)<br /> {<br /> pfnct = (BSP_PFNCT)VICVectAddr;<br /> //VICVectAddr = 0;<br /> if (pfnct != (BSP_PFNCT)0)<br /> {<br /> pfnct ();<br /> VICVectAddr = 0;<br /> if (pfnct == IRQ_Def_Exception)<br /> {<br /> break;<br /> }<br /> }<br /> else<br /> {<br /> VICVectAddr = 0;<br /> break;<br /> }<br /> } <br />}<br />
|