目录
STM32系统启动流程概述如下:
1. 上电与复位
- 当STM32微控制器上电或发生复位时,CPU从固定的复位向量地址(对于大多数STM32型号,通常是0x08000000)开始执行代码。
2. 复位中断处理
- 复位向量地址处的代码是由STM32官方提供的或用户自定义的启动代码,通常位于汇编源文件(例如`startup_stm32f103xe.s`)。这段代码主要负责初始化堆栈指针(SP)和程序计数器(PC),并跳转至C语言环境下的初始化函数。
3. 系统初始化
- 启动代码继续执行必要的最低层硬件初始化,包括:
- 设置中断向量表。
- 配置内部高速时钟(HCLK)、低速时钟(LSI/LSE)以及系统时钟(SYSCLK)。
- 初始化NVIC(Nested Vectored Interrupt Controller)。
- 初始化堆栈(Stack)。
- 初始化静态存储区(.data段)的内容,将 flash 中已经初始化的数据拷贝到相应的 SRAM 区域。
- 清零未初始化的数据段(.bss段)。
4. 配置外设
- 如果使用的是HAL库或标准库,此时还会进一步配置通用外设如GPIO、USART、TIM等。
5. C++全局对象构造
- 若项目中使用了C++,则在此阶段会执行全局对象的构造函数。
6. 运行C/C++应用程序
- 完成所有基本初始化之后,启动代码会调用`main()`函数,标志着C/C++应用程序正式开始执行。
7. 多种启动模式
- STM32允许用户通过BOOT引脚或其他配置寄存器设置不同的启动模式:
- **主闪存(Main Flash)**:默认情况下,从内置闪存中加载并执行程序。
- **系统存储器(System Memory)**:用于特定的引导加载程序或通过串行通信接口(如UART或USB DFU)更新固件。
- **SRAM**:可以从SRAM启动,通常用于调试或固件更新后的临时执行。
总之,STM32启动流程的核心目标是从硬件层面初始化微控制器,并最终跳转至用户应用程序的主体部分,即`main()`函数开始执行。这个过程中涉及了大量的底层硬件初始化以及可能的固件加载操作,以确保微控制器能够在安全稳定的环境中运行应用程序。