【单片机】STM32的启动流程(Keil)

观察启动文件:

1、分配堆栈,设置栈顶地址和堆的开始地址和结束地址

2、保持堆栈8字节对齐,设置使用的指令集

3、建立中断向量表

注意:__initial_sp是栈顶地址,DCD表示分配一个4字节空间,所以Reset_Handler的地址就是0x08000004,0x08000000作为程序的第一个地址保留,实际存的是栈顶的地址。(0x08000000由链接器的参数IROM1决定,就是这个:)

4、具体的复位中断函数该怎么处理

在Reset_Handler处理函数里运行SystemInit配置系统时钟,然后运行__main,在__main里初始化堆栈和初始化映像文件,将RW-data的数据复制到RAM中,然后跳转到用户的main函数里。

5、别的各种中断处理程序,不过都是WEAK性质,用户可以重定义。

6、定义用不用MicroLIB的判断

所以STM32的启动流程是,上电,CPU的时序逻辑电路完成两件事:1、将0x08000000存放的栈顶地址放入SP,0x08000004存放的复位中断处理函数的地址放入PC程序计数器,然后进入复位中断,在Reset_Handler里初始化,然后跳转main函数。

如果后面还有IAP的,IAP就是直接跳转到后面程序的Reset_Handler,这次中断向量表里存放的就是相应中断处理函数的地址。新Reset_Handler处理函数里跳转到新main函数,第一时间修改SCB->VTOR寄存器,这里面存放的就是中断向量表的偏移量。在新程序里发生中断,PC指针跳转到新的中断向量表处,找到对应的中断向量表,根据里面的地址跳转到相应的中断处理函数。

相关推荐
不做无法实现的梦~11 小时前
86步进电机和DM860H驱动器的使用方法和记录
单片机·嵌入式硬件
Aaron158811 小时前
RFSOC+VU13P/VU9P+GPU多通道同步一体化解决方案
人工智能·嵌入式硬件·算法·matlab·fpga开发·硬件架构·基带工程
所见即所得1111112 小时前
stm32烧录过程中串口问题(串口被占用无法使用)
stm32·单片机·嵌入式硬件
Freak嵌入式12 小时前
WIZnet-EVB-Pico2开始,用MicroPython玩转以太网开发
arm开发·人工智能·python·嵌入式硬件·机器人·嵌入式·micropython
Ligocious12 小时前
stm32---1.两种开发方式点亮LED
stm32·单片机
黑白园12 小时前
STM32F103C8TC使用ST-Link下载
stm32·单片机·嵌入式硬件
时空自由民.13 小时前
嵌入式MCU的中断系统工作流程及其原理
单片机·嵌入式硬件
LCG元13 小时前
STM32实战:基于STM32F103的智慧教室环境监控系统(CO₂+光照+人数统计)
前端·stm32·嵌入式硬件
振南的单片机世界13 小时前
推挽输出:上管推、下管拉,驱动强但不“合群”
arm开发·stm32·单片机·嵌入式硬件
森利威尔电子-14 小时前
森利威尔SL7140|2.5–24V 宽压 / 10mA–2A / PWM 调光 线性 LED 恒流驱动
单片机·嵌入式硬件·集成电路·芯片·电源芯片