stm32启动文件的理解和对启动代码的叙述

首先我在上一章说明了启动模式的选择和原理

可以看这篇文章:

https://blog.csdn.net/m0_58168670/article/details/131061843?spm=1001.2014.3001.5501

《1》启动文件的主要工作:

        首先我们谈谈启动文件的主要工作是什么,首先设计了堆栈指针,赋值pc程序计数器,配置系统时钟,为了让芯片在正常的时钟系统下工作,第四步配置SRAM不需要了解,最后我们调用C库中的函数_main(),注意:这里的_main()函数不是我们工程里面的mian函数

 《2》启动过程的叙述:

 我打开了一个自己的工程代码,圈出了我们的启动文件,这就是我们的启动文件。

我们在上一章讲了,自己配置boot引脚,选择模式,不通模式重映射到基地址的空间都是不同的(这里主要将不同模式下的中断向量表重映射到基地址去),比如:这里我们选择Flash启动模式,我们就会将0x8000 0000这个地址映射到0x0000 0000去,硬件上电复位后,从基地址开始,赋值我们的PC和SP指针,然后执行我们的复位中断函数(详细过程可以看上一章)。

 进入复位中断函数以后,会调用我们SystemInit()函数,在这个函数里面我们就进行了时钟的配置,以及是否使用我们的SRAM(可选,一般不用),然后跳转到我们的_main()函数初始化,最终跳到我们的函数入口main()函数,就是我们任务的mian()函数。

 《3》启动代码内容详细叙述:  (这里是根据启动代码文件的详细叙述)

        首先:在启动代码里,我们定义了栈大小,但是这里是可以修改的,如果我们的程序内容多的话,这里我们需要调整栈空间的大小,栈空间主要做局部变量函数调用,和函数参数等。但是注意:这里申请空间的大小我们不能超过芯片内部的SRAM的大小。

        其次:我们给堆空间进行赋值,这里赋值的是0x0000 2000,堆空间主要是对于我们的内存的动态分配,比如我们malloc calloc realloc函数,或者我们C++中的new都是申请堆空间,

         再其次:这里是建立是中断向量表(记录了我们的中断函数入口地址),这里注意M3,M4内核的首地址不是中断服务程序,是堆栈指针,中断向量表是重映射在代码段的最前段(注意:我们选择启动方式以后,我们会将不同的地址重映射到首地址去,比如我们选择Flash的话,就重映射我们的0x8000 0000去了首地址)        

         最后:这里是 import加载两个外部声明,然后获取SystemInit函数地址,加载SystemInit函数配置系统定时器,然后获取_main()函数的地址,然后从_main()函数开始,最终跳转到我们的main函数,只有这个_main()函数存在,才会运行到我们任务程序的main函数去。(注意:这里的_main()函数是标准实时库中的初始化的子函数的入口地址,主要作用就是初始化堆栈)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值