微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 求助EDK中断的问题

求助EDK中断的问题

时间:10-02 整理:3721RD 点击:

环境:ISE14.7
我的程序很简单:一个开发板上用的程序,使用定时器中断,中断时count加1,并且通过GPIO输出。
但是输出没有动作,我屏蔽掉定时中断,GPIO循环输出是好的。
运行的过程中,每次中断都会停在这里:
void __interrupt_handler(void)
{
    MB_InterruptVectorTable.Handler(MB_InterruptVectorTable.CallBackRef);
}
请问可能是什么原因,怎么查,我刚接触EDK,请多指教!谢谢
以下是全部代码
#include "xparameters.h"
#include "xgpio.h"
#include "xintc.h"
#include "xtmrctr.h"
#include "mb_interface.h"
unsigned int count = 0;
XGpio GpioOutput;

void timer_int_handler(void * baseaddr_p)
{
    unsigned int csr;
    csr = XTmrCtr_GetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0);
    if(csr &XTC_CSR_INT_OCCURED_MASK)
    {
        count ++;
    }
    XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0, csr);
}
int main()
{
    unsigned int cnt = 0;
    XIntc_RegisterHandler(XPAR_INTC_0_BASEADDR,
                          XPAR_AXI_INTC_0_AXI_TIMER_0_INTERRUPT_INTR,
                          (XInterruptHandler) timer_int_handler,
                          (void *)XPAR_AXI_TIMER_0_BASEADDR);
    microblaze_enable_interrupts();
    XIntc_MasterEnable(XPAR_INTC_0_BASEADDR);
    XIntc_EnableIntr(XPAR_INTC_0_BASEADDR, XPAR_AXI_TIMER_0_INTERRUPT_MASK);
    XTmrCtr_SetLoadReg(XPAR_AXI_TIMER_0_BASEADDR, 0, 5000);
    XTmrCtr_EnableIntr(XPAR_AXI_TIMER_0_BASEADDR, 0);
    XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0, XTC_CSR_ENABLE_TMR_MASK |
                                                         XTC_CSR_ENABLE_INT_MASK |
                                                         XTC_CSR_AUTO_RELOAD_MASK |
                                                         XTC_CSR_DOWN_COUNT_MASK);
    XGpio_Initialize(&GpioOutput, XPAR_LEDS_DEVICE_ID);
    XGpio_SetDataDirection(&GpioOutput, 1, 0x0);
    while(1)
    {
        XGpio_DiscreteWrite(&GpioOutput,1,count);
    }
    return 0;
}

就没有遇到过这类问题的吗?


加一句void 中断函数名( void ) __attribute__ ((interrupt_handler)); 可以试试,感觉是没有关联上

自己找到原因了,应该是配置的顺序有问题,改成下面的就好了
    XIntc_RegisterHandler(XPAR_INTC_0_BASEADDR,XPAR_AXI_INTC_0_AXI_TIMER_0_INTERRUPT_INTR,               (XInterruptHandler) timer_int_handler,
                          (void *)XPAR_AXI_TIMER_0_BASEADDR);
    XIntc_MasterEnable(XPAR_INTC_0_BASEADDR);
    XTmrCtr_SetLoadReg(XPAR_AXI_TIMER_0_BASEADDR, 0, 10000);//0.1ms
    XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0, XTC_CSR_ENABLE_TMR_MASK |
                                                             XTC_CSR_ENABLE_INT_MASK |
                                                             XTC_CSR_AUTO_RELOAD_MASK |
                                                             XTC_CSR_DOWN_COUNT_MASK);
    XIntc_EnableIntr(XPAR_INTC_0_BASEADDR, XPAR_AXI_TIMER_0_INTERRUPT_MASK);
    XTmrCtr_EnableIntr(XPAR_AXI_TIMER_0_BASEADDR, 0);
    microblaze_enable_interrupts();

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top