奥斯丁和伊戈尔的答案足够详细。但是,我想用另一种方式回答它,也许您发现它有所帮助。
LPC11xx(Cortex-M0)的GPIO引脚有4个电平,从GPIO0.0到GPIO0.n的所有引脚共享相同的中断号,从GPIO3.0到GPIO3.m的所有引脚共享相同的中断号。
在LPC11xx中初始化GPIO中断有六个步骤
- 通过修改引脚连接块寄存器来设置引脚功能。
- 通过修改GPIO数据方向寄存器设置引脚方向(输入默认值)。
- 为每个单独的引脚设置中断,您必须转到GPIO中断屏蔽寄存器GPIOnIE并将该位(对应于该引脚)设置为1。
- 通过修改GPIO中断检测寄存器GPIOnIBE和GPIOnIS,将中断设置为上升沿或下降沿,或同时设置为上升沿和下降沿。
- 使用CMSIS功能在嵌套向量中断控制中启用PIO_0 / PIO_1 / PIO_2 / PIO_3的中断源。
- 通过使用CMSIS功能设置中断优先级。
代码实现。您需要两个函数:一个函数在上述步骤中初始化6个,第二个函数是中断处理程序,该函数必须与启动代码startup_LPC11xx.s
file中定义的处理程序同名。名称是从PIOINT0_IRQHandler
到PIOINT3_IRQHandler
。如果使用其他名称,则必须在启动文件中更改名称。
/*Init the GPIO pin for interrupt control */
void GPIO_Init(){
LPC_IOCON-> =.. //Pin configuration register
LPC_GPIO1->FIODIR = ... //GPIO Data direction register
LPC_GPIO1->FIOMASK = .. //GPIO Data mask register - choose the right pin
LPC_GPIO1->GPIOnIE = .. //Set up falling or rising edge
NVIC_EnableIRQ(PIO_1); //Call API to enable interrupt in NVIC
NVIC_SetPriority(PriorityN); //Set priority if needed
}
/*Must have the same name as listed in start-up file startup_LPC11xx.s */
void PIOINT1_IRQHandler(void){
//Do something here
}