侧边栏壁纸
博主头像
thinkTV博主等级

喜爱动漫的二刺螈一枚,摩托车云爱好者(快要有车了)。 懂一点技术的在读生物医学工程研究生( •̀ ω •́ )✧,多多指教。

  • 累计撰写 128 篇文章
  • 累计创建 18 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

STM32启动过程浅析

thinkTV
2023-06-20 / 0 评论 / 0 点赞 / 337 阅读 / 591 字 / 正在检测是否收录...

1. MAP 文件

MDK编译过程文件(output文件夹中)

类型 介绍
.o 可重定向对象文件,每个.c/.s文件都对应一个.o文件
.axf 可执行对象文件,由.o文件链接生成,仿真的时候需要用到此文件
.hex INTEL Hex格式文件,用于下载到MCU运行,由.axf转换而来
.map 连接器生成的列表文件,对分析程序存储占用情况非常有用
其他 .crf、.d、.dep、.lnp、.lst、.htm、.build_log.htm等一般用不到

MAP文件概念和作用

  • MAP文件是MDK编译代码后,产生的集程序、数据及IO空间的一种映射列表文件,包括了:各种.c文件、函数、符号等的地址、大小、引用关系等信息
  • 用于分析各.c文件占用FLASH 和 RAM的大小,方便优化代码

图片-1687238432916

2. STM32启动过程

2.1 STM32启动模式(F1)

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

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

图片-1687244388042

在系统复位后,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存

图片-1687244465355

2.2 STM32启动过程

内部FLASH启动为例:

图片-1687245073562

Reset_Handler函数介绍

Reset_Handler   PROC
                EXPORT  Reset_Handler   [WEAK]
                IMPORT  __main
                IMPORT  SystemInit
                LDR   R0, =SystemInit
                BLX   R0               
                LDR   R0, =__main
                BX      R0
                ENDP

EXPORT:标明全局属性,可被外部调用
IMPORT:申明来自外部文件,类extern
PROC:定义子程序
ENDP:表示子程序结束
WEAK:弱定义
如果定义SystemInit但外部没有SystemInit函数,则会报错!!

启动文件介绍:

  1. 初始化MSP,从0X0800 0000获取
  2. 初始化PC,从0X0800 0004获取
  3. 设置堆栈大小,Heap_Size(堆)、Stack_Size(栈)
  4. 初始化中断向量表
  5. 调用初始化函数(可选)
  6. 调用__main,标准C库函数,执行一系列设置,最终调用main函数

堆栈简介

图片-1687245963569

函数局部变量较多,嵌套关系复杂时,需加大栈大小(Stack_Size)!

STM32启动过程图解

图片-1687246269756

0

评论区