這篇 學習KEA之週期中斷定時器PIT 已經使用了定時中斷,本篇將歸納一下中斷系統的操作。
中斷向量表
KEA系列是Arm® Cortex®-M0+,最多有48箇中斷。
比如在SKEAZN642.h
中,定義了中斷向量表,數字越小的中斷,表明默認的中斷優先級是越高的:
typedef enum IRQn {
/* Core interrupts */
NonMaskableInt_IRQn = -14, /**< Non Maskable Interrupt */
HardFault_IRQn = -13, /**< Cortex-M0 SV Hard Fault Interrupt */
SVCall_IRQn = -5, /**< Cortex-M0 SV Call Interrupt */
PendSV_IRQn = -2, /**< Cortex-M0 Pend SV Interrupt */
SysTick_IRQn = -1, /**< Cortex-M0 System Tick Interrupt */
/* Device specific interrupts */
Reserved16_IRQn = 0, /**< Reserved interrupt 16 */
Reserved17_IRQn = 1, /**< Reserved interrupt 17 */
Reserved18_IRQn = 2, /**< Reserved interrupt 18 */
Reserved19_IRQn = 3, /**< Reserved interrupt 19 */
Reserved20_IRQn = 4, /**< Reserved interrupt 20 */
FTMRH_IRQn = 5, /**< FTMRH command complete and error interrupt */
LVD_LVW_IRQn = 6, /**< Low-voltage warning */
IRQ_IRQn = 7, /**< External interrupt */
I2C0_IRQn = 8, /**< I2C0 single interrupt vector for all sources */
Reserved25_IRQn = 9, /**< Reserved interrupt 25 */
SPI0_IRQn = 10, /**< SPI0 single interrupt vector for all sources */
SPI1_IRQn = 11, /**< SPI1 single interrupt vector for all sources */
UART0_IRQn = 12, /**< UART0 status and error */
UART1_IRQn = 13, /**< UART1 status and error */
UART2_IRQn = 14, /**< UART2 status and error */
ADC0_IRQn = 15, /**< ADC conversion complete interrupt */
ACMP0_IRQn = 16, /**< ACMP0 interrupt */
FTM0_IRQn = 17, /**< FTM0 single interrupt vector for all sources */
FTM1_IRQn = 18, /**< FTM1 single interrupt vector for all sources */
FTM2_IRQn = 19, /**< FTM2 single interrupt vector for all sources */
RTC_IRQn = 20, /**< RTC overflow */
ACMP1_IRQn = 21, /**< ACMP1 interrupt */
PIT_CH0_IRQn = 22, /**< PIT CH0 overflow */
PIT_CH1_IRQn = 23, /**< PIT CH1 overflow */
KBI0_IRQn = 24, /**< KBI0 interrupt */
KBI1_IRQn = 25, /**< KBI1 interrupt */
Reserved42_IRQn = 26, /**< Reserved interrupt 42 */
ICS_IRQn = 27, /**< Clock loss of lock */
WDOG_EWM_IRQn = 28, /**< Watchdog timeout */
Reserved45_IRQn = 29, /**< Reserved interrupt 45 */
Reserved46_IRQn = 30, /**< Reserved interrupt 46 */
Reserved47_IRQn = 31 /**< Reserved interrupt 47 */
} IRQn_Type;
中斷的使用步驟
- init_IRQs
// 這三個是在core_cm0plus.h中定義:
NVIC_ClearPendingIRQ(PIT_CH1_IRQn); /* Clear any Pending IRQ for all PIT ch1 (#23) */
NVIC_EnableIRQ(PIT_CH1_IRQn); /* Set Enable IRQ for PIT_CH1 */
NVIC_SetPriority(PIT_CH1_IRQn, 0); /* Set Priority for PIT_CH1 */
- 到相應的控制寄存器中開啓中斷
- 中斷服務程序
- 清除相應的中斷標誌位 (可選)
void PIT_CH1_IRQHandler (void)
{
PIT_TFLG1 |= PIT_TFLG_TIF_MASK; /* Clear PIT1 flag */
/* 應用程序 */
}
從上面可以看到,中斷服務程序的名稱的規則是一般是這樣:
- 先在中斷向量表中找到相應的中斷向量PIT_CH1_IRQn
- 然後提取前綴PIT_CH1
- 最後和IRQHandler結合,就是中斷服務程序的名稱 PIT_CH1_IRQHandler。
一些中斷服務程序的名稱的彙總:
- FTM2_IRQHandler
- PIT_CH1_IRQHandler
- KBI1_IRQHandler
- UART2_IRQHandle
- ADC_IRQHandler
OVER~~