您现在的位置是:首页 >技术杂谈 >【STM32】基础知识 第九课 STM32启动网站首页技术杂谈

【STM32】基础知识 第九课 STM32启动

我是小白呀 2023-06-20 00:00:02
简介【STM32】基础知识 第九课 STM32启动

MAP 文件

MAP 文件是 MDK 编译代码后, 产生的集程序, 数据及 IO 空间的一种映射列表文件. 简单来说就是包括了: 各种 .c 文件, 函数, 符号等的地址, 大小, 引用关系等信息.

MAP 作用:

  • 分析各 .c 文件占用的 FLASH 和 RAM 的大小, 方便优化代码

STM32启动

MAP 文件浅析

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

MAP 文件组成

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

atk_f103.map 文件

截取 (部分):

Image component sizes


      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Object Name

       196          0          0          0          2       2374   delay.o
       170          0          0          4          0       1883   main.o
        64         26        304          0       1536        920   startup_stm32f103xe.o
       158          0          0          5          4       6082   stm32f1xx_hal.o
       186          0          0          0          0       8823   stm32f1xx_hal_cortex.o
       282          0          0          0          0       8255   stm32f1xx_hal_dma.o
       494         20          0          0          0       4600   stm32f1xx_hal_gpio.o
      1258          0         18          0          0       7600   stm32f1xx_hal_rcc.o
       624          0          0          0          0      19043   stm32f1xx_hal_uart.o
        20          0          0          0          0       1151   stm32f1xx_it.o
        90          0          0          0          0       3712   sys.o
         2          0         16          4          0       1716   system_stm32f1xx.o
       160          0          0          0        267       6817   usart.o

    ----------------------------------------------------------------------
      3746         46        370         16       1816      72976   Object Totals
         0          0         32          0          0          0   (incl. Generated)
        42          0          0          3          7          0   (incl. Padding)

    ----------------------------------------------------------------------

启动模式

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

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

STM32 启动模式 (F1)

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

启动模式选择引脚 BOOT1启动模式选择引脚 BOOT2启动模式0x0000 0000 映射地址0x0000 0004 映射地址
X0主闪存存储器0x0800 00000x0800 0004
01系统存储器0x1FFFF 00000x1FFF F004
11内置 SRAM0x2000 00000x2000 0004

如果要使用 FSMC 重映射到外部的 SRAM: 可以通过配置 SYSCFG_MEMRMP 寄存器.

启动模式选择 BOOT启动地址选项字节启动模式
0BOOT_ADD0[15:0]由用户选项字节 BOOT_ADD0[15:0] 决定启动地址, ST 出厂默认的启动地址为: 位于 0x0020 0000 的 ITCM 上的 FLASH
1BOOT_ADD1[15:0]由用户选择字节 BOOT_ADD[15:0] 决定启动地址, ST 出厂默认的启动地址为: 位于 0x0010 0000 的系统存储器地址

选项字节允许将自举存储器地址配置为从 0x0000 0000 到 0x3FFF 0000 的任意地址, 其中低 16位只能位 0.

STM32 启动过程

  1. Reset
  2. 获取 MSP 值: 0x0800 0000
  3. 获取 PC 值: 0x0800 0004
  4. Reset_Handler
  5. 启动文件: startup_stm32xxx.s
  6. main 函数

启动文件介绍

  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).

出处: 笔记摘自正点原子

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。