一文带你搞懂STM32的启动过程

1. Cortex-M系统架构

1.处理器核心: Cortex-M3
2.存储器系统: Flash,SRAM,FSMC等

3.总线接口

总线矩阵:总线矩阵是一种硬件结构,用于连接处理器核心、内存和外设等主要组件。
AHB总线:AHB是一种高性能总线,用于连接处理器核心和高带宽外设,如存储器控制器和DMA(Direct Memory Access)控制器等。AHB总线通过总线矩阵与处理器核心和其他高性能组件进行连接。

APB:APB1和APB2是两种低功耗外设总线,用于连接处理器核心和低带宽外设,如串口通信接口、定时器和I/O控制器等。

APB2负责的外设 AD,I/O,高级TIM,串口1。
APB1负责的外设 DA,USB,SPI,I2C,CAN,串口2345,普通TIM,PWR==

4.外设接口 :Cortex-M处理器通过外设接口与外部设备进行通信,如通用输入输出(GPIO)、串行通信接口(UART/SPI/I2C)和定时器等。

5.DMA: DMA代表Direct Memory Access(直接内存访问)允许外围设备直接与系统内存进行数据传输,而无需处理器的干预。

6. 中断控制器

7. 电源管理单元: 用于实现低功耗操作。它可以对处理器和外部设备进行动态电源管理,以最小化能量消耗并延长电池寿命。

2. STM32F1和F4的区别

内核不同:F1是Cortex-M3内核,F4是Cortex-M4内核;
主频不同:F1主频72MHz,F4主频168MHz;
浮点运算:F1无浮点运算单位,F4有;
功能性能:F4外设比F1丰富且功能更强大,比如GPIO翻转速率、上下拉电阻配置、ADC精度等;
内存大小:F1内部SRAM最大64K,F4有192K(112+64+16)。

3. 启动流程

1. Boot引脚设定,设置启动模式,寻找初始的地址。 (闪存是0x0800000,系统存储器是0x1FFFF000,SRAM是0x20000000)。

    启动模式只决定程序烧录的位置 加载完程序之后会有一个重映射(映射到0x00000000地址位置);值得注意的是STM32上电复位以后,代码区都是从0x00000000开始的,三种启动模式只是将各自存储空间的地址映射到0x00000000中。

2. 设置堆栈

  •     定义了堆栈大小,分配了相应的空间。
  •     栈顶指针_initial_sp,堆的起始地址heap_base和结束地址heap_limit定义。
  •     先栈再堆。
  • 3. 定义中断向量表

  • 向量表是在芯片复位时会被加载到内存地址0处,用于存放异常处理函数的入口地址。
  • 向量表中定义了复位、NMI、硬件故障、内存管理单元故障、总线故障、使用错误等异常处理函数的入口地址。
  • 向量表还包含了外部中断处理函数的入口地址。
  • 4. 执行Reset_Handler复位处理函数

  • Reset_Handler 是复位时的处理函数,在芯片复位时会被调用。
  • 该函数首先调用 SystemInit 完成系统的初始化工作,然后跳转到 __main 函数
  • 5. 执行__main函数

  •    异常处理函数的定义,首先这些函数是无限循环的,定义了各种异常处理函数的入口地址
  •    用户堆栈的初始化
  •  6. 执行用户的主函数

    面试问题

    1.STM32启动过程

       1.设置boot引脚,选择启动模式,将对应区域的存储空间映射到0x00000000中。

       2. 设置堆栈大小,定义栈的起始地址,堆的起始地址以及结束地址

       3.定义中断向量表,定义了复位、NMI、硬件故障、内存管理单元故障、总线故障、使用错误等异常处理函数的入口地址。

       4.执行Reset_Handler复位处理函数,调用SystemInit函数完成系统的初始化函数并跳转到__main函数。

      5.执行__main函数,进行异常处理函数的定义,完成用户堆栈的初始化。

      6. 执行用户的主函数。

    2.STM32有哪几种启动方式?

        STM32总共有三种启动方式,boot1为X,boot0为0为从Flash启动,boot1为0,boot0为1为从系统存储器启动,boot1为1, boot0为1为从SRAM启动。从Flash启动是正常的工作模式,从SRAM启动是用于调试的模式,至于从系统存储区启动,这种启动模式的程序功能由厂家设置。

    作者:炒 蛋

    物联沃分享整理
    物联沃-IOTWORD物联网 » 一文带你搞懂STM32的启动过程

    发表回复