1.根据boot引脚决定启动方式
启动方式由两个引脚决定,复位后,在 SYSCLK 的第四个上升沿锁存 BOOT 引脚的值。
BOOT0:专用启动引脚只用于BOOT启动方式的改变
BOOT1:启动引脚/GPIO双用途。该引脚在BOOT引脚数值锁存后用途转为GPIO
下面是三种方式的区别:
1.1 常规模式启动方式0+x
该方式下STM32内置FLASH起始地址被重映射在0x00000000地址,代码从该处开始执行。一般使用JTAG或SWD模式下载调试代码,使用该方式。
- 在此模式下,处理器会执行复位向量表中的复位地址,从而启动芯片。
- 芯片会执行各种初始化操作,包括时钟初始化、外设初始化等,然后跳转到用户定义的启动代码。
1.2 Bootloader模式 启动方式1+0
内置ROM将被映射到0x00000000地址,该地址有出场预置代码,该部分代码可起桥梁作用,通过USART/CAN/USB将代码写入STM32内置flash中,通常用于更新固件或通过外部接口加载新的程序。这种方式被称为ISP(In System Programing)烧录。
- 在此模式下,处理器会将启动地址设置为Bootloader的起始地址,而不是复位向量表中的复位地址。
- Bootloader负责检查外部接口是否有新的程序,如果有,则加载并启动新程序;否则,它会跳转到复位向量表中的复位地址。
1.3 系统内存模式启动方式1+1
从SRAM启动,SRAM的起始地址将被重映射到0x00000000地址,代码从该地址开始运行,该模式烧录不必擦写Flash,速度快,适合调试,但代码掉电丢失。
- 在此模式下,处理器会将启动地址设置为系统内存中的特定地址,而不是复位向量表中的复位地址。
- 系统内存包含一个特殊的Bootloader,它可以用于加载新的固件或执行其他恢复操作。
值得注意的是STM32上电复位以后,代码区都是从0x00000000开始的,三种启动模式只是将各自存储空间的地址映射到0x00000000中。
常规启动模式:
1、初始化堆栈指针 SP = _initial_sp
2、初始化程序计数器指针 PC = Reset_Handler
3、设置堆和栈的大小
4、初始化中断向量表
5、配置外部 SRAM 作为数据存储器(可选)
6、配置系统时钟,通过调用 SystemInit 函数(可选)
7、调用 C 库中的 _main 函数初始化用户堆栈,最终调用 main 函数
参考: