c - Microblaze multiple interrupt code not work -
c - Microblaze multiple interrupt code not work -
i have simple microblaze 2 gpio (push button , switches) want manage both devices interrupt. here code not work.
#include<xparameters.h> #include<xgpio.h> #include<xintc.h> #include<xil_exception.h> static xgpio pushbt; static xgpio sw; static xintc myintc; int delay, limit=3000000; void pb_int_handler(void *baseaddr_p) { xuint32 dsr; //dsr contains info of button depressed, can switch //on value. dsr = xgpio_discreteread(&pushbt, 1); switch(dsr) { case 0x01: xil_printf("up\r\n"); for(delay=0;delay<limit;delay++){}; // delay cycle break; case 0x02: xil_printf("left\r\n"); for(delay=0;delay<limit;delay++){}; // delay cycle break; case 0x08: xil_printf("right\r\n"); for(delay=0;delay<limit;delay++){}; // delay cycle break; case 0x04: xil_printf("down\r\n"); for(delay=0;delay<limit;delay++){}; // delay cycle break; default : {} } //clear interrupt both in gpio instance interrupt controller xgpio_interruptclear(&pushbt, 0x3); xintc_acknowledge(&myintc,xpar_axi_intc_0_push_ip2intc_irpt_intr); } void sw_int_handler(void *baseaddr_p) { xuint32 dsr; //dsr contains info of button depressed, can switch //on value. dsr = xgpio_discreteread(&sw, 1); switch(dsr) { case 0x00: xil_printf("switches 00 \r\n"); for(delay=0;delay<limit;delay++){}; // delay cycle break; case 0x01: xil_printf("switches 01 \r\n"); for(delay=0;delay<limit;delay++){}; // delay cycle break; case 0x02: xil_printf("switches 02 \r\n"); for(delay=0;delay<limit;delay++){}; // delay cycle break; case 0x03: xil_printf("switches 03 \r\n"); for(delay=0;delay<limit;delay++){}; // delay cycle break; default : {} } //clear interrupt both in gpio instance interrupt controller xgpio_interruptclear(&sw, 0x3); xintc_acknowledge(&myintc,xpar_axi_intc_0_sw_ip2intc_irpt_intr); } int main(void) { xil_printf("setting peripherals...\r\n"); for(delay=0;delay<limit;delay++){}; // delay cycle xil_printf("setting force buttons...\r\n"); for(delay=0;delay<limit;delay++){}; // delay cycle xgpio_initialize(&pushbt, xpar_push_device_id); xgpio_setdatadirection(&pushbt,1,1); //set pb input port xgpio_interruptenable(&pushbt, xpar_push_ip2intc_irpt_mask); xgpio_interruptglobalenable(&pushbt); xil_printf("setting switches...\r\n"); for(delay=0;delay<limit;delay++){}; // delay cycle xgpio_initialize(&sw, xpar_sw_device_id); xgpio_setdatadirection(&sw,1,1); //set sw input port xgpio_interruptenable(&sw, xpar_sw_ip2intc_irpt_mask); xgpio_interruptglobalenable(&sw); xil_printf("setting interrupt controller...\r\n"); for(delay=0;delay<limit;delay++){}; // delay cycle xintc_initialize(&myintc, xpar_intc_0_device_id); xil_printf("register interrupt...\r\n"); for(delay=0;delay<limit;delay++){}; // delay cycle xintc_connect(&myintc, xpar_axi_intc_0_push_ip2intc_irpt_intr, (xinterrupthandler)pb_int_handler, &pushbt); xintc_connect(&myintc, xpar_axi_intc_0_sw_ip2intc_irpt_intr, (xinterrupthandler)sw_int_handler, &sw); xil_printf("enable individual interrupt...\r\n"); for(delay=0;delay<limit;delay++){}; // delay cycle xintc_enableintr(&myintc,xpar_push_ip2intc_irpt_mask | xpar_sw_ip2intc_irpt_mask); xil_printf("start interrupt controller...\r\n"); for(delay=0;delay<limit;delay++){}; // delay cycle xintc_start(&myintc, xin_real_mode); xintc_masterenable(&myintc); microblaze_enable_interrupts(); xil_printf("setting exceptions...\r\n"); for(delay=0;delay<limit;delay++){}; // delay cycle xil_exceptioninit(); xil_exceptionregisterhandler(xil_exception_id_m_axi_i_exception, (xexceptionhandler)xintc_interrupthandler, &myintc); xil_exceptionenable(); while(1) { xil_printf("entering loop...\r\n"); for(delay=0;delay<limit;delay++){}; // delay cycle } }
any help explaining right interrupt code sequence? setup handlers. initialize interrupt controller. connect handlers. enabled interrupt masks. enable master. start controller.
so forget? or what's wrong? thanks
found solution: changing these lines
xgpio_interruptenable(&pushbt, xpar_push_ip2intc_irpt_mask);
to
xgpio_interruptenable(&pushbt, 0xff);
and
xgpio_interruptenable(&sw, xpar_sw_ip2intc_irpt_mask);
to
xgpio_interruptenable(&sw, 0xff);
so code works investigate why :) it's interrupt mask problem
c interrupt microblaze
Comments
Post a Comment