打印
[研电赛技术支持]

GD32启动文件详解

[复制链接]
手机看帖
扫描二维码
随时随地手机跟帖
21
结合国际经验|  楼主 | 2021-11-30 11:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
  SystemInit()是一个标准的库函数,在 system_gd32f20x.c这个库文件总定义。主要作用是配置系统时钟,这里调用这个函数之后,单片机的系统时钟配被配置为 120M。__main 是一个标准的 C 库函数,主要作用是初始化用户堆栈,并在函数的最后调用main 函数去到 C 的世界。这就是为什么我们写的程序都有一个 main 函数的原因。

使用特权

评论回复
22
结合国际经验|  楼主 | 2021-11-30 11:14 | 只看该作者
  LDR、 BLX、 BX 是 CM4 内核的指令,具体作用见下表:

使用特权

评论回复
23
结合国际经验|  楼主 | 2021-11-30 11:14 | 只看该作者
5. 中断服务程序

        在启动文件里面已经帮我们写好所有中断的中断服务函数,跟我们平时写的中断服务函数不一样的就是这些函数都是空的,真正的中断复服务程序需要我们在外部的 C 文件里面重新实现,这里只是提前占了一个位置而已。

使用特权

评论回复
24
结合国际经验|  楼主 | 2021-11-30 11:15 | 只看该作者
如果我们在使用某个外设的时候,开启了某个中断,但是又忘记编写配套的中断服务程序或者函数名写错,那当中断来临的时,程序就会跳转到启动文件预先写好的空的中断服务程序中,并且在这个空函数中无限循环,即程序就死在这里。

使用特权

评论回复
25
结合国际经验|  楼主 | 2021-11-30 11:16 | 只看该作者
;/* dummy Exception Handlers */
NMI_Handler         PROC
                    EXPORT  NMI_Handler                         [WEAK]
                    B       .
                    ENDP

HardFault_Handler   PROC
                    EXPORT  HardFault_Handler                   [WEAK]
                    B       .
                    ENDP

MemManage_Handler   PROC
                    EXPORT  MemManage_Handler                   [WEAK]
                    B       .
                    ENDP

BusFault_Handler    PROC
                    EXPORT  BusFault_Handler                    [WEAK]
                    B       .
                    ENDP

UsageFault_Handler  PROC
                    EXPORT  UsageFault_Handler                  [WEAK]
                    B       .
                    ENDP

SVC_Handler         PROC
                    EXPORT  SVC_Handler                         [WEAK]
                    B       .
                    ENDP

DebugMon_Handler    PROC
                    EXPORT  DebugMon_Handler                    [WEAK]
                    B       .
                    ENDP

PendSV_Handler      PROC
                    EXPORT  PendSV_Handler                      [WEAK]
                    B       .
                    ENDP

SysTick_Handler     PROC
                    EXPORT  SysTick_Handler                     [WEAK]
                    B       .
                    ENDP

