我是靠谱客的博主 勤恳鸡翅,这篇文章主要介绍GD32VF103 Bootstrap指南(一)GD32VF103 引导代码和中断原理分析,现在分享给大家,希望可以做个参考。

这里写自定义目录标题

  • GD32VF103 引导代码和中断原理分析
    • start.S的编译方法
    • 设置代码段名称
    • start.S的中断处理函数定义
    • GD32VF103的中断向量表

GD32VF103 引导代码和中断原理分析

作者:水银
Email:athieka@hotmail.com
龙眼Longan RV技术交流群: 816177882
转载请注明作者和出处

GD32VF103是兆易发布的全新RISC-V处理器,基于RV32IMAC指令集,由于采用了全新的CPU内核,GD32VF103的引导和中断向量表与基于ARM Cortex-M3 CPU的GD32F系列有很大差异。它的引导代码位于
start.S,本文对start.S中的引导代码进行分析解释。

start.S的编译方法

由于start.S中引入了riscv_encoding.h文件,这个文件中定义了GD32VF103的寄存器地址。由于riscv_encoding.h是个C语言头文件,因此无法用riscv-binutil中的riscv-none-embed-as汇编器进行编译,必须使用riscv-none-embed-gcc进行编译。

riscv-none-embed-gcc -c -x assembler-with-cpp -g -march=rv32imac -mabi=ilp32 -mcmodel=medlow start.S -o start.o

设置代码段名称

.section .init

本行指定段名称为.init,在GD32VF103xB.lds中会把.init段设置在flash的首位,在GD32VF103中位于地址0x08000000,这个地址是GD32VF103固件的入口地址。

start.S的中断处理函数定义


.weak
eclic_msip_handler
// #3:ECLIC的TIMER单元软中断
.weak
eclic_mtip_handler
// #7:ECLIC的TIMER单元的计时器中断
.weak
eclic_bwei_handler
// #17:存储器访问错误中断
.weak
eclic_pmovi_handler
// #18:根据手册预留,没有使用该中断
.weak
WWDGT_IRQHandler
// #19:看门狗中断
.weak
LVD_IRQHandler
// #20:连接到EXTI线的LVD中断
.weak
TAMPER_IRQHandler
// #21:侵入检测中断
.weak
RTC_IRQHandler
// #22:RTC全局中断
.weak
FMC_IRQHandler
// #23:FMC全局中断
.weak
RCU_IRQHandler
// #24:RCU全局中断
.weak
EXTI0_IRQHandler
// #25:EXTI线0中断
.weak
EXTI1_IRQHandler
// #26:EXTI线1中断
.weak
EXTI2_IRQHandler
// #27:EXTI线2中断
.weak
EXTI3_IRQHandler
// #28:EXTI线3中断
.weak
EXTI4_IRQHandler
// #29:EXTI线4中断
.weak
DMA0_Channel0_IRQHandler // #30:DMA0通道0全局中断
.weak
DMA0_Channel1_IRQHandler // #31:DMA0通道1全局中断
.weak
DMA0_Channel2_IRQHandler // #32:DMA0通道2全局中断
.weak
DMA0_Channel3_IRQHandler // #33:DMA0通道3全局中断
.weak
DMA0_Channel4_IRQHandler // #34: DMA0通道4全局中断
.weak
DMA0_Channel5_IRQHandler // #35: DMA0通道5全局中断
.weak
DMA0_Channel6_IRQHandler // #36: DMA0通道6全局中断
.weak
ADC0_1_IRQHandler
// #37: ADC0和ADC1全局中断
.weak
CAN0_TX_IRQHandler
// #38:CAN0发送中断
.weak
CAN0_RX0_IRQHandler
// #39:CAN0接收0中断
.weak
CAN0_RX1_IRQHandler
// #40:CAN0接收1中断
.weak
CAN0_EWMC_IRQHandler
// #41:CAN0 EWMC中断
.weak
EXTI5_9_IRQHandler
// #42:EXTI[9:5]中断
.weak
TIMER0_BRK_IRQHandler
// #43:TIMER0中止中断
.weak
TIMER0_UP_IRQHandler
// #44:TIMER0更新中断
.weak
TIMER0_TRG_CMT_IRQHandler
// #45:TIMER0触发和通道换相
.weak
TIMER0_Channel_IRQHandler
// #46:TIMER0通道捕获比较
.weak
TIMER1_IRQHandler
// #47:TIMER1全局中断
.weak
TIMER2_IRQHandler
// #48:TIMER2全局中断
.weak
TIMER3_IRQHandler
// #49:TIMER3全局中断
.weak
I2C0_EV_IRQHandler
// #50:I2C0事件中断
.weak
I2C0_ER_IRQHandler
// #51:I2C0错误中断
.weak
I2C1_EV_IRQHandler
// #52:I2C1事件中断
.weak
I2C1_ER_IRQHandler
// #53:I2C1错误中断
.weak
SPI0_IRQHandler
// #54:SPI0全局中断
.weak
SPI1_IRQHandler
// #55:SPI1全局中断
.weak
USART0_IRQHandler
// #56:USART0全局中断
.weak
USART1_IRQHandler
// #57:USART1全局中断
.weak
USART2_IRQHandler
// #58:USART2全局中断
.weak
EXTI10_15_IRQHandler
// #59:EXTI[15:10]中断
.weak
RTC_Alarm_IRQHandler
// #60:连接到EXTI线的RTC闹钟
.weak
USBFS_WKUP_IRQHandler
// #61:连接到EXTI线的USB唤醒
.weak
EXMC_IRQHandler
//
.weak
TIMER4_IRQHandler
// #69:TIMER4全局中断
.weak
SPI2_IRQHandler
// #70:SPI2全局中断
.weak
UART3_IRQHandler
// #71:UART3全局中断
.weak
UART4_IRQHandler
// #72:UART4全局中断
.weak
TIMER5_IRQHandler
// #73:TIMER5全局中断
.weak
TIMER6_IRQHandler
// #74:TIMER6全局中断
.weak
DMA1_Channel0_IRQHandler // #75:DMA1通道0全局中断
.weak
DMA1_Channel1_IRQHandler // #76:DMA1通道1全局中断
.weak
DMA1_Channel2_IRQHandler // #77:DMA1通道2全局中断
.weak
DMA1_Channel3_IRQHandler // #78:DMA1通道3全局中断
.weak
DMA1_Channel4_IRQHandler // #79:DMA1通道4全局中断
.weak
CAN1_TX_IRQHandler
// #80:CAN1发送全局中断
.weak
CAN1_RX0_IRQHandler
// #81:CAN1接收0中断
.weak
CAN1_RX1_IRQHandler
// #82:CAN1接收1中断
.weak
CAN1_EWMC_IRQHandler
// #83:CAN1 EWMC中断
.weak
USBFS_IRQHandler
// #84:USB FS全局中断

