一文看懂Stm32程序结构和启动过程

Stm32程序启动过程分析

程序在Flash的结构

使用Keil编译程序后,程序分为4部分:
在这里插入图片描述

  1. Code:代码区,指程序中代码即函数体的大小,注意程序中未使用的函数也会算在CODE中,也即会占用FLASH空间,因此不用的函数最好删除掉,以免占用过多FLASH空间;
  2. RO-data:RO就是只读的意思,程序中只读的变量(也就是带Const的)和已初始化的字符串等;
  3. RW-data:特指已初始化的可读可写全局/静态变量;
  4. ZI-data:未初始化的可读可写全局/静态变量,注意初始化为0也算做未初始化,用到的堆空间和栈空间也会被算入这里面;

根据生成的*.map 文件:
在这里插入图片描述
可看出Load(下载后没有运行)和 Execution(程序正常运行)下固件的内存映射:
其中Code和RO-data对应RO section,RW section为RW-data,ZI section为ZI-data。
在这里插入图片描述
各部分Size情况在*.map文件中有统计:
在这里插入图片描述

启动过程

启动方式

因为固定的内存映射方式,代码区域总是从0x00000000开始,数据区域(SRAM)总是从0x20000000开始,在STM32F4xx系列芯片中,有三种boot 模式,通过BOOT[1:0]引脚选择:
在这里插入图片描述
同时,将0x00000000映射到相应的启动位置的物理地址。例如从Flash memory启动时,会将0x00000000映射到0x08000000。
在这里插入图片描述

启动过程

  1. 根据BOOT[1:0]确定启动方式,例如从Flash memory启动;
  2. 取出0x0000_0000(0x0800_0000)的栈指针和0x0000_0004(0x0800_0004)处的PC指针;
    在这里插入图片描述
    栈顶地址可以在*.map 文件中找到 0x2000_0298 + 0x0000_0400。
    在这里插入图片描述
    Reset_Handle的入口地址可以在*.map中找到。
    在这里插入图片描述
  3. 根据Startup*.s文件定义的复位函数,执行SystemInit和__main函数。
; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main

                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP
  1. SystemInit函数可以在*.c文件中找到,不在赘述,比较重要的是__main()函数,该函数通过调用__scatterload_copy实现RW section的拷贝,__scatterload_zeroinit实现ZI section的初始化;
  2. 初始化堆和栈,而后SRAM结构如下图所示:
    在这里插入图片描述
  3. 进入main函数,程序正常运行后,如下图所示。
    在这里插入图片描述

参考:
https://blog.csdn.net/ybhuangfugui/article/details/75948282
https://www.cnblogs.com/39950436-myqq/p/11387179.html

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
STM32F103是意法半导体(STMicroelectronics)推出的一款32位单片机系列,属于Cortex-M3内核。下面是一份简要的说明,帮助你了解STM32F103。 1. 内核架构:STM32F103采用ARM Cortex-M3内核,具有较高的性能和低功耗特性。它运行在最高72MHz频率下。 2. 存储器:STM32F103具有不同的存储器选项,包括闪存(Flash)和随机存取存储器(SRAM)。闪存用于存储程序代码和常量数据,SRAM用于存储变量和堆栈。 3. 外设:STM32F103拥有丰富的外设,包括通用定时器、串行通信接口(USART、SPI、I2C)、模数转换器(ADC)、通用输入输出引脚(GPIO)等。这些外设可用于实现各种应用,如控制、通信和传感器接口。 4. 开发环境:对于STM32F103的开发,你可以使用ST提供的官方开发工具——STM32CubeIDE,它是基于Eclipse的集成开发环境。此外,你还可以使用其他第三方软件,如Keil MDK或IAR Embedded Workbench。 5. 编程语言:你可以使用C/C++编程语言进行STM32F103的开发。ST提供了丰富的库函数和示例代码,方便开发者快速上手。 6. 资源:为了更好地了解STM32F103,你可以参考ST官方的技术文档、数据手册和应用笔记。此外,CSDN等网站上也有很多关于STM32F103的教程和案例供你学习参考。 需要注意的是,上述信息只是对STM32F103的一个简要介绍,如果你希望深入了解它的特性和开发方法,建议你查阅更多资料并进行实际的开发练习。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驯服每一头怪兽

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

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

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

打赏作者

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

抵扣说明:

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

余额充值