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中断示例,但它没有产生任何结果。然而,似乎:
EINT_3
。EINT3_IRQHandler
在用户代码中定义时会被覆盖。有什么问题?
答案 0 :(得分:2)
在LPC17xx上,您有端口0和2的中断使能寄存器,请参见UM10360.pdf第9.5.6章以供参考。端口1,3和4上没有GPIO中断 - 您的代码似乎使用端口1.31,它不能有GPIO中断。
在异常处理程序中
你不能忘记清除IO0IntClear
和IO2IntClear
中的intterupt标志。否则,即使使用NVIC_ClearPendingIRQ()
。
处理程序功能的“正确”名称可能取决于您的工具链。
答案 1 :(得分:-1)
在用户代码中定义时,IRQ处理程序EINT3_IRQHandler会被覆盖。
我不知道那个特定的设备,但我想你需要从特权模式调用这些指令。我的猜测是,如果从用户模式调用,这些指令不会执行任何操作。