奥斯汀和伊戈尔的答案足够详细。但是,我想以另一种方式回答它,也许您觉得它有帮助。
LPC11xx(Cortex-M0)的GPIO管脚有4级,从GPIO0.0到GPIO0.n的所有管脚共享相同的中断号,从GPIO3.0到GPIO3.m的所有管脚共享相同的中断号。
LPC11xx中初始化GPIO中断有六个步骤
- 通过修改 Pin Connection Block Registers 来设置 pin 功能。
- 通过修改 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
}