Відповіді Остіна та Ігоря досить детальні. Однак я хочу відповісти на це іншим способом, можливо, ви вважаєте це корисним.
LPC11xx (Cortex-M0) має 4 рівні для штифтів GPIO, усі штифти від GPIO0.0 до GPIO0.n мають однаковий номер переривання, і всі штифти від GPIO3.0 до GPIO3.m мають однаковий номер переривання.
Існує шість кроків для ініціалізації переривання GPIO у LPC11xx
- Налаштуйте контактну функцію, змінивши регістри блоків з'єднання контактів.
- Встановіть напрямок штифта, змінивши регістр напрямків даних GPIO (значення за замовчуванням - введення).
- Налаштуйте переривання для кожного окремого штифта, вам потрібно перейти до реєстру маски GPIO переривання GPIOnIE і встановити біт (що відповідає штифту) логіки 1.
- Встановіть переривання для висхідного або нижнього краю або обох, змінивши регістри почуттів переривання GPIO GPIOnIBE та GPIOnIS.
- Увімкніть джерело переривання або PIO_0 / PIO_1 / PIO_2 / PIO_3 у вкладеному векторіальному контролі переривання за допомогою функцій CMSIS.
- Встановіть пріоритет переривання за допомогою функцій CMSIS.
Реалізація коду. Вам потрібні дві функції: одна ініціалізує 6 вищезазначених кроків, а друга - обробник переривання, який повинен мати те саме ім'я, що і обробник, визначений у стартових кодах, startup_LPC11xx.s
файлу. Імена з 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
}