Default_Handler     PROC
;                   /* external interrupts handler */   
                    EXPORT  WWDGT_IRQHandler                    [WEAK]
                    EXPORT  LVD_IRQHandler                      [WEAK]
                    EXPORT  TAMPER_IRQHandler                   [WEAK]
                    EXPORT  RTC_IRQHandler                      [WEAK]
                    EXPORT  FMC_IRQHandler                      [WEAK]
                    EXPORT  RCU_IRQHandler                      [WEAK]
                    EXPORT  EXTI0_IRQHandler                    [WEAK]
                    EXPORT  EXTI1_IRQHandler                    [WEAK]
                    EXPORT  EXTI2_IRQHandler                    [WEAK]
                    EXPORT  EXTI3_IRQHandler                    [WEAK]
                    EXPORT  EXTI4_IRQHandler                    [WEAK]
                    EXPORT  DMA0_Channel0_IRQHandler            [WEAK]
                    EXPORT  DMA0_Channel1_IRQHandler            [WEAK]
                    EXPORT  DMA0_Channel2_IRQHandler            [WEAK]
                    EXPORT  DMA0_Channel3_IRQHandler            [WEAK]
                    EXPORT  DMA0_Channel4_IRQHandler            [WEAK]
                    EXPORT  DMA0_Channel5_IRQHandler            [WEAK]
                    EXPORT  DMA0_Channel6_IRQHandler            [WEAK]
                    EXPORT  ADC0_1_IRQHandler                   [WEAK]
                    EXPORT  CAN0_TX_IRQHandler                  [WEAK]
                    EXPORT  CAN0_RX0_IRQHandler                 [WEAK]
                    EXPORT  CAN0_RX1_IRQHandler                 [WEAK]
                    EXPORT  CAN0_EWMC_IRQHandler                [WEAK]
                    EXPORT  EXTI5_9_IRQHandler                  [WEAK]
                    EXPORT  TIMER0_BRK_TIMER8_IRQHandler        [WEAK]
                    EXPORT  TIMER0_UP_TIMER9_IRQHandler         [WEAK]
                    EXPORT  TIMER0_TRG_CMT_TIMER10_IRQHandler   [WEAK]
                    EXPORT  TIMER0_Channel_IRQHandler           [WEAK]
                    EXPORT  TIMER1_IRQHandler                   [WEAK]
                    EXPORT  TIMER2_IRQHandler                   [WEAK]
                    EXPORT  TIMER3_IRQHandler                   [WEAK]
                    EXPORT  I2C0_EV_IRQHandler                  [WEAK]
                    EXPORT  I2C0_ER_IRQHandler                  [WEAK]
                    EXPORT  I2C1_EV_IRQHandler                  [WEAK]
                    EXPORT  I2C1_ER_IRQHandler                  [WEAK]
                    EXPORT  SPI0_IRQHandler                     [WEAK]
                    EXPORT  SPI1_IRQHandler                     [WEAK]
                    EXPORT  USART0_IRQHandler                   [WEAK]
                    EXPORT  USART1_IRQHandler                   [WEAK]
                    EXPORT  USART2_IRQHandler                   [WEAK]
                    EXPORT  EXTI10_15_IRQHandler                [WEAK]
                    EXPORT  RTC_Alarm_IRQHandler                [WEAK]
                    EXPORT  USBFS_WKUP_IRQHandler               [WEAK]
                    EXPORT  TIMER7_BRK_TIMER11_IRQHandler       [WEAK]
                    EXPORT  TIMER7_UP_TIMER12_IRQHandler        [WEAK]
                    EXPORT  TIMER7_TRG_CMT_TIMER13_IRQHandler   [WEAK]
                    EXPORT  TIMER7_Channel_IRQHandler           [WEAK]
                    EXPORT  ADC2_IRQHandler                     [WEAK]
                    EXPORT  EXMC_IRQHandler                     [WEAK]
                    EXPORT  SDIO_IRQHandler                     [WEAK]  
                    EXPORT  TIMER4_IRQHandler                   [WEAK]
                    EXPORT  SPI2_IRQHandler                     [WEAK]
                    EXPORT  UART3_IRQHandler                    [WEAK]
                    EXPORT  UART4_IRQHandler                    [WEAK]
                    EXPORT  TIMER5_IRQHandler                   [WEAK]
                    EXPORT  TIMER6_IRQHandler                   [WEAK]
                    EXPORT  DMA1_Channel0_IRQHandler            [WEAK]
                    EXPORT  DMA1_Channel1_IRQHandler            [WEAK]
                    EXPORT  DMA1_Channel2_IRQHandler            [WEAK]
                    EXPORT  DMA1_Channel3_IRQHandler            [WEAK]
                    EXPORT  DMA1_Channel4_IRQHandler            [WEAK]
                    EXPORT  ENET_IRQHandler                     [WEAK]
                    EXPORT  ENET_WKUP_IRQHandler                [WEAK]
                    EXPORT  CAN1_TX_IRQHandler                  [WEAK]
                    EXPORT  CAN1_RX0_IRQHandler                 [WEAK]
                    EXPORT  CAN1_RX1_IRQHandler                 [WEAK]
                    EXPORT  CAN1_EWMC_IRQHandler                [WEAK]
                    EXPORT  USBFS_IRQHandler                    [WEAK]                                
                    EXPORT  DMA1_Channel5_IRQHandler            [WEAK]                                   
                    EXPORT  DMA1_Channel6_IRQHandler            [WEAK]                                   
                    EXPORT  USART5_IRQHandler                   [WEAK]                                          
                    EXPORT  I2C2_EV_IRQHandler                  [WEAK]                                             
                    EXPORT  I2C2_ER_IRQHandler                  [WEAK]                                                                                
                    EXPORT  DCI_IRQHandler                      [WEAK]                                             
                    EXPORT  CAU_IRQHandler                      [WEAK]                                    
                    EXPORT  HAU_TRNG_IRQHandler                 [WEAK]
                    EXPORT  UART6_IRQHandler                    [WEAK]
                    EXPORT  UART7_IRQHandler                    [WEAK]
                    EXPORT  TLI_IRQHandler                      [WEAK]
                    EXPORT  TLI_ER_IRQHandler                   [WEAK]   

