舒伯特玫瑰 发表于 2023-4-28 01:03

System Init():一个标准的库函数,在system_hc32f460.c这个库文件中定义。其主要作用是配置系统时钟,这里面的时钟是需要用户自己配置的,华大芯片最高主频支持200M。

舒伯特玫瑰 发表于 2023-4-28 01:03

__main:一个标准的C库函数,主要作用是初始化用户堆栈,并在函数的最后调用main函数进入C语言世界。这就是为什么我们写的程序都有一个main函数的原因。LDR、BLX、BX是CM4内核的指令,可在《CM3权威指南Cn R2》第4章里面查询到,具体作用见下表。

舒伯特玫瑰 发表于 2023-4-28 01:03

舒伯特玫瑰 发表于 2023-4-28 01:03

值得注意的是上面有一段操作R0和R1寄存器的代码,这段代码是什么意思呢?查询手册,找到这个0x40050804的地址,发现是对sram的控制寄存器进行操作,详细对比手册之后,功能就是给sram3这块区域设置读写等待周期为2周期。

舒伯特玫瑰 发表于 2023-4-28 01:04

舒伯特玫瑰 发表于 2023-4-28 01:06

舒伯特玫瑰 发表于 2023-4-28 01:06

舒伯特玫瑰 发表于 2023-4-28 01:06

5. 中断服务程序

再下面的代码就是中断服务程序,太长了就不粘贴了。启动文件已经帮我们写好所有中断的服务函数,但与我们平时写的中断服务函数不一样,这些函数都是空的,真正的中断服务程序需要在外部的C文件里面重新实现,这里只是提前占了一个位置而已。如果在使用某个外设的时候,开启了某个中断,但是又忘记编写配套的中断服务程序或者函数名写错,那当中断来临时,程序就会跳转到启动文件预先写好的空的中断服务程序中,并且在这个空函数中无限循环,即程序就“死”在这里。

舒伯特玫瑰 发表于 2023-4-28 01:07

6. 用户堆栈初始化
                ALIGN


; 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

舒伯特玫瑰 发表于 2023-4-28 01:07

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

舒伯特玫瑰 发表于 2023-4-28 01:08

首先判断是否定义了__MICROLIB,如果定义了这个宏,则赋予标号__initial_sp(栈顶地址)、__heap_base(堆起始地址)、__heap_limit(堆结束地址)全局属性,可供外部文件调用。有关这个宏在KEIL里面配置,具体见下图。然后堆栈的初始化就由C库函数_main来完成。

舒伯特玫瑰 发表于 2023-4-28 01:08

舒伯特玫瑰 发表于 2023-4-28 01:08

如果没有定义__MICROLIB,则采用双段存储器模式,且声明标号__user_initial_stackheap具有全局属性,让用户自己初始化堆栈。IF、ELSE、ENDIF:汇编的条件分支语句,与C语言中的if、else类似。END:文件结束。

舒伯特玫瑰 发表于 2023-4-28 01:08

总结:

启动文件由汇编语言编写,是系统上电复位后第一个执行的程序,主要做了以下工作:

1)初始化堆栈指针:SP=_initial_sp。

2)初始化程序指针:PC=Reset_Handler。

3)初始化中断向量表。

4)设定sram3的等待周期,配置系统时钟。

5)调用C库函数_main初始化用户堆栈,最终调用main函数进入C语言世界。

Henryko 发表于 2023-5-12 23:43

弱定义跟强定义有什么区别

观海 发表于 2023-5-15 16:19

如果人为更改启动文件 会不会造成芯片的混乱呢

tpgf 发表于 2023-5-15 17:26

即便是可以更改 可是这个哪里可以改 哪里不能改 也得详细斟酌一下

guanjiaer 发表于 2023-5-16 09:09

sram3的等待时间是只能设置为1wait还是说最少设置为1wait啊

heimaojingzhang 发表于 2023-5-16 10:29

是不是所有单片机的启动文件都是纯汇编文件呢

keaibukelian 发表于 2023-5-16 11:26

heimaojingzhang 发表于 2023-5-16 10:29
是不是所有单片机的启动文件都是纯汇编文件呢

好像是的基本上所有厂家的 据我了解都是使用的汇编语言
页: 1 [2] 3
查看完整版本: 小华半导体芯片启动文件详细讲解