¿Cómo configurar la prioridad de interrupción?
La función para establecer la prioridad de interrupción ha sido escrita por CMISIS e integrada en el compilador. Por ejemplo, si usamos KEIL para desarrollar, la función para establecer la prioridad de interrupción se encuentra en el archivo core_cm0.h. La función es la siguiente:
/** \brief Establecer prioridad de interrupción
La función establece la prioridad de una interrupción.
\note La prioridad. no se puede configurar para cada interrupción central.
\param [in] IRQn Número de interrupción.
\param [in] prioridad Prioridad a configurar.
*/
__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t prioridad)
{
if(IRQn < 0) {
SCB->SHP [_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
(((prioridad << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT (IRQn)); }
else {
NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
(((prioridad << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); >}
Como se puede ver en la función anterior, esta función tiene dos parámetros, IRQn se refiere al vector de interrupción que se configurará y la prioridad es la prioridad de interrupción. La prioridad puede ser cuatro números: 0 1. 2 3. 0 tiene la prioridad más alta. 3 tiene la prioridad más baja.
Supongamos que desea establecer la prioridad más alta de la interrupción GPIO1, entonces es:
NVIC_SetPriority(EINT1_IRQn, 0);
En este momento, alguien preguntará: "EINT1_IRQn"
Respuesta: Esto se puede encontrar en el archivo LPC11xx.h, como se muestra a continuación:
/*
* ========== ===== ============================================== ===== =========
* ---------- Definición del número de interrupción --------------- --- ---------------
* ========================= === =================================================
*/
typedef enum IRQn
{
/****** Números de excepciones del procesador Cortex-M0 *** *** **********************************************/
Reset_IRQn = -15, /*!< 1 Restablecer vector, invocado al encender y restablecer en caliente */
NonMaskableInt_IRQn = -14, /*!< 2 Interrupción no enmascarable, no se puede ser detenido o reemplazado */
HardFault_IRQn = -13, /*!< 3 Fallo grave, todas las clases de fallo */
SVCall_IRQn = -5, /*!< 11 Sistema Llamada de servicio mediante instrucción SVC */
PendSV_IRQn = -2, /*!< 14 Solicitud pendiente de servicio del sistema */
SysTick_IRQn = -1, /*!< 15 Tick del sistema Temporizador */
/****** LPC11Cxx o LPC11xx Números de interrupción específicos *************************** * *************************/
WAKEUP0_IRQn = 0, /*!< Se pueden utilizar todos los pines de E/S como fuente de activación */
WAKEUP1_IRQn = 1, /*!< Hay 13 pines en total para LPC11xx */
WAKEUP2_IRQn = 2,
WAKEUP3_IRQn. = 3,
WAKEUP4_IRQn = 4,
WAKEUP5_IRQn = 5,
WAKEUP6_IRQn = 6,
WAKEUP7_IRQn = 7,
WAKEUP8_IRQn = 8,
WAKEUP9_IRQn = 9,
WAKEUP10_IRQn = 10,
WAKEUP
UP11_IRQn = 11,
WAKEUP12_IRQn = 12,
CAN_IRQn = 13, /*!< CAN Interrupción */
SSP1_IRQn = 14, /*!< SSP1 Interrupción */
I2C_IRQn = 15, /*!< Interrupción I2C */
TIMER_16_0_IRQn = 16, /*!< Interrupción Timer0 de 16 bits */
TIMER_16_1_IRQn = 17, /*!< Interrupción del temporizador 1 de 16 bits */
TIMER_32_0_IRQn = 18, /*!< Interrupción del temporizador 0 de 32 bits */
TIMER_32_1_IRQn = 19, / *!< Interrupción del temporizador 1 de 32 bits */
SSP0_IRQn = 20, /*!< Interrupción SSP0 */
UART_IRQn = 21, /*!< Interrupción UART */ p>
Reservado0_IRQn = 22, /*!< Interrupción reservada */
Reservado1_IRQn = 23,
ADC_IRQn = 24, /*!< Interrupción del convertidor A/D */
WDT_IRQn = 25, /*!< Interrupción del temporizador de vigilancia */
BOD_IRQn = 26, /*!< Interrupción de detección de apagón (BOD) */
FMC_IRQn = 27, /*!< Interrupción del controlador de memoria flash */
EINT3_IRQn = 28, /*!< Interrupción externa 3 Interrupción */
EINT2_IRQn = 29, /*! < Interrupción externa 2 Interrupción */
EINT1_IRQn = 30, /*!< Interrupción externa 1 Interrupción */
EINT0_IRQn = 31, /*!< Interrupción externa 0 Interrupción */
}IRQn_Type;