1

ARM Cortex-M3 是否有一个简单的 GPIO 中断示例?

我写了一些代码,但是不知何故中断似乎没有触发:

#include "LPC17xx.h"
#include "lpc17xx_pinsel.h"
#include "lpc17xx_gpio.h"

void EINT3_IRQHandler(void) {
    NVIC_ClearPendingIRQ(EINT3_IRQn);
    puts("triggered");  // fired
}

int main() {
    /** ... **/
    /** ... **/

    // listen for input on INPUT pin @ GPIO port 1, pin 31
    PINSEL_CFG_Type PinCfg;
    PinCfg.Funcnum = 0;
    PinCfg.OpenDrain = 0;
    PinCfg.Pinmode = 0;
    PinCfg.Portnum = 1;
    PinCfg.Pinnum = 31;
    PINSEL_ConfigPin(&PinCfg);

    GPIO_SetDir(port, 1 << pin, 0);

    NVIC_EnableIRQ(EINT3_IRQn);

    while(1);       // wait

    /** ... **/
    /** ... **/

    return 0;
}

我一直在在线/GitHub 上搜索 LPC1769 Cortex M3 的简单 GPIO 中断示例,但没有产生任何结果。然而,似乎:

  1. 感兴趣的 GPIO 中断是EINT_3.
  2. 当在用户代码中定义时,IRQ 处理程序EINT3_IRQHandler会被覆盖。

怎么了?

4

2 回答 2

2

在 LPC17xx 上,您有端口 0 和 2 的中断启用寄存器,请参阅 UM10360.pdf 第 9.5.6 章以供参考。您在端口 1、3 和 4 上没有 GPIO 中断 - 您的代码似乎使用端口 1.31,它不能有 GPIO 中断。

在异常处理程序中,您不能忘记清除 和 中的中断IO0IntClear标志IO2IntClear。否则,即使使用NVIC_ClearPendingIRQ().

处理程序函数的“正确”名称可能取决于您的工具链。

于 2014-03-22T11:00:59.887 回答
-1

当在用户代码中定义时,IRQ 处理程序 EINT3_IRQHandler 会被覆盖。

我不知道那个特定的设备,但我想你需要从特权模式调用这些指令。我的猜测是,如果从用户模式调用这些指令不会做任何事情。

于 2014-03-17T07:34:42.183 回答