void TimerCounterHandler(void* CallBackRef, u8 TmrCtrNumber) { XTmrCtr* InstancePtr = (XTmrCtr*)CallBackRef; if (XTmrCtr_IsExpired(InstancePtr, TmrCtrNumber)) { xil_printf("count = %d\r\n", count++); } }
/*定时器中断服务程序*/ void timer_int_handler(void * CallBackRef, u8 TmrCtrNumber){ //设置回调函数 XTmrCtr * InstancePtr = (XTmrCtr *)CallBackRef; //检查定时器的值是否过期 if(XTmrCtr_IsExpired(InstancePtr, TmrCtrNumber)){ count++; one_second_flag = 1; //通过UART在终端上打印技术值 xil_printf("Count value is: %x\n\r", count); } }
void usleep(unsigned int duration){ XTmrCtr *TmrCtrInstancePtr = &TimerCounter; XTmrCtr_SetResetValue(TmrCtrInstancePtr,0,duration*(TIMER_FREQ/1000000)); XTmrCtr_Start(TmrCtrInstancePtr,0); volatile u8 isExpired = 0; while(isExpired!=1){ isExpired = XTmrCtr_IsExpired(TmrCtrInstancePtr,0); } XTmrCtr_Reset(TmrCtrInstancePtr,0); return; }
/* * Timer Interrupt Handler */ void tmrIntrHandler(void *InstancePtr) { if (XTmrCtr_IsExpired(&tmrCtr, 0)) { //Stop Timer Controller XTmrCtr_Stop(&tmrCtr, 0); //Set flag tmrExpired = BOOL_TRUE; //Reset Timer Controller XTmrCtr_Reset(&tmrCtr, 0); //Start Timer XTmrCtr_Start(&tmrCtr, 0); } }
/** * This function is the handler which performs processing for the timer counter. * It is called from an interrupt context such that the amount of processing * performed should be minimized. It is called when the timer counter expires * if interrupts are enabled. * * This handler provides an example of how to handle timer counter interrupts * but is application specific. * * @param CallBackRef is a pointer to the callback function * @param TmrCtrNumber is the number of the timer to which this * handler is associated with. * * @return None. * * @note None. * ******************************************************************************/ void TimerCounterHandler(void *CallBackRef, u8 TmrCtrNumber) { XTmrCtr *InstancePtr = (XTmrCtr *)CallBackRef; /* * Check if the timer counter has expired, checking is not necessary * since that's the reason this function is executed, this just shows * how the callback reference can be used as a pointer to the instance * of the timer counter that expired, increment a shared variable so * the main thread of execution can see the timer expired */ if (XTmrCtr_IsExpired(InstancePtr, TmrCtrNumber)) { TimerExpired++; if(TimerExpired == 3) { XTmrCtr_SetOptions(InstancePtr, TmrCtrNumber, 0); } } }
int main (void) { int old_count = 0; gpio_init(); XGpio_DiscreteWrite(&led,1,0); XGpio_DiscreteWrite(&ledPush,1,0x1); xil_printf("-- Entering main() --\r\n"); XTmrCtr_Initialize(&XTC, XPAR_OPB_TIMER_1_DEVICE_ID ); XTmrCtr_SetOptions(&XTC, 0, XTC_DOWN_COUNT_OPTION | XTC_INT_MODE_OPTION | XTC_AUTO_RELOAD_OPTION ); XTmrCtr_SetHandler(&XTC, TimerCounterHandler, &XTC); microblaze_register_handler( (XInterruptHandler)XTmrCtr_InterruptHandler, &XTC ); microblaze_enable_interrupts(); XTmrCtr_SetResetValue ( &XTC, 0, 50*1000000L ); XTmrCtr_Start( &XTC, 0 ); XGpio_DiscreteWrite(&ledPush,1,0x3); while(1) { if (gpio_check()) break; if ( old_count != intr_count ) { xil_printf(" TmrCtr update %d\r\n", intr_count ); XGpio_DiscreteWrite(&led,1,3); XGpio_DiscreteWrite(&ledPush,1,0x10 | (intr_count&0xF)); old_count = intr_count; } } if ( XTmrCtr_IsExpired( &XTC, 0 ) ) { xil_printf(" TmrCtr Timed out\r\n" ); } else { xil_printf(" TmrCtr un-Timeout\r\n" ); } XTmrCtr_Stop(&XTC, 0 ); microblaze_disable_interrupts(); XGpio_DiscreteWrite(&ledPush,1,0x10); xil_printf("-- Exiting main() --\r\n"); return 0; }