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启动过程(内部FLASH启动为例)

在这里插入图片描述

启动文件介绍

  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时钟系统

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

在这里插入图片描述
时钟源、锁相环:HAL_RCC_OscConfig()
系统时钟、总线:HAL_RCC_ClockConfig()
使能外设时钟:__HAL_RCC_PPP_CLK_ENABLE()
扩展外设时钟(RTC/ADC/USB):HAL_RCCEx_PeriphCLKConfig()

F407

在这里插入图片描述

  • 32
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饼干饼干圆又圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值