我正在尝试在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,它涵盖了核心的硬件而不是如何编程。
启用和连接中断的正确方法是什么?
答案 0 :(得分:0)
#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) {
}
}