;/* external interrupts handler */
WWDGT_IRQHandler
LVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FMC_IRQHandler
RCU_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA0_Channel0_IRQHandler
DMA0_Channel1_IRQHandler
DMA0_Channel2_IRQHandler
DMA0_Channel3_IRQHandler
DMA0_Channel4_IRQHandler
DMA0_Channel5_IRQHandler
DMA0_Channel6_IRQHandler
ADC0_1_IRQHandler
CAN0_TX_IRQHandler
CAN0_RX0_IRQHandler
CAN0_RX1_IRQHandler
CAN0_EWMC_IRQHandler
EXTI5_9_IRQHandler
TIMER0_BRK_TIMER8_IRQHandler
TIMER0_UP_TIMER9_IRQHandler
TIMER0_TRG_CMT_TIMER10_IRQHandler
TIMER0_Channel_IRQHandler
TIMER1_IRQHandler
TIMER2_IRQHandler
TIMER3_IRQHandler
I2C0_EV_IRQHandler
I2C0_ER_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
SPI0_IRQHandler
SPI1_IRQHandler
USART0_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
EXTI10_15_IRQHandler
RTC_Alarm_IRQHandler
USBFS_WKUP_IRQHandler
TIMER7_BRK_TIMER11_IRQHandler
TIMER7_UP_TIMER12_IRQHandler
TIMER7_TRG_CMT_TIMER13_IRQHandler
TIMER7_Channel_IRQHandler
ADC2_IRQHandler
EXMC_IRQHandler
SDIO_IRQHandler
TIMER4_IRQHandler
SPI2_IRQHandler
UART3_IRQHandler
UART4_IRQHandler
TIMER5_IRQHandler
TIMER6_IRQHandler
DMA1_Channel0_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
ENET_IRQHandler
ENET_WKUP_IRQHandler
CAN1_TX_IRQHandler
CAN1_RX0_IRQHandler
CAN1_RX1_IRQHandler
CAN1_EWMC_IRQHandler
USBFS_IRQHandler
DMA1_Channel5_IRQHandler                                 
DMA1_Channel6_IRQHandler                                               
USART5_IRQHandler                                                            
I2C2_EV_IRQHandler                                                         
I2C2_ER_IRQHandler                                                                                                
DCI_IRQHandler                                                               
CAU_IRQHandler                                                         
HAU_TRNG_IRQHandler                 
UART6_IRQHandler
UART7_IRQHandler                    
TLI_IRQHandler                     
TLI_ER_IRQHandler

                B       .
                ENDP

使用特权

评论回复
26
结合国际经验|  楼主 | 2021-11-30 11:17 | 只看该作者
B:跳转到一个标号。这里跳转到一个‘.’,即表示无线循环

使用特权

评论回复
27
结合国际经验|  楼主 | 2021-11-30 11:18 | 只看该作者
6. 用户堆栈初始化
ALIGN


ALIGN:对指令或者数据存放的地址进行对齐,后面会跟一个立即数。缺省表示 4 字节对齐。

使用特权

评论回复
28
结合国际经验|  楼主 | 2021-11-30 11:18 | 只看该作者
; user Initial Stack & Heap

                 IF      :DEF:__MICROLIB
               
                 EXPORT  __initial_sp
                 EXPORT  __heap_base
                 EXPORT  __heap_limit
               
                 ELSE
               
                 IMPORT  __use_two_region_memory
                 EXPORT  __user_initial_stackheap
                 
__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
                     
                 ALIGN

                 ENDIF

                 END

使用特权

评论回复
29
结合国际经验|  楼主 | 2021-11-30 11:21 | 只看该作者
首先判断是否定义了__MICROLIB ,如果定义了这个宏则赋予标号__initial_sp(栈顶地址)、 __heap_base(堆起始地址)、 __heap_limit(堆结束地址)全局属性,可供外部文件调用。有关这个宏我们在 KEIL 里面配置。然后堆栈的初始化就由 C 库函数_main 来完成。

使用特权

评论回复
30
结合国际经验|  楼主 | 2021-11-30 12:38 | 只看该作者

使用特权

评论回复
31
结合国际经验|  楼主 | 2021-11-30 12:39 | 只看该作者
如 果没 有 定 义 __MICROLIB , 则 才 用 双 段 存 储 器 模 式 , 且 声 明 标 号__user_initial_stackheap 具有全局属性,让用户自己来初始化堆栈。

使用特权

评论回复
32
结合国际经验|  楼主 | 2021-11-30 12:39 | 只看该作者
IF,ELSE,ENDIF:汇编的条件分支语句,跟 C 语言的 if ,else 类似

使用特权

评论回复
33
结合国际经验|  楼主 | 2021-11-30 12:42 | 只看该作者
END:文件结束

使用特权

评论回复
34
foxsbig| | 2021-12-1 19:15 | 只看该作者
有PDF的么?想下载保存

使用特权

评论回复
35
chenqianqian| | 2021-12-1 20:51 | 只看该作者
谢谢楼主讲解

使用特权

评论回复
36
fashion65| | 2021-12-4 13:31 | 只看该作者
结合国际经验 发表于 2021-11-30 10:57
栈的作用是用于局部变量,函数调用,函数形参等的开销,栈的大小不能超过内部SRAM 的大小。如果编写的程序 ...

我记得某一些软件(STM的CubeIDE)可以事先计算程序所用到的堆栈的最大可能开销,然后我们把STACK的值大于这个值,这样就可以避免溢出了,不知道在keil中如何查看?

使用特权

评论回复
37
fashion65| | 2021-12-4 13:41 | 只看该作者
结合国际经验 发表于 2021-11-30 11:08
__Vectors 为向量表起始地址, __Vectors_End 为向量表结束地址,两个相减即可算出向量表大小。

         ...

并且以 ESR 的入口地址初始化它们,  这句话没看明白??

使用特权

评论回复
38
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


这一段什么意思?怎么用?

使用特权

评论回复
39
fashion65| | 2021-12-4 14:01 | 只看该作者
本帖最后由 fashion65 于 2021-12-4 14:10 编辑

非常详细,感谢感谢,辛苦辛苦

使用特权

评论回复
40
weifeng90| | 2021-12-5 16:00 | 只看该作者
感谢讲解

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则