这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取手持数字示波器】GD32VF103内核(Bumblebee)中断机制

共1条 1/1 1 跳转至

【换取手持数字示波器】GD32VF103内核(Bumblebee)中断机制

工程师
2024-12-27 12:50:52     打赏

简介:

      GD32VF103 的中断管理支持ECLIC(Enhanced Core Local Interrupt Controller)和默认中断模式。ECLIC 中断按照中断类型可以分为内部中断和外部中断,内核的计时器中断和软中断被划分到内部中断,其他的外设中断类如UART/GPIO等的中断被划分到外部中断。

image.png

当触发中断时,ECLIC 从mtvt 中存储的中断向量表中获取异常、中断函数的地址信息,并跳转到其中运行。

image.png

 image.png

   根据上述的描述信息我们去查看启动代码发现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	

对应寄存器说明如下

image.png


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]