和STM32一样,中断处理函数使用弱引用定义,这样如果中断处理函数没有被实现也不会发生链接器错误。

GD32VF103的中断向量表

中断向量表vector_base被放置在.init段的首部,从flash地址0x08000000开始。和STM32不一样的地方在于,GD32VF103的中断向量表实际是由ECLIC控制器CSR寄存器中的mtvec、mtvt、mtvt2寄存器指定。

GD32VF103的中断控制器具有两种模式:默认模式ECLIC模式。模式的设置由mtvec[5:0]指定,当mtvec[5:0]==6’b000011时为ECLIC模式。处理函数入口由mtvec[31:6]指定(处理函数入口地址必须为64字节对齐)。

  1. 默认模式:所有中断,异常,NMI都由mtvec[31:6]指定的处理函数进行处理;
  2. ECLIC模式:异常,NMI由mtvec[31:6]指定的处理函数进行处理,中断由mtvt2寄存器指定的处理函数进行处理,并由mtvt寄存器指定中断向量表地址

GD32VF103 ECLIC的中断向量寄存器

寄存器全名说明
mtvecMachine Trap-Vector Base-Address Register用于配置中断和异常处理程序的入口地址。一般用于处理NMI和异常中断
mtvtECLIC Interrupt Vector Table Base Address用于保存ECLIC中断向量表的基地址,此基地址至少为64byte对齐。
mtvt2ECLIC non-vectored interrupt handler address register用于指定ECLIC非向量模式的中断common-code入口地址。

RISC-V处理器的中断系统和NVIC的中断系统不同,RISC-V的中断系统分为NMI,异常,外部中断三个概念。因此也分由不同的向量寄存器设置入口地址。由于risc-v的中断和异常都不进行自动现场保护,所以需要软件手动进行现场保护处理,因此无法直接使用C函数响应中断,需要一个基于汇编的入口函数进行处理,在汇编入口函数中再对C函数进行调用。

GD32VF103在ECLIC中断模式中,mtvec用于保存nmi和异常入口函数地址,不会进行自动的向量表调用。需要由入口函数进行转发处理。在官方代码中,响应函数为entry.S中的trap_entry函数。

mtvt2用于保存中断响应入口函数地址,处理函数位于entry.S中的irq_entry,函数mtvt保存向量表地址,mtvt2寄存器的irq_entry函数和mtvt寄存器中的向量表共同组成一个two-stage的中断向量表系统,irq_entry中对现场进行保护,并触发ECLIC调用中断向量表。

start.S中定义vector_base,vector_base的第一个字放置了一条跳转指令直接跳转到_start,程序从这里开始执行,和stm32不同的是,GD32VF103默认的中断向量表并不在vector_base,需要之后_start进行设置

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

最后

以上就是勤恳鸡翅最近收集整理的关于GD32VF103 Bootstrap指南(一)GD32VF103 引导代码和中断原理分析的全部内容,更多相关GD32VF103内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(108)

评论列表共有 0 条评论

立即
投稿
返回
顶部