STM32启动过程浅析

MAP文件浅析

MDK编译过程文件(11种)

  • .o:可重定向对象文件,每个.c、.s文件编译后都生成一个.o文件
  • .axf:可执行对象文件,由.o文件链接生成,仿真的时候需要用到此文件
  • .hex:INTEL Hex格式文件,用于下载到MCU运行,由.axf转换而来
  • .map:连接器生成的列表文件,对分析程序存储占用情况非常有用

MAP文件概念和作用

MAP文件是MDK编译代码后,产生的集程序、数据及IO空间的一种映射列表文件。

包括各种.c文件、函数、符号等的地址、大小、引用关系等信息

MAP文件组成

  • 程序交叉引用关心:描述各文件之间函数调用关系
  • 删除印象未使用的程序段:描述工程中未用到而被删除的冗余程序段(函数/数据)
  • 映像符号表:描述各符号(程序段/数据)在存储器中的地址、类型、大小等
  • 映像内存分布图:描述各个程序段(函数)在存储器中的地址及占用大小
  • 映像组件大小:给出整个映像代码(.o)占用空间汇总信息

STM32启动模式(自举模式)

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

  1. 从地址0x0000 0000处取出堆栈指针MSP的初始值,该值就是栈顶地址
  2. 从地址0x0000 0004处取出程序计数器PC的初始值,该值是复位向量
    在这里插入图片描述
    芯片厂商可能会把这两个地址映射到其它的地址!!

STM32启动模式(F1)

在系统复位后,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。
STM32启动过程浅析_第1张图片

STM32启动过程(内部FLASH启动为例)

STM32启动过程浅析_第2张图片

启动文件介绍

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

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:弱定义

堆栈简介

  • 栈(Stack):编译器自动分配和释放,存放函数参数、局部变量等
  • 堆(Heap):程序员分配和释放,如malloc、calloc、realloc等

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

STM32启动过程浅析_第3张图片
堆向上生长,栈向下生长

STM32时钟系统

在这里插入图片描述
时钟是具有周期性的脉冲信号,最常用的是占空比50%的方波。

STM32启动过程浅析_第4张图片
时钟源、锁相环:HAL_RCC_OscConfig()
系统时钟、总线:HAL_RCC_ClockConfig()
使能外设时钟:__HAL_RCC_PPP_CLK_ENABLE()
扩展外设时钟(RTC/ADC/USB):HAL_RCCEx_PeriphCLKConfig()

F407

STM32启动过程浅析_第5张图片

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