[RISC-V MCU 应用开发] RISC-V MCU启动文件分析

[复制链接]
 楼主| 小灵通2018 发表于 2022-7-19 22:39 | 显示全部楼层 |阅读模式
启动文件由汇编语言编写,是MCU上电复位后第一个执行的程序。主要执行以下内容:
初始化gp(global pointer)全局指针寄存器、sp(stack pointer)栈指针寄存器
将data数据从flash中加载至RAM中
清空bss段数据
初始化中断向量表
配置系统时钟
从Machine模式切换到User模式,进入main函数运行
CH32V103启动文件如下:
  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name          : startup_ch32v10x.s
  3. * Author             : WCH
  4. * Version            : V1.0.0
  5. * Date               : 2020/04/30
  6. * Description        : CH32V10x vector table for eclipse toolchain.
  7. *******************************************************************************/

  8.         .section        .init,"ax",@progbits     /* 声明section 为 .init */
  9.         .global        _start                       /* 指明标签_start的属性为全局性的 */
  10.         .align        1
  11. _start:                                  /* 标签_start处 */
  12.         j        handle_reset                     /* 跳转至 handle_reset处 */
  13.         .word 0x00000013                     /* 内核设计需要,不用关注 */
  14.         .word 0x00000013
  15.         .word 0x00000013
  16.         .word 0x00000013
  17.         .word 0x00000013
  18.         .word 0x00000013
  19.         .word 0x00000013
  20.         .word 0x00000013
  21.         .word 0x00000013
  22.         .word 0x00000013
  23.         .word 0x00000013
  24.         .word 0x00000013
  25.         .word 0x00100073
  26.     .section    .vector,"ax",@progbits
  27.     .align  1
  28. _vector_base:                           /* 中断向量表  */
  29.     .option norvc;
  30.         j   _start
  31.     .word   0
  32.         j   NMI_Handler                 /* NMI Handler */
  33.         j   HardFault_Handler           /* Hard Fault Handler */
  34.     .word   0
  35.     .word   0
  36.     .word   0
  37.     .word   0
  38.     .word   0
  39.     .word   0
  40.     .word   0
  41.     .word   0
  42.         j   SysTick_Handler            /* SysTick Handler */
  43.     .word   0
  44.         j   SW_handler                 /* SW Handler */
  45.     .word   0
  46.     /* External Interrupts */
  47.         j   WWDG_IRQHandler            /* Window Watchdog */
  48.         j   PVD_IRQHandler             /* PVD through EXTI Line detect */
  49.         j   TAMPER_IRQHandler          /* TAMPER */
  50.         j   RTC_IRQHandler             /* RTC */
  51.         j   FLASH_IRQHandler           /* Flash */
  52.         j   RCC_IRQHandler             /* RCC */
  53.         j   EXTI0_IRQHandler           /* EXTI Line 0 */
  54.         j   EXTI1_IRQHandler           /* EXTI Line 1 */
  55.         j   EXTI2_IRQHandler           /* EXTI Line 2 */
  56.         j   EXTI3_IRQHandler           /* EXTI Line 3 */
  57.         j   EXTI4_IRQHandler           /* EXTI Line 4 */
  58.         j   DMA1_Channel1_IRQHandler   /* DMA1 Channel 1 */
  59.         j   DMA1_Channel2_IRQHandler   /* DMA1 Channel 2 */
  60.         j   DMA1_Channel3_IRQHandler   /* DMA1 Channel 3 */
  61.         j   DMA1_Channel4_IRQHandler   /* DMA1 Channel 4 */
  62.         j   DMA1_Channel5_IRQHandler   /* DMA1 Channel 5 */
  63.         j   DMA1_Channel6_IRQHandler   /* DMA1 Channel 6 */
  64.         j   DMA1_Channel7_IRQHandler   /* DMA1 Channel 7 */
  65.         j   ADC1_2_IRQHandler          /* ADC1_2 */
  66.         .word   0
  67.         .word   0
  68.         .word   0
  69.         .word   0
  70.         j   EXTI9_5_IRQHandler         /* EXTI Line 9..5 */
  71.         j   TIM1_BRK_IRQHandler        /* TIM1 Break */
  72.         j   TIM1_UP_IRQHandler         /* TIM1 Update */
  73.         j   TIM1_TRG_COM_IRQHandler    /* TIM1 Trigger and Commutation */
  74.         j   TIM1_CC_IRQHandler         /* TIM1 Capture Compare */
  75.         j   TIM2_IRQHandler            /* TIM2 */
  76.         j   TIM3_IRQHandler            /* TIM3 */
  77.         j   TIM4_IRQHandler            /* TIM4 */
  78.         j   I2C1_EV_IRQHandler         /* I2C1 Event */
  79.         j   I2C1_ER_IRQHandler         /* I2C1 Error */
  80.         j   I2C2_EV_IRQHandler         /* I2C2 Event */
  81.         j   I2C2_ER_IRQHandler         /* I2C2 Error */
  82.         j   SPI1_IRQHandler            /* SPI1 */
  83.         j   SPI2_IRQHandler            /* SPI2 */
  84.         j   USART1_IRQHandler          /* USART1 */
  85.         j   USART2_IRQHandler          /* USART2 */
  86.         j   USART3_IRQHandler          /* USART3 */
  87.         j   EXTI15_10_IRQHandler       /* EXTI Line 15..10 */
  88.         j   RTCAlarm_IRQHandler        /* RTC Alarm through EXTI Line */
  89.         j   USBWakeUp_IRQHandler       /* USB Wakeup from suspend */
  90.         j   USBHD_IRQHandler           /* USBHD */

  91.     .option rvc;

  92.     .section    .text.  , "ax", @progbits     /* 中断服务程序弱定义  */
  93.     .weak   NMI_Handler
  94.     .weak   HardFault_Handler
  95.     .weak   SysTick_Handler
  96.     .weak   SW_handler
  97.     .weak   WWDG_IRQHandler
  98.     .weak   PVD_IRQHandler
  99.     .weak   TAMPER_IRQHandler
  100.     .weak   RTC_IRQHandler
  101.     .weak   FLASH_IRQHandler
  102.     .weak   RCC_IRQHandler
  103.     .weak   EXTI0_IRQHandler
  104.     .weak   EXTI1_IRQHandler
  105.     .weak   EXTI2_IRQHandler
  106.     .weak   EXTI3_IRQHandler
  107.     .weak   EXTI4_IRQHandler
  108.     .weak   DMA1_Channel1_IRQHandler
  109.     .weak   DMA1_Channel2_IRQHandler
  110.     .weak   DMA1_Channel3_IRQHandler
  111.     .weak   DMA1_Channel4_IRQHandler
  112.     .weak   DMA1_Channel5_IRQHandler
  113.     .weak   DMA1_Channel6_IRQHandler
  114.     .weak   DMA1_Channel7_IRQHandler
  115.     .weak   ADC1_2_IRQHandler
  116.     .weak   EXTI9_5_IRQHandler
  117.     .weak   TIM1_BRK_IRQHandler
  118.     .weak   TIM1_UP_IRQHandler
  119.     .weak   TIM1_TRG_COM_IRQHandler
  120.     .weak   TIM1_CC_IRQHandler
  121.     .weak   TIM2_IRQHandler
  122.     .weak   TIM3_IRQHandler
  123.     .weak   TIM4_IRQHandler
  124.     .weak   I2C1_EV_IRQHandler
  125.     .weak   I2C1_ER_IRQHandler
  126.     .weak   I2C2_EV_IRQHandler
  127.     .weak   I2C2_ER_IRQHandler
  128.     .weak   SPI1_IRQHandler
  129.     .weak   SPI2_IRQHandler
  130.     .weak   USART1_IRQHandler
  131.     .weak   USART2_IRQHandler
  132.     .weak   USART3_IRQHandler
  133.     .weak   EXTI15_10_IRQHandler
  134.     .weak   RTCAlarm_IRQHandler
  135.     .weak   USBWakeUp_IRQHandler
  136.     .weak   USBHD_IRQHandler

  137.         .section        .text.handle_reset,"ax",@progbits
  138.         .weak        handle_reset
  139.         .align        1
  140. handle_reset:                     /*  handle_reset起始位置 */
  141. .option push
  142. .option        norelax
  143.         la gp, __global_pointer$       /* 将ld文件中的标签__global_pointer所处的地址值赋给gp寄存器 */
  144. .option        pop
  145. 1:
  146.         la sp, _eusrstack              /* 将ld文件中的标签_eusrstack所处的地址值赋给sp寄存器 */
  147. 2:
  148.         /* Load data section from flash to RAM */
  149.         la a0, _data_lma
  150.         la a1, _data_vma
  151.         la a2, _edata
  152.         bgeu a1, a2, 2f
  153. 1:
  154.         lw t0, (a0)
  155.         sw t0, (a1)
  156.         addi a0, a0, 4
  157.         addi a1, a1, 4
  158.         bltu a1, a2, 1b
  159. 2:
  160.         /* clear bss section */
  161.         la a0, _sbss
  162.         la a1, _ebss
  163.         bgeu a0, a1, 2f
  164. 1:
  165.         sw zero, (a0)
  166.         addi a0, a0, 4
  167.         bltu a0, a1, 1b
  168. 2:
  169.         /* enable all interrupt */  /* csrs ,根据寄存器中每个为1的位,把CSR寄存器对应位置位 */
  170.   li t0, 0x88
  171.   csrs mstatus, t0         /* 状态寄存器mstatus赋值为0x88,打开所有中断,设置MPP值为00 */
  172.         la t0, _vector_base
  173.   ori t0, t0, 1
  174.         csrw mtvec, t0         /* 将中断向量表的首地址赋值给mtvec寄存器(中断发生时PC的地址) */

  175.   jal  SystemInit          /* 设置MCU系统时钟 */
  176.         la t0, main
  177.         csrw mepc, t0  
  178.         mret

  179. /*
  180. mret返回指令(M模式特有的指令),调用该指令会进行如下操作:

  181. - 将PC指针设置为mepc的值
  182. - 将mstatus的MPIE域复制到MIE来恢复之前的中断使能
  183. - 将权限模式设置为mstatus的MPP域中的值。

  184. 芯片上电默认进入的是机器模式,通过将mstatus中的MPP值设置为00(00: User, 01: Supervisor, 11: Machine),
  185. 并将main函数的地址赋值给mepc,调用mret,使得用户在进入main函数运行时,芯片由机器模式切换为用户模式。
  186. */


吾要单片机 发表于 2022-7-20 00:00 | 显示全部楼层
难得的营养贴,谢谢楼主
麻花油条 发表于 2022-8-5 16:47 来自手机 | 显示全部楼层
好贴,点赞关注一下
豌豆爹 发表于 2022-8-12 16:01 来自手机 | 显示全部楼层
营养贴,哈哈,支持一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

157

主题

1727

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部