STM32启动过程

了解了启动过程,就可以自己制作BootLoader,这主要是为了方便使用IAP方式对系统进行远程升级。

3种启动方式
在这里插入图片描述
对于用户代码来说,只需要考虑从Flash启动和从SRAM启动两种情况。

默认情况下(00),从Flash启动,中断向量表从Flash的起始地址(0x08000000)开始存放。同时映射到0x00000000处。向量表偏移寄存器(VTOR)的值为0x00000000(实际映射到0x08000000)。

若从SRAM启动(01),中断向量表还是存放在Flash中(Flash才能固化存储,SRAM只能加电才有效),只不过拷贝到SRAM的首地址0x20000000处。

无论用哪种模式启动,复位时栈顶指针MSP总能在0x00000000(或0x08000000)处找到,而复位向量(程序计数器PC)总能在0x00000004(或0x08000004)处找到。

举例
从0x00000000处,取出1个字(32位,4个字节),为0x20000FC0,是堆栈指针SP的值。

从0x00000004处,取出1个字(32位,4个字节),为0x08000421,而PC指针读回0x08000420

它把末位的1变成了0,这个是由于内存对齐造成的,因为cortex-m3核PC的LSB一定读回0,因此指令至少是半字对齐的(《cortex-m3编程手册》)。

我理解的MSP和PC,类似于两个工具,启动单片机,不是直接找到要执行的代码(Z子弹),而是先要找到手枪和弹夹。也类似于电机中的无功功率,虽然不做功,但是不可或缺。

现在有了0x08000420地址,找到里面的值。根据PC的值找到复位中断处理函数Reset_Handler。
在这里插入图片描述
执行LDR R0,=SystemInit 之后,程序跳转到SystemInit 函数。
它主要负责开启外部晶振,设置了PLL,disable了所有中断,设置了时钟为32MHz,并且重定位中断向量表在0x08000000处。
详细点:允许HSE(外部时钟),FLASH(允许预取缓冲区,设置2个等待周 期),PLL系数为9,开启PLL并选择PLL输出作为时钟源(SYSCLK),后续设置SYSCLK = HCLK = APB2 = 72MHz,APB1 = HCLK/2 = 36MHz,HCLK即AHB的时钟。

SystemInit 函数结束后,用同样的方式调用C/C++标准实时库的__main函数,进行了一些处理后,调用main函数,进入C语言环境。

这个处理包括以下四点:

1.完成全局/静态变量的初始化工作

2.初始化堆栈

3.库函数的初始化

4.程序的跳转,进入main()函数。

以上内容部分摘自以下网址
https://www.cnblogs.com/jiangzhaowei/p/9240238.html
https://blog.csdn.net/jiejiemcu/article/details/80542667
https://blog.csdn.net/sijinxiaotongxue/article/details/81153509

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值