这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 从引导程序说,GD32VF103系列ECLIC

共5条 1/1 1 跳转至

从引导程序说,GD32VF103系列ECLIC

院士
2019-12-01 11:34:27     打赏

    与熟知的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文件。




关键词: GD32VF103     ECLIC     中断     引导    

高工
2019-12-01 11:43:55     打赏
2楼

高产啊


院士
2019-12-01 22:40:27     打赏
3楼

这个破东西,中断处理还不自己保护现场。



助工
2019-12-02 08:59:27     打赏
4楼

周日开始搞啊


工程师
2019-12-05 21:05:17     打赏
5楼

想知道楼主主要做哪一方面的东西


共5条 1/1 1 跳转至

回复

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