stm32启动过程(以F1为例)

文章目录

  • STM32启动模式
  • STM32启动过程(以内部flash启动为例)
    • 启动文件功能
    • 启动文件常用汇编指令及说明

STM32启动模式

M3/M4/M7等内核复位后,做的第一件事:

  1. 从地址 0x0000 0000 处取出 堆栈指针 MSP 的初始值,该值为栈顶地址
  2. 从地址 0x0000 0004 处取出程序计数器指针 PC 的初始值,该值是复位向量(Reset_Hander)

通过BOOT0和BOOT1两个引脚的输入选择启动模式
在系统复位后,sysclk的第4个上升沿,BOOT引脚的值将被锁存(锁存后该引脚的值改变不影响已选择模式)

启动模式选择引脚 启动模式 0x0000 0000

映射地址

0x0000 0004

映射地址

BOOT1 BOOT0
x 0 主内存存储器 0x0800 0000 0x0800 0004
0 1 系统存储器 0x1FFF F000 0x1FFF F004
1 1 内置SRAM 0x2000 0000 0x2000 0004

STM32三种启动模式对应的存储介质均是芯片内置的,它们是:

  1. 用户闪存 = 芯片内置的Flash。从用户闪存启动,这是正常的工作模式。
  2. SRAM = 芯片内置的RAM区,就是内存啦。从内置SRAM启动,这种模式可以用于调试
  3. 系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。 从系统存储器启动,这种模式启动的程序功能由厂家设置。

STM32启动过程(以内部flash启动为例)

总体概述:
stm32启动过程(以F1为例)_第1张图片

启动文件功能

启动文件由汇编编写,是系统上电复位后第一个执行的程序。
启动文件主要做了以下工作:

  1. 初始化堆栈指针 SP = _initial_sp (从 0x8000 0000 获取)
  2. 初始化程序计数器指针 PC = Reset_Handler (从 0x8000 0004 获取)
  3. 设置堆和栈的大小 Heap_Size(堆)、Stack_Size(栈)
  4. 初始化中断向量表
  5. 配置外部 SRAM 作为数据存储器(可选)
  6. 配置系统时钟,通过调用 SystemInit 函数(可选)
  7. 调用 C 库中的 _main 函数初始化用户堆栈,最终调用 main 函数

启动文件常用汇编指令及说明

指令名称 作用
EQU 给数字常量取一个符号名,相当于 C 语言中的 define
AREA 汇编一个新的代码段或者数据段
ALIGN 编译器对指令或者数据的存放地址进行对齐,一般需要跟一个立即数,缺省表示 4 字节对齐。要注意的是,这个不是 ARM 的指令,是编译器的,这里放到一起为了方便。
SPACE 分配内存空间
PRESERVE8 当前文件堆栈需要按照 8 字节对齐
THUMB 表示后面指令兼容 THUMB 指令。在 ARM 以前的指令集中有 16 位的THUMBM 指令,现在 Cortex-M 系列使用的都是 THUMB-2 指令集,THUMB-2
EXPORT 声明一个标号具有全局属性,可被外部的文件使用
DCD 以字节为单位分配内存,要求 4 字节对齐,并要求初始化这些内存
PROC 定义子程序,与 ENDP 成对使用,表示子程序结束
WEAK 弱定义,如果外部文件声明了一个标号,则优先使用外部文件定义的标号,如果外部文件没有定义也不会出错。要注意的是,这个不是 ARM 的指令,是编译器的,这里放到一起为了方便。
IMPORT 声明标号来自外部文件,跟 C 语言中的 extern 关键字类似
LDR 从存储器中加载字到一个存储器中
BLX 跳转到由寄存器给出的地址,并根据寄存器的 LSE 确定处理器的状态,还要把跳转前的下条指令地址保存到 LR
BX 跳转到由寄存器/标号给出的地址,不用返回
B 跳转到一个标号
IF,ELSE,ENDIF 汇编条件分支语句,跟 C 语言的类似
END 到达文件的末尾,文件结束

你可能感兴趣的:(stm32,stm32,单片机,嵌入式硬件)