Tengo un equipo LPC1114. Los últimos días he estado investigando la implementación de CMSIS de Cortex M0 para encontrar cómo se hacen las cosas en él. Hasta ahora entendí cómo se mapean cada registro y cómo puedo acceder a él. Pero aún no sé cómo se implementan las interrupciones en él. Todo lo que sé acerca de las interrupciones en CMSIS es que hay algunos nombres de controladores de interrupciones mencionados en el archivo de inicio. Y puedo escribir mis propios manejadores simplemente escribiendo una función C con los mismos nombres mencionados en el archivo de inicio. Lo que me confunde es que en la guía del usuario se dice que todos los GPIO se pueden usar como fuentes de interrupción externas. Pero solo hay 4 interrupciones PIO mencionadas en el archivo de inicio. Así que dime:
La siguiente información se suma a la excelente respuesta de Igor.
Desde una perspectiva de programación C, los controladores de interrupción se definen en el archivo cr_startup_xxx.c (por ejemplo, el archivo cr_startup_lpc13.c para LPC1343). Todos los manejadores de interrupciones posibles se definen allí como un alias DÉBIL. Si no define su propio XXX_Handler() para una fuente de interrupción, se utilizará la función de controlador de interrupción predeterminada definida en este archivo. El enlazador decidirá qué función incluir en el binario final junto con la tabla de vectores de interrupción de cr_startup_xxx.c
En los archivos de demostración en gpio.c se muestran ejemplos de interrupciones GPIO desde los puertos. Hay una entrada de interrupción al NVIC por puerto GPIO. Cada bit individual en el puerto se puede habilitar/deshabilitar para generar una interrupción en ese puerto. Si necesita interrupciones en los puertos PIO1_4 y PIO1_5, por ejemplo, debe habilitar los bits de interrupción individuales PIO1_4 y PIO1_5 en GPIO0IE. Cuando se activa la función del controlador de interrupciones PIOINT0_Handler(), depende de usted determinar cuál de las interrupciones PIO1_4 o PIO1_5 (o ambas) está pendiente leyendo el registro GPIO0RIS y manejando la interrupción de manera adecuada.
(Tenga en cuenta que los puntos 1 y 2 son detalles de implementación y no limitaciones arquitectónicas).
Ya que está familiarizado con los PIC, eche un vistazo a esta Nota de aplicación: Migración de microcontroladores PIC a Cortex-M3
Se trata de M3, pero la mayoría de los puntos también se aplican a M0.
Las respuestas de Austin e Igor son lo suficientemente detalladas. Sin embargo, quiero responderla de otra manera, tal vez te resulte útil.
El LPC11xx (Cortex-M0) tiene 4 niveles para pines GPIO, todos los pines de GPIO0.0 a GPIO0.n comparten el mismo número de interrupción y todos los pines de GPIO3.0 a GPIO3.m comparten el mismo número de interrupción.
Hay seis pasos para inicializar la interrupción GPIO en LPC11xx
Implementaciones de código. Necesita dos funciones: una inicializa los 6 pasos anteriores y la segunda es el controlador de interrupciones, que debe tener el mismo nombre que el controlador definido en los códigos de inicio, startup_LPC11xx.s
archivo. Los nombres son de PIOINT0_IRQHandler
a PIOINT3_IRQHandler
. Si usa un nombre diferente, debe cambiar los nombres en el archivo de inicio.
/*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
}