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 に答える