打印
[方案相关]

小华半导体芯片启动文件详细讲解

[复制链接]
楼主: 舒伯特玫瑰
手机看帖
扫描二维码
随时随地手机跟帖
21
舒伯特玫瑰|  楼主 | 2023-4-28 01:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
System Init():一个标准的库函数,在system_hc32f460.c这个库文件中定义。其主要作用是配置系统时钟,这里面的时钟是需要用户自己配置的,华大芯片最高主频支持200M。

使用特权

评论回复
22
舒伯特玫瑰|  楼主 | 2023-4-28 01:03 | 只看该作者
__main:一个标准的C库函数,主要作用是初始化用户堆栈,并在函数的最后调用main函数进入C语言世界。这就是为什么我们写的程序都有一个main函数的原因。LDR、BLX、BX是CM4内核的指令,可在《CM3权威指南Cn R2》第4章里面查询到,具体作用见下表。

使用特权

评论回复
23
舒伯特玫瑰|  楼主 | 2023-4-28 01:03 | 只看该作者

使用特权

评论回复
24
舒伯特玫瑰|  楼主 | 2023-4-28 01:03 | 只看该作者
值得注意的是上面有一段操作R0和R1寄存器的代码,这段代码是什么意思呢?查询手册,找到这个0x40050804的地址,发现是对sram的控制寄存器进行操作,详细对比手册之后,功能就是给sram3这块区域设置读写等待周期为2周期。

使用特权

评论回复
25
舒伯特玫瑰|  楼主 | 2023-4-28 01:04 | 只看该作者

使用特权

评论回复
26
舒伯特玫瑰|  楼主 | 2023-4-28 01:06 | 只看该作者

使用特权

评论回复
27
舒伯特玫瑰|  楼主 | 2023-4-28 01:06 | 只看该作者

使用特权

评论回复
28
舒伯特玫瑰|  楼主 | 2023-4-28 01:06 | 只看该作者
5. 中断服务程序

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

使用特权

评论回复
29
舒伯特玫瑰|  楼主 | 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

使用特权

评论回复
30
舒伯特玫瑰|  楼主 | 2023-4-28 01:07 | 只看该作者
ALIGN:对指令或者数据存放的地址进行对齐,后面会跟一个立即数,缺省表示4字节对齐。

使用特权

评论回复
31
舒伯特玫瑰|  楼主 | 2023-4-28 01:08 | 只看该作者
首先判断是否定义了__MICROLIB,如果定义了这个宏,则赋予标号__initial_sp(栈顶地址)、__heap_base(堆起始地址)、__heap_limit(堆结束地址)全局属性,可供外部文件调用。有关这个宏在KEIL里面配置,具体见下图。然后堆栈的初始化就由C库函数_main来完成。

使用特权

评论回复
32
舒伯特玫瑰|  楼主 | 2023-4-28 01:08 | 只看该作者

使用特权

评论回复
33
舒伯特玫瑰|  楼主 | 2023-4-28 01:08 | 只看该作者
如果没有定义__MICROLIB,则采用双段存储器模式,且声明标号__user_initial_stackheap具有全局属性,让用户自己初始化堆栈。IF、ELSE、ENDIF:汇编的条件分支语句,与C语言中的if、else类似。END:文件结束。

使用特权

评论回复
34
舒伯特玫瑰|  楼主 | 2023-4-28 01:08 | 只看该作者
总结:

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

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

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

3)初始化中断向量表。

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

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

使用特权

评论回复
35
Henryko| | 2023-5-12 23:43 | 只看该作者
弱定义跟强定义有什么区别

使用特权

评论回复
36
观海| | 2023-5-15 16:19 | 只看该作者
如果人为更改启动文件 会不会造成芯片的混乱呢

使用特权

评论回复
37
tpgf| | 2023-5-15 17:26 | 只看该作者
即便是可以更改 可是这个哪里可以改 哪里不能改 也得详细斟酌一下

使用特权

评论回复
38
guanjiaer| | 2023-5-16 09:09 | 只看该作者
sram3的等待时间是只能设置为1wait还是说最少设置为1wait啊

使用特权

评论回复
39
heimaojingzhang| | 2023-5-16 10:29 | 只看该作者
是不是所有单片机的启动文件都是纯汇编文件呢

使用特权

评论回复
40
keaibukelian| | 2023-5-16 11:26 | 只看该作者
heimaojingzhang 发表于 2023-5-16 10:29
是不是所有单片机的启动文件都是纯汇编文件呢

好像是的  基本上所有厂家的 据我了解都是使用的汇编语言

使用特权

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

本版积分规则