简介:
GD32VF103 的中断管理支持ECLIC(Enhanced Core Local Interrupt Controller)和默认中断模式。ECLIC 中断按照中断类型可以分为内部中断和外部中断,内核的计时器中断和软中断被划分到内部中断,其他的外设中断类如UART/GPIO等的中断被划分到外部中断。
当触发中断时,ECLIC 从mtvt 中存储的中断向量表中获取异常、中断函数的地址信息,并跳转到其中运行。
根据上述的描述信息我们去查看启动代码发现GD32VF103对应的中断向量化表定义如下:
vector_base: //中断向量表 j _start //第一条指令即跳转到_start处开始执行 .align 2 .word 0 .word 0 .word eclic_msip_handler .word 0 .word 0 .word 0 .word eclic_mtip_handler .word 0 .word 0 .word 0 .word 0 .word 0 .word 0 .word 0 .word 0 .word 0 .word eclic_bwei_handler .word eclic_pmovi_handler .word WWDGT_IRQHandler .word LVD_IRQHandler .word TAMPER_IRQHandler .word RTC_IRQHandler .word FMC_IRQHandler .word RCU_IRQHandler .word EXTI0_IRQHandler .word EXTI1_IRQHandler .word EXTI2_IRQHandler .word EXTI3_IRQHandler .word EXTI4_IRQHandler .word DMA0_Channel0_IRQHandler .word DMA0_Channel1_IRQHandler .word DMA0_Channel2_IRQHandler .word DMA0_Channel3_IRQHandler .word DMA0_Channel4_IRQHandler .word DMA0_Channel5_IRQHandler .word DMA0_Channel6_IRQHandler .word ADC0_1_IRQHandler .word CAN0_TX_IRQHandler .word CAN0_RX0_IRQHandler .word CAN0_RX1_IRQHandler .word CAN0_EWMC_IRQHandler .word EXTI5_9_IRQHandler .word TIMER0_BRK_IRQHandler .word TIMER0_UP_IRQHandler .word TIMER0_TRG_CMT_IRQHandler .word TIMER0_Channel_IRQHandler .word TIMER1_IRQHandler .word TIMER2_IRQHandler .word TIMER3_IRQHandler .word I2C0_EV_IRQHandler .word I2C0_ER_IRQHandler .word I2C1_EV_IRQHandler .word I2C1_ER_IRQHandler .word SPI0_IRQHandler .word SPI1_IRQHandler .word USART0_IRQHandler .word USART1_IRQHandler .word USART2_IRQHandler .word EXTI10_15_IRQHandler .word RTC_Alarm_IRQHandler .word USBFS_WKUP_IRQHandler .word 0 .word 0 .word 0 .word 0 .word 0 .word EXMC_IRQHandler .word 0 .word TIMER4_IRQHandler .word SPI2_IRQHandler .word UART3_IRQHandler .word UART4_IRQHandler .word TIMER5_IRQHandler .word TIMER6_IRQHandler .word DMA1_Channel0_IRQHandler .word DMA1_Channel1_IRQHandler .word DMA1_Channel2_IRQHandler .word DMA1_Channel3_IRQHandler .word DMA1_Channel4_IRQHandler .word 0 .word 0 .word CAN1_TX_IRQHandler .word CAN1_RX0_IRQHandler .word CAN1_RX1_IRQHandler .word CAN1_EWMC_IRQHandler .word USBFS_IRQHandler
启动代码中的如下代码初始化将vector_base 写入mtvt 寄存器中
/* Intial the mtvt*/ la t0, vector_base //t0 = vector_base 向量表地址 csrw CSR_MTVT, t0 //mtvt = vector_base 中断向量表基地址
除了上述的mtvt 寄存器,GD32VF103 还提供了mtvt2 寄存器,该寄存器用来配置非向量中断共享入口,同时还设计了mtvec 寄存器用于配置异常响应的入口地址。
启动代码中对mtvt2 和 mtvec 配置分别如下:
/* Intial the mtvt2 and enable it*/ la t0, irq_entry //t0 = irq_entry irq_entry定义在entry.S,有freertos操作系统情况下定义在portasm.S csrw CSR_MTVT2, t0 //mtvt2 = irq_entry mtvt2[31:2]: 中断入口函数地址 csrs CSR_MTVT2, 0x1 //mtvt2 |= 0x1 mtvt2[0]: 1配置mtvt2的配置有效,配0则为mtvec内地址
/* Intial the CSR MTVEC for the Trap ane NMI base addr*/ la t0, trap_entry //t0 = trap_entry trap_entry定义在entry.S,有freertos操作系统情况下定义在portasm.S csrw CSR_MTVEC, t0 //mtvec = trap_entry mtvec[31:6]:异常入口地址 // mtvec[5:0]:0B00011 -- ECLIC中断模式 其他:默认模式 // 这里配置为默认模式 // trap_entry基本上可以理解为arm里的hard/mem/use/svc等fault了, // 这里在移植freertos时就使用了 ecall 进入trap_entry里 相当于arm里的PendSVC
对应寄存器说明如下