与熟知的Cortex-M系列的启动文件大不相同,GD32VF103系列有很大差异,其引导程序位于
..\GD32VF103_Firmware_Library\RISCV\env_Eclipse\start.S文件中。(篇幅原因有删节)
// See LICENSE for license details. #include "riscv_encoding.h" .section .init .weak xxxxx_handler vector_base: j _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 USBFS_WKUP_IRQHandler .word 0 .word 0 .word 0 .word 0 .word 0 .word EXMC_IRQHandler .word 0 .word TIMER4_IRQHandler .word 0 .word 0 .word CAN1_TX_IRQHandler .word CAN1_RX0_IRQHandler .word CAN1_RX1_IRQHandler .word CAN1_EWMC_IRQHandler .word USBFS_IRQHandler .globl _start .type _start,@function _start: csrc CSR_MSTATUS, MSTATUS_MIE /* Jump to logical address first to ensure correct operation of RAM region */ la a0, _start li a1, 1 slli a1, a1, 29 bleu a1, a0, _start0800 srli a1, a1, 2 bleu a1, a0, _start0800 la a0, _start0800 add a0, a0, a1 jr a0 _start0800: /* Set the the NMI base to share with mtvec by setting CSR_MMISC_CTL */ li t0, 0x200 csrs CSR_MMISC_CTL, t0 /* Intial the mtvt*/ la t0, vector_base csrw CSR_MTVT, t0 /* Intial the mtvt2 and enable it*/ la t0, irq_entry csrw CSR_MTVT2, t0 csrs CSR_MTVT2, 0x1 /* Intial the CSR MTVEC for the Trap ane NMI base addr*/ la t0, trap_entry csrw CSR_MTVEC, t0 #ifdef __riscv_flen /* Enable FPU */ li t0, MSTATUS_FS csrs mstatus, t0 csrw fcsr, x0 #endif .option push .option norelax la gp, __global_pointer$ .option pop la sp, _sp /* Load data section */ la a0, _data_lma la a1, _data la a2, _edata bgeu a1, a2, 2f 1: lw t0, (a0) sw t0, (a1) addi a0, a0, 4 addi a1, a1, 4 bltu a1, a2, 1b 2: /* Clear bss section */ la a0, __bss_start la a1, _end bgeu a0, a1, 2f 1: sw zero, (a0) addi a0, a0, 4 bltu a0, a1, 1b 2: /*enable mcycle_minstret*/ csrci CSR_MCOUNTINHIBIT, 0x5 /* Call global constructors */ la a0, __libc_fini_array call atexit call __libc_init_array /* argc = argv = 0 */ li a0, 0 li a1, 0 call main tail exit 1: j 1b .global disable_mcycle_minstret disable_mcycle_minstret: csrsi CSR_MCOUNTINHIBIT, 0x5 ret .global enable_mcycle_minstret enable_mcycle_minstret: csrci CSR_MCOUNTINHIBIT, 0x5 ret
start.S文件在Line:2引用了C语言的头文件,因此,此文件的编译器要选择gcc了,汇编怕是处理不了这个.h的头文件。
阅读手册可知flash的起始地址为0x8000000,在Line:3中的.init也就存放于0x8000000了,此工作在GD32VF103x8.lds文件中实现。
GD32VF103系列MCU引入全新的中断向量表控制ECLIC,在Line:7跳转到了label:_start处。GD32VF103的中断控制器具有两种模式:默认模式和ECLIC模式。在ECLIC模式下,异常,NMI由mtvec[31:6]指定的处理函数进行处理,中断由mtvt2寄存器指定的处理函数进行处理,并由mtvt寄存器指定中断向量表地址。
RISC-V处理器的中断系统不同于NVIC的中断系统,RISC-V的中断系统分为NMI,异常,外部中断三个概念。因此也分由不同的向量寄存器设置入口地址。由于RISC-V的中断和异常都不进行自动现场保护,所以需要软件手动进行现场保护处理,因此无法直接使用C函数响应中断,需要一个基于汇编的入口函数进行处理,在汇编入口函数中再对C函数进行调用,具体的代码可以参考官方的entry.S文件。