为LPC1769 Cortex M3编写GPIO中断处理程序

时间:2014-03-17 06:55:44

标签: c embedded cortex-m3 lpc

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在用户代码中定义时会被覆盖。
  3. 有什么问题?

2 个答案:

答案 0 :(得分:2)

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

在异常处理程序中 你不能忘记清除IO0IntClearIO2IntClear中的intterupt标志。否则,即使使用NVIC_ClearPendingIRQ()

,也会重新触发处理函数

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

答案 1 :(得分:-1)

  

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

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