// axi_timer_test.c
// 2023/03/02 by marsee
// ”MicroBlazeのタイマー割り込みを使う” https://e-trees.jp/wp/?p=316 からコードを引用
// gpio関連のコードを”Xilinx AXI GPIO の使い方” https://qiita.com/s_nkg/items/800e0559332495605056 から引用
#include <stdio.h>
#include "xtmrctr.h"
#include "xintc.h"
#include "xparameters.h"
#include "xbasic_types.h"
#include "xgpio.h"
void timer_int_handler();
XTmrCtr tmr;
XIntc intc;
XGpio gpio_0;
u32 gpio_status=0;
void timer_int_handler()
{
volatile unsigned int csr;
csr = XTmrCtr_GetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0);
if(gpio_status == 0)
gpio_status = 0xf;
else
gpio_status = 0;
XGpio_DiscreteWrite(&gpio_0, 1, gpio_status);
XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0, csr);
}
int main()
{
XIntc_Initialize(&intc, XPAR_INTC_0_DEVICE_ID);
XTmrCtr_Initialize(&tmr, XPAR_AXI_TIMER_0_DEVICE_ID);
XGpio_Initialize(&gpio_0, XPAR_GPIO_0_DEVICE_ID);
XIntc_Connect(&intc, XPAR_INTC_0_TMRCTR_0_VEC_ID, (XInterruptHandler)XTmrCtr_InterruptHandler, (void*)&tmr);
XIntc_Start(&intc, XIN_REAL_MODE);
XIntc_Enable(&intc, XPAR_INTC_0_TMRCTR_0_VEC_ID);
XTmrCtr_SetHandler(&tmr, (void*)timer_int_handler, (void*)0);
microblaze_enable_interrupts();
// 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, 50000000);
XTmrCtr_Start(&tmr, 0);
for(;;){}
return 0;
}
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
- | - | - | 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 | - |