[研电赛技术支持] GD32启动文件详解

[复制链接]
4572|46
 楼主| 结合国际经验 发表于 2021-11-30 11:13 | 显示全部楼层
  SystemInit()是一个标准的库函数,在 system_gd32f20x.c这个库文件总定义。主要作用是配置系统时钟,这里调用这个函数之后,单片机的系统时钟配被配置为 120M。__main 是一个标准的 C 库函数,主要作用是初始化用户堆栈,并在函数的最后调用main 函数去到 C 的世界。这就是为什么我们写的程序都有一个 main 函数的原因。
 楼主| 结合国际经验 发表于 2021-11-30 11:14 | 显示全部楼层
  LDR、 BLX、 BX 是 CM4 内核的指令,具体作用见下表:

3340861a596ee11266.png
 楼主| 结合国际经验 发表于 2021-11-30 11:14 | 显示全部楼层
5. 中断服务程序

        在启动文件里面已经帮我们写好所有中断的中断服务函数,跟我们平时写的中断服务函数不一样的就是这些函数都是空的,真正的中断复服务程序需要我们在外部的 C 文件里面重新实现,这里只是提前占了一个位置而已。
 楼主| 结合国际经验 发表于 2021-11-30 11:15 | 显示全部楼层
如果我们在使用某个外设的时候,开启了某个中断,但是又忘记编写配套的中断服务程序或者函数名写错,那当中断来临的时,程序就会跳转到启动文件预先写好的空的中断服务程序中,并且在这个空函数中无限循环,即程序就死在这里。
 楼主| 结合国际经验 发表于 2021-11-30 11:16 | 显示全部楼层
  1. ;/* dummy Exception Handlers */
  2. NMI_Handler         PROC
  3.                     EXPORT  NMI_Handler                         [WEAK]
  4.                     B       .
  5.                     ENDP

  6. HardFault_Handler   PROC
  7.                     EXPORT  HardFault_Handler                   [WEAK]
  8.                     B       .
  9.                     ENDP

  10. MemManage_Handler   PROC
  11.                     EXPORT  MemManage_Handler                   [WEAK]
  12.                     B       .
  13.                     ENDP

  14. BusFault_Handler    PROC
  15.                     EXPORT  BusFault_Handler                    [WEAK]
  16.                     B       .
  17.                     ENDP

  18. UsageFault_Handler  PROC
  19.                     EXPORT  UsageFault_Handler                  [WEAK]
  20.                     B       .
  21.                     ENDP

  22. SVC_Handler         PROC
  23.                     EXPORT  SVC_Handler                         [WEAK]
  24.                     B       .
  25.                     ENDP

  26. DebugMon_Handler    PROC
  27.                     EXPORT  DebugMon_Handler                    [WEAK]
  28.                     B       .
  29.                     ENDP

  30. PendSV_Handler      PROC
  31.                     EXPORT  PendSV_Handler                      [WEAK]
  32.                     B       .
  33.                     ENDP

  34. SysTick_Handler     PROC
  35.                     EXPORT  SysTick_Handler                     [WEAK]
  36.                     B       .
  37.                     ENDP

  38. Default_Handler     PROC
  39. ;                   /* external interrupts handler */   
  40.                     EXPORT  WWDGT_IRQHandler                    [WEAK]
  41.                     EXPORT  LVD_IRQHandler                      [WEAK]
  42.                     EXPORT  TAMPER_IRQHandler                   [WEAK]
  43.                     EXPORT  RTC_IRQHandler                      [WEAK]
  44.                     EXPORT  FMC_IRQHandler                      [WEAK]
  45.                     EXPORT  RCU_IRQHandler                      [WEAK]
  46.                     EXPORT  EXTI0_IRQHandler                    [WEAK]
  47.                     EXPORT  EXTI1_IRQHandler                    [WEAK]
  48.                     EXPORT  EXTI2_IRQHandler                    [WEAK]
  49.                     EXPORT  EXTI3_IRQHandler                    [WEAK]
  50.                     EXPORT  EXTI4_IRQHandler                    [WEAK]
  51.                     EXPORT  DMA0_Channel0_IRQHandler            [WEAK]
  52.                     EXPORT  DMA0_Channel1_IRQHandler            [WEAK]
  53.                     EXPORT  DMA0_Channel2_IRQHandler            [WEAK]
  54.                     EXPORT  DMA0_Channel3_IRQHandler            [WEAK]
  55.                     EXPORT  DMA0_Channel4_IRQHandler            [WEAK]
  56.                     EXPORT  DMA0_Channel5_IRQHandler            [WEAK]
  57.                     EXPORT  DMA0_Channel6_IRQHandler            [WEAK]
  58.                     EXPORT  ADC0_1_IRQHandler                   [WEAK]
  59.                     EXPORT  CAN0_TX_IRQHandler                  [WEAK]
  60.                     EXPORT  CAN0_RX0_IRQHandler                 [WEAK]
  61.                     EXPORT  CAN0_RX1_IRQHandler                 [WEAK]
  62.                     EXPORT  CAN0_EWMC_IRQHandler                [WEAK]
  63.                     EXPORT  EXTI5_9_IRQHandler                  [WEAK]
  64.                     EXPORT  TIMER0_BRK_TIMER8_IRQHandler        [WEAK]
  65.                     EXPORT  TIMER0_UP_TIMER9_IRQHandler         [WEAK]
  66.                     EXPORT  TIMER0_TRG_CMT_TIMER10_IRQHandler   [WEAK]
  67.                     EXPORT  TIMER0_Channel_IRQHandler           [WEAK]
  68.                     EXPORT  TIMER1_IRQHandler                   [WEAK]
  69.                     EXPORT  TIMER2_IRQHandler                   [WEAK]
  70.                     EXPORT  TIMER3_IRQHandler                   [WEAK]
  71.                     EXPORT  I2C0_EV_IRQHandler                  [WEAK]
  72.                     EXPORT  I2C0_ER_IRQHandler                  [WEAK]
  73.                     EXPORT  I2C1_EV_IRQHandler                  [WEAK]
  74.                     EXPORT  I2C1_ER_IRQHandler                  [WEAK]
  75.                     EXPORT  SPI0_IRQHandler                     [WEAK]
  76.                     EXPORT  SPI1_IRQHandler                     [WEAK]
  77.                     EXPORT  USART0_IRQHandler                   [WEAK]
  78.                     EXPORT  USART1_IRQHandler                   [WEAK]
  79.                     EXPORT  USART2_IRQHandler                   [WEAK]
  80.                     EXPORT  EXTI10_15_IRQHandler                [WEAK]
  81.                     EXPORT  RTC_Alarm_IRQHandler                [WEAK]
  82.                     EXPORT  USBFS_WKUP_IRQHandler               [WEAK]
  83.                     EXPORT  TIMER7_BRK_TIMER11_IRQHandler       [WEAK]
  84.                     EXPORT  TIMER7_UP_TIMER12_IRQHandler        [WEAK]
  85.                     EXPORT  TIMER7_TRG_CMT_TIMER13_IRQHandler   [WEAK]
  86.                     EXPORT  TIMER7_Channel_IRQHandler           [WEAK]
  87.                     EXPORT  ADC2_IRQHandler                     [WEAK]
  88.                     EXPORT  EXMC_IRQHandler                     [WEAK]
  89.                     EXPORT  SDIO_IRQHandler                     [WEAK]  
  90.                     EXPORT  TIMER4_IRQHandler                   [WEAK]
  91.                     EXPORT  SPI2_IRQHandler                     [WEAK]
  92.                     EXPORT  UART3_IRQHandler                    [WEAK]
  93.                     EXPORT  UART4_IRQHandler                    [WEAK]
  94.                     EXPORT  TIMER5_IRQHandler                   [WEAK]
  95.                     EXPORT  TIMER6_IRQHandler                   [WEAK]
  96.                     EXPORT  DMA1_Channel0_IRQHandler            [WEAK]
  97.                     EXPORT  DMA1_Channel1_IRQHandler            [WEAK]
  98.                     EXPORT  DMA1_Channel2_IRQHandler            [WEAK]
  99.                     EXPORT  DMA1_Channel3_IRQHandler            [WEAK]
  100.                     EXPORT  DMA1_Channel4_IRQHandler            [WEAK]
  101.                     EXPORT  ENET_IRQHandler                     [WEAK]
  102.                     EXPORT  ENET_WKUP_IRQHandler                [WEAK]
  103.                     EXPORT  CAN1_TX_IRQHandler                  [WEAK]
  104.                     EXPORT  CAN1_RX0_IRQHandler                 [WEAK]
  105.                     EXPORT  CAN1_RX1_IRQHandler                 [WEAK]
  106.                     EXPORT  CAN1_EWMC_IRQHandler                [WEAK]
  107.                     EXPORT  USBFS_IRQHandler                    [WEAK]                                
  108.                     EXPORT  DMA1_Channel5_IRQHandler            [WEAK]                                   
  109.                     EXPORT  DMA1_Channel6_IRQHandler            [WEAK]                                   
  110.                     EXPORT  USART5_IRQHandler                   [WEAK]                                          
  111.                     EXPORT  I2C2_EV_IRQHandler                  [WEAK]                                             
  112.                     EXPORT  I2C2_ER_IRQHandler                  [WEAK]                                                                                
  113.                     EXPORT  DCI_IRQHandler                      [WEAK]                                             
  114.                     EXPORT  CAU_IRQHandler                      [WEAK]                                    
  115.                     EXPORT  HAU_TRNG_IRQHandler                 [WEAK]
  116.                     EXPORT  UART6_IRQHandler                    [WEAK]
  117.                     EXPORT  UART7_IRQHandler                    [WEAK]
  118.                     EXPORT  TLI_IRQHandler                      [WEAK]
  119.                     EXPORT  TLI_ER_IRQHandler                   [WEAK]   

  120. ;/* external interrupts handler */
  121. WWDGT_IRQHandler
  122. LVD_IRQHandler
  123. TAMPER_IRQHandler
  124. RTC_IRQHandler
  125. FMC_IRQHandler
  126. RCU_IRQHandler
  127. EXTI0_IRQHandler
  128. EXTI1_IRQHandler
  129. EXTI2_IRQHandler
  130. EXTI3_IRQHandler
  131. EXTI4_IRQHandler
  132. DMA0_Channel0_IRQHandler
  133. DMA0_Channel1_IRQHandler
  134. DMA0_Channel2_IRQHandler
  135. DMA0_Channel3_IRQHandler
  136. DMA0_Channel4_IRQHandler
  137. DMA0_Channel5_IRQHandler
  138. DMA0_Channel6_IRQHandler
  139. ADC0_1_IRQHandler
  140. CAN0_TX_IRQHandler
  141. CAN0_RX0_IRQHandler
  142. CAN0_RX1_IRQHandler
  143. CAN0_EWMC_IRQHandler
  144. EXTI5_9_IRQHandler
  145. TIMER0_BRK_TIMER8_IRQHandler
  146. TIMER0_UP_TIMER9_IRQHandler
  147. TIMER0_TRG_CMT_TIMER10_IRQHandler
  148. TIMER0_Channel_IRQHandler
  149. TIMER1_IRQHandler
  150. TIMER2_IRQHandler
  151. TIMER3_IRQHandler
  152. I2C0_EV_IRQHandler
  153. I2C0_ER_IRQHandler
  154. I2C1_EV_IRQHandler
  155. I2C1_ER_IRQHandler
  156. SPI0_IRQHandler
  157. SPI1_IRQHandler
  158. USART0_IRQHandler
  159. USART1_IRQHandler
  160. USART2_IRQHandler
  161. EXTI10_15_IRQHandler
  162. RTC_Alarm_IRQHandler
  163. USBFS_WKUP_IRQHandler
  164. TIMER7_BRK_TIMER11_IRQHandler
  165. TIMER7_UP_TIMER12_IRQHandler
  166. TIMER7_TRG_CMT_TIMER13_IRQHandler
  167. TIMER7_Channel_IRQHandler
  168. ADC2_IRQHandler
  169. EXMC_IRQHandler
  170. SDIO_IRQHandler
  171. TIMER4_IRQHandler
  172. SPI2_IRQHandler
  173. UART3_IRQHandler
  174. UART4_IRQHandler
  175. TIMER5_IRQHandler
  176. TIMER6_IRQHandler
  177. DMA1_Channel0_IRQHandler
  178. DMA1_Channel1_IRQHandler
  179. DMA1_Channel2_IRQHandler
  180. DMA1_Channel3_IRQHandler
  181. DMA1_Channel4_IRQHandler
  182. ENET_IRQHandler
  183. ENET_WKUP_IRQHandler
  184. CAN1_TX_IRQHandler
  185. CAN1_RX0_IRQHandler
  186. CAN1_RX1_IRQHandler
  187. CAN1_EWMC_IRQHandler
  188. USBFS_IRQHandler
  189. DMA1_Channel5_IRQHandler                                 
  190. DMA1_Channel6_IRQHandler                                               
  191. USART5_IRQHandler                                                            
  192. I2C2_EV_IRQHandler                                                         
  193. I2C2_ER_IRQHandler                                                                                                
  194. DCI_IRQHandler                                                               
  195. CAU_IRQHandler                                                         
  196. HAU_TRNG_IRQHandler                 
  197. UART6_IRQHandler
  198. UART7_IRQHandler                    
  199. TLI_IRQHandler                     
  200. TLI_ER_IRQHandler

  201.                 B       .
  202.                 ENDP
 楼主| 结合国际经验 发表于 2021-11-30 11:17 | 显示全部楼层
