STM32H562----------启动时钟分析
1、H562启动过程分析
1.1、启动模式
复位方式有三种:上电复位、硬件复位和软件复位。当产生复位后,离开复位状态后 CM33 内核做的第一件事就是
读取堆栈指针 MSP 的初始值及程序计数器指针 PC 的初始值:
1、从地址 0x0000 0000 处读取出堆栈指针 MSP 的初始值,该值即栈顶地址;
2、从地址 0x0000 0004 处读取程序技术器指针 PC 的初始值,该值指向复位后执行的第一条指令;
启动模式选择即将 0x0000 0000 和 0x0000 0004 两个地址重映射到其它地址空间;
对于 H562 系列 TrustZone 功能是否关闭启动模式不一样,如下图:
由上图可知,STM32H5 的启动地址是由 BOOT0 引脚电平状态和 NSBOOTADD[31:8] 或 SECBOOTADD[31:8]
选项字节共同决定的,它们总共可以分为 4 个组合,下面以关闭 TrustZone 为例:
1、产品在 Open 的情况下,BTTO 引脚电平为低电平时,启动地址由用户选项字节 NSBOOTADD[31:8] 来决定
ST 出厂默认的启动地址为 0x0800 0000;
2、产品状态在任意模式下,BOOT0 引脚电平为高时,用户选项字节 NSBOOTADD[31:8] 此时不起作用,启动
地址在 ST 官方的 Bootloader 程序开始启动,此时可以用 ST 官方默认的接口,如:USART、I2C 等下载程序
3、产品状态在 Provisioning 的情况下,此时 BOOT0 引脚和用户选项字节 NSBOOTADD[31:8] 不起作用,程序从
RSS(根安全服务)启动。
4、产品状态在 Provisioned、Closed、Locked 的情况下,BOOT0 引脚电平为低电平时,启动地址由用户选项
字节 NSBOOTADD[31:8] 来决定,ST 出厂默认的启动地址是 0x0800 0000。
1.2、启动文件分析
STM32 启动文件由 ST 官方提供,在官方的 STM32Cube 固件包里,对于 STM32H562 系列芯片的启动文件,选用的
是 startup_stm32h562xx.s 文件。启动文件使用汇编编写,是系统上电复位后执行的第一个程序;
启动文件中的一些指令:
EQU: 将一个标识符与一个固定值或表达式绑定,相当于C语言中的define
AREA: 用于定义代码或数据的内存区域(段)
SPACE: 用于在内存中分配指定大小的未初始化空间
PRESERVE8: 当前文件堆栈需要按照8字节对齐
THUMB: 表示后面指令兼容THUMB指令
EXPORT: 声明一个标号具有全局属性,可被外部的文件使用
DCD: 以字节为单位分配内存,要求4字节对齐,并要求初始化这些内存
PROC: 定义子程序,与ENDP成对使用,表示子程序结束
WAEK: 弱定义,若外部文件声明了一个标号,则优先使用外部文件定义的标号,若外部文件没有定义也不会出错需注意的是:该指令不是ARM的指令,是编译器的。
IMPORT: 声明标号来自外部文件,跟C语言中的extern关键字类似
LDR: 从内存中将数据读取到寄存器
BLX: 跳转到由寄存器给出的地址,并根据寄存器的LSE确定处理器的状态,还要把跳转前的下条指令地址保存到LR
BX: 跳转到由寄存器/标号给出的地址,不用返回
B: 将程序计数器(PC)的值修改为目标地址
IF,ELSE,ENDIF: 汇编条件分支语句
END: 到达文件结尾,文件结束
1、栈空间初始化
栈初始化源码如下图:
含义:定义一个大小为 0x0000 0800(2KB)的栈空间,段名为 STACK,NOINIT:不初始化;
READWRITE:可读可写;ALIGN=3:按照 2^3=8 字节对齐;
SPACE 分配内存指令,分配大小为 Stack_Size 字节连续的存储单元给栈空间;
_initial_sp:标记初始栈顶地址(标签)
栈主要用于存放局部变量,函数形参等,属于编译器自动分配和释放的内存,栈的大小不能超过内部 SRAM 的大小;
若工程的程序量比较大,定义的局部变量比较多,那么就需要在启动代码中修改栈大小,即修改 S