ここを参考に
http://e-trees.jp/wp/2015/10/14/post-316/
PYNQ Arduino IOPにはタイマーが複数(0~5までの6個)あるので
今回はタイマー0を使ってみた
main.c
#include <stdio.h> #include "platform.h" #include "xtmrctr.h" #include "xintc.h" #include "xparameters.h" #include "xbasic_types.h" //void myprint(char *str); void timer_int_handler(); void timer_int_handler() { volatile static int cnt; volatile unsigned int csr; csr = XTmrCtr_GetControlStatusReg(XPAR_IOP_ARDUINO_TIMERS_SUBSYSTEM_TIMER_0_BASEADDR, 0); xil_printf("Interrupt timer!! %d\r\n", cnt++); XTmrCtr_SetControlStatusReg(XPAR_IOP_ARDUINO_TIMERS_SUBSYSTEM_TIMER_0_BASEADDR, 0, csr); } XTmrCtr tmr; XIntc intc; int main() { init_platform(); print("Hello World\n\r"); XStatus status; status = XIntc_Initialize(&intc, XPAR_INTC_0_DEVICE_ID); if (status != XST_SUCCESS){print("intc init error\n\r"); return status;} status = XTmrCtr_Initialize(&tmr, XPAR_IOP_ARDUINO_TIMERS_SUBSYSTEM_TIMER_0_DEVICE_ID); if (status != XST_SUCCESS){print("timer init error\n\r"); return status;} status = XIntc_Connect(&intc, XPAR_INTC_0_TMRCTR_0_VEC_ID, (XInterruptHandler)XTmrCtr_InterruptHandler, (void*)&tmr); if (status != XST_SUCCESS){print("connect error\n\r"); return status;} status = XIntc_Start(&intc, XIN_REAL_MODE); if (status != XST_SUCCESS){print("intc start error\n\r"); return status;} XIntc_Enable(&intc, XPAR_INTC_0_TMRCTR_0_VEC_ID); XTmrCtr_SetHandler(&tmr, (void*)timer_int_handler, (void*)0); microblaze_enable_interrupts(); print("setup finished\n\r"); // see LogiCORE IP AXI Timer Product Guide, PG079 XTmrCtr_SetOptions(&tmr, 0, XTC_INT_MODE_OPTION | XTC_AUTO_RELOAD_OPTION | XTC_DOWN_COUNT_OPTION); XTmrCtr_SetResetValue(&tmr, 0, 66666667); XTmrCtr_Start(&tmr, 0); print("wait for interrupts\n\r"); for(;;){} return 0; }