B:跳转到一个标号。这里跳转到一个‘.’,即表示无线循环
 楼主| 结合国际经验 发表于 2021-11-30 11:18 | 显示全部楼层
6. 用户堆栈初始化
  1. ALIGN


ALIGN:对指令或者数据存放的地址进行对齐,后面会跟一个立即数。缺省表示 4 字节对齐。
 楼主| 结合国际经验 发表于 2021-11-30 11:18 | 显示全部楼层
  1. ; user Initial Stack & Heap

  2.                  IF      :DEF:__MICROLIB
  3.                
  4.                  EXPORT  __initial_sp
  5.                  EXPORT  __heap_base
  6.                  EXPORT  __heap_limit
  7.                
  8.                  ELSE
  9.                
  10.                  IMPORT  __use_two_region_memory
  11.                  EXPORT  __user_initial_stackheap
  12.                  
  13. __user_initial_stackheap PROC
  14.                  LDR     R0, =  Heap_Mem
  15.                  LDR     R1, =(Stack_Mem + Stack_Size)
  16.                  LDR     R2, = (Heap_Mem +  Heap_Size)
  17.                  LDR     R3, = Stack_Mem
  18.                  BX      LR
  19.                  ENDP
  20.                      
  21.                  ALIGN

  22.                  ENDIF

  23.                  END
 楼主| 结合国际经验 发表于 2021-11-30 11:21 | 显示全部楼层
首先判断是否定义了__MICROLIB ,如果定义了这个宏则赋予标号__initial_sp(栈顶地址)、 __heap_base(堆起始地址)、 __heap_limit(堆结束地址)全局属性,可供外部文件调用。有关这个宏我们在 KEIL 里面配置。然后堆栈的初始化就由 C 库函数_main 来完成。
 楼主| 结合国际经验 发表于 2021-11-30 12:38 | 显示全部楼层
 楼主| 结合国际经验 发表于 2021-11-30 12:39 | 显示全部楼层
如 果没 有 定 义 __MICROLIB , 则 才 用 双 段 存 储 器 模 式 , 且 声 明 标 号__user_initial_stackheap 具有全局属性,让用户自己来初始化堆栈。
 楼主| 结合国际经验 发表于 2021-11-30 12:39 | 显示全部楼层
IF,ELSE,ENDIF:汇编的条件分支语句,跟 C 语言的 if ,else 类似
 楼主| 结合国际经验 发表于 2021-11-30 12:42 | 显示全部楼层
END:文件结束
foxsbig 发表于 2021-12-1 19:15 | 显示全部楼层
有PDF的么?想下载保存
chenqianqian 发表于 2021-12-1 20:51 来自手机 | 显示全部楼层
谢谢楼主讲解
fashion65 发表于 2021-12-4 13:31 | 显示全部楼层
结合国际经验 发表于 2021-11-30 10:57
栈的作用是用于局部变量,函数调用,函数形参等的开销,栈的大小不能超过内部SRAM 的大小。如果编写的程序 ...

我记得某一些软件(STM的CubeIDE)可以事先计算程序所用到的堆栈的最大可能开销,然后我们把STACK的值大于这个值,这样就可以避免溢出了,不知道在keil中如何查看?
fashion65 发表于 2021-12-4 13:41 | 显示全部楼层
结合国际经验 发表于 2021-11-30 11:08
__Vectors 为向量表起始地址, __Vectors_End 为向量表结束地址,两个相减即可算出向量表大小。

         ...

并且以 ESR 的入口地址初始化它们,  这句话没看明白??
fashion65 发表于 2021-12-4 13:59 | 显示全部楼层
__user_initial_stackheap PROC
                LDR     R0, =  Heap_Mem
                LDR     R1, =(Stack_Mem + Stack_Size)
                LDR     R2, = (Heap_Mem +  Heap_Size)
                LDR     R3, = Stack_Mem
                BX      LR
                ENDP


这一段什么意思?怎么用?
fashion65 发表于 2021-12-4 14:01 | 显示全部楼层
本帖最后由 fashion65 于 2021-12-4 14:10 编辑

非常详细,感谢感谢,辛苦辛苦
weifeng90 发表于 2021-12-5 16:00 来自手机 | 显示全部楼层
感谢讲解
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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