历史上的今天
今天是:2025年08月14日(星期四)
2018年08月14日 | STM32启动过程与向量表
2018-08-14 来源:eefocus
一.首先看一下一个典型的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()函数。
上一篇:STM32启动过程解读与跟踪验证
史海拾趣
|
开关电源变压器铁芯磁滞回线测量-part1开关电源原理与设计(连载59) 2-1-1-9.开关电源变压器铁芯磁滞回线测量 现代电子设备对电源的工作效率和体积以及安全要求越来越高,在开关电源中决定工作效率和体积以及安全要求的诸多因素,基本上都与开关变压器有关,而与开关变压器技术性能相关最大的要算是变压器的铁芯材 ...… 查看全部问答> |
|
我用STC单片机测量频率(0-26HZ).频率信号由外部中断1—INT1引进,采用下降沿触发方式,由TIMER1测量两个下降沿之间的时间。我写的程序只能测量1—3HZ的,频率再高一点就乱跳 下面是我的代码。主程序应该没什么问题,已经调好久了,就是找不出原因 ...… 查看全部问答> |
|
ST原装的FlashLoaderv1.2怎么只提供了COM1和COM2选择? 这是很不方便的,有很多用笔记本电脑的没有COM1和COM2,都用USB转出来的串口,一般都在串口4以上,建议ST把可用的 ...… 查看全部问答> |
|
问题有两个: 1。 为什么xint1的中断函数中要再次使能group1中断(下面代码中①)和总中断使能(下面代码中②)即使没有关闭中断(DINT)?其它的比如TIMER1,PWM,CAPTURE等中断则不需要在服务程序中再次使能 2。进入XINT1中断后,程序总是跑飞?? ...… 查看全部问答> |




