STM32启动过程与向量表

本文详细解析了STM32微控制器的启动过程,包括二进制文件结构、中断向量表布局、启动汇编文件内容及分散加载文件配置等。通过理解这些关键组件的作用,读者能够更好地掌握STM32如何从上电到执行用户代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

	今天理了一下arm处理器的启动过程,发现以前对Cortex-M3的启动过程有所误解,Cortex-M3的启动过程与ARM7/ARM9并不一样。

一.首先看一下一个典型的STM32程序的二进制文件:


注意开始地址的前2“字”,0x2000870,0x08000635.

二.在工程文件里,进入debug模式,点击 “RET”复位


发现MSP就是程序文件的第一个32bit内容,PC则是下一个32bit内容。注意0x08000635与0x08000634:加载到 PC 的数值是奇数( LSB=1) ,表明这是在
Thumb 状态下执行,因为Cortex-M3处理器不能执行ARM指令;另一方面, CM3 中的指令至少是半字对齐的,所以 PC 的 LSB 总是读回 0。

三.再看下STM32的启动文件下的中断向量表


事实上,可以明显地看出,STM32程序的文件的开始地址位置就是存放了这个中断向量表。

四.stm32的启动汇编文件中

                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size

__Vectors       DCD     __initial_sp              ; Top of Stack
                DCD     Reset_Handler             ; Reset Handler
代码本身只是定义一个代码段,而负责将它定位在绝对零位置的是分散加载文件(.sct)。

LR_IROM1 0x08000000 0x00010000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00010000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00005000  {  ; RW data
   .ANY (+RW +ZI)
  }
}
可以看到 RESET 段被定位到0x08000000+0位置。


五.现在可以理清STM32的启动过程了:1.上电后,STM32根据BOOT0/BOOT1的状态设置启动地址(例如BOOT0=0则将主存储器地址0x08000000设为启动地址);2.从启动地址读MSP与PC,程序通过此PC跳至复位中断Reset_Handler。3.这时程序才真正开始;Reset_Handler中断程序可自由编写,但是

 LDR     R0, =__main
         BX      R0
这句通常少不了(除非你自己花时间写)。__main是一个库函数,这个函数为STM32做了很多准备工作例如RO/RW的搬运,ZI清零,堆栈初始化,最后跳转到真正的用户main()函数。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值