1

我试图在 MicroBlaze MCS 内核中获得一个固定计时器来调用一个函数来切换一些 LED 作为概念证明。

这是我现在拥有的代码

#include <xparameters.h>
#include <xiomodule.h>
#include <xiomodule_l.h>

XIOModule gpo1;
volatile u32 ct = 0;

void timerTick(void* ref){
    ct++;
    XIOModule_DiscreteWrite(&gpo1, 1, ct);
    XIOModule_DiscreteWrite(&gpo1, 2, ct);
}

int main() {

    XIOModule_Initialize(&gpo1, XPAR_IOMODULE_0_DEVICE_ID);
    XIOModule_Start(&gpo1);

    XIOModule_EnableIntr(XPAR_IOMODULE_0_BASEADDR, XIN_IOMODULE_FIT_1_INTERRUPT_INTR);
    XIOModule_Connect(&gpo1, XIN_IOMODULE_FIT_1_INTERRUPT_INTR, timerTick, NULL);

    while (1) {
    }
}

GPO 的东西有效。如果我把它放在 while 循环中,我可以让 LED 按预期切换。然而,就目前的代码而言,timerTick() 永远不会被调用。我对如何正确设置中断感到非常困惑,而且我找不到任何关于此的文档。我能找到的最好的是http://www.xilinx.com/support/documentation/sw_manuals/xilinx14_4/pg048-microblaze-mcs.pdf,它涵盖了更多关于内核硬件的信息,而不是如何对其进行编程。

启用和连接中断的正确方法是什么?

4

1 回答 1

0

由于这个论坛帖子http://forums.xilinx.com/t5/Embedded-Development-Tools/Can-not-fire-MicroBlaze-MCS-interrupt/td-p/256372 ,我找到了解决方案

#include <xparameters.h>
#include <xiomodule.h>
#include <xiomodule_l.h>

XIOModule gpo1;
volatile u32 ct = 0;

void timerTick(void* ref) {
    ct++;
    XIOModule_DiscreteWrite(&gpo1, 1, ct);
    XIOModule_DiscreteWrite(&gpo1, 2, ct);
}

int main() {

    XIOModule_Initialize(&gpo1, XPAR_IOMODULE_0_DEVICE_ID);

    microblaze_register_handler(XIOModule_DeviceInterruptHandler, XPAR_IOMODULE_0_DEVICE_ID);

    XIOModule_Start(&gpo1);

    XIOModule_Connect(&gpo1, XIN_IOMODULE_FIT_1_INTERRUPT_INTR, timerTick, NULL);
    XIOModule_Enable(&gpo1,XIN_IOMODULE_FIT_1_INTERRUPT_INTR);

    microblaze_enable_interrupts();
    while (1) {
    }
}
于 2013-10-17T00:47:56.623 回答