【嵌入式学习笔记】嵌入式基础9——STM32启动过程

这篇具有很好参考价值的文章主要介绍了【嵌入式学习笔记】嵌入式基础9——STM32启动过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.MAP文件浅析

1.1.MDK编译后生成的中间过程文件

【嵌入式学习笔记】嵌入式基础9——STM32启动过程,嵌入式学习专栏(STM32),学习,笔记,stm32

1.2.Map文件构成:

  1. 程序段交叉引用关系(Section Cross References):描述各文件之间函数调用关系
  2. 删除映像未使用的程序段(Removing Unused input sections from the image):描述工程中未用到被删除的冗余程序段(函数/数据)
  3. 映像符号表(Image Symbol Table):描述各符号(程序段/数据)在存储器中的地址、类型、大小等
  4. 映像内存分布图(Memory Map of the image):描述各个程序段(函数)在存储器中的地址及占用大小
  5. 映像组件大小(Image component sizes):给出整个映像代码(.o)占用空间汇总信息

1.3.与MAP相关的概念

名词 别称 解释 内存
Section / 程序段 /
RO(Read Only) data .constdata 只读数据 Flash(ROM)
RO(Read Only) code .text 只读代码 Flash(ROM)
RW(Read Write) .data 可写数据(定义了且初始化不为0) Flash(ROM)/SRAM
ZI(Zero initialized) .bss 定义了但没初始化(初始化为0) SRAM

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

2.STM32启动过程

2.1.STM32STM32启动模式(自举模式)

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

  1. 从地址 0x0000 0000 处取出堆栈指针 MSP 的初始值,该值就是栈顶地址
  2. 从地址 0x0000 0004 处取出程序计数器指针 PC 的初始值,该值是复位向量
  3. 芯片厂商可以会把0x0000 0000和0x0000 0004地址映射到其它的地址(如0x0800 0000和0x0800 0004
    【嵌入式学习笔记】嵌入式基础9——STM32启动过程,嵌入式学习专栏(STM32),学习,笔记,stm32
    启动模式选择表(STM32F1)
    (F4与其类似,FSMC可重映射到外部SRAM,F7/H7只有一个BOOT)
    【嵌入式学习笔记】嵌入式基础9——STM32启动过程,嵌入式学习专栏(STM32),学习,笔记,stm32

2.2.STM32启动过程(以Flash为例)

  • 初始化MSP,从0x0800 0000获取堆栈指针 MSP,此时会设置堆(Heap_Size)和栈(Stack_Size)的大小
  • 初始化PC,从0x0800 0004获取程序计数器指针PC,此时PC指向中断向量表(Reset Vector,既__Vector),在中断向量表中,第一条指令即是Reset_Handler
  • 在Reset_Handler函数中,会调用SystemInit函数(可选),并调用标准C库函数__mian()执行一系列设置,调用main函数
  • __main()函数的细节
    __scatterload():把RW/RO输出段从装载域地址复制到运行域地址,并完成了ZI运行域的初始化工作
    __rt_entry():完成库函数的初始化
    __user_setup_stackheap():初始化堆栈

【嵌入式学习笔记】嵌入式基础9——STM32启动过程,嵌入式学习专栏(STM32),学习,笔记,stm32

栈(Stack):编译器自动分配和释放,存放函数参数、函数调用、局部变量等
堆(Heap):程序分配和释放,如malloc、calloc、realloc等
函数局部变量较多,嵌套关系复杂时,需加大栈大小(Stack_Size)

Reset_Handler函数如下:

Reset_Handler   PROC								//PROC:定义子程序
													//WEAK:弱定义
                EXPORT  Reset_Handler   [WEAK]		//EXPORT:标明全局属性,可被外部调用
                IMPORT  __main						//IMPORT:申明来自外部文件,类extern
                IMPORT  SystemInit
                LDR   R0, =SystemInit
                BLX   R0               
                LDR   R0, =__main
                BX      R0
                ENDP								//ENDP:表示子程序结束

【注】Reset_Handler的作用:外部存储器配置;中断向量表地址配置。

【嵌入式学习笔记】嵌入式基础9——STM32启动过程,嵌入式学习专栏(STM32),学习,笔记,stm32

__main()参考链接:
【1】STM32 启动解析__main main
【2】MDK __main()代码执行过程分析
【3】【stm32】stm32深入思考(1) 之 系统启动流程 main之前的过程,__main作用,start.s作用文章来源地址https://www.toymoban.com/news/detail-617149.html

到了这里,关于【嵌入式学习笔记】嵌入式基础9——STM32启动过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式学习笔记——STM32的USART收发字符串及串口中断

    上一篇中,介绍了串口收发相关的寄存器,通过代码实现了一个字节的收发,本文接着上面的内容,通过功能函数实现字符串的收发,然后引入中断解决收发过程中while()死等的问题。 根据昨天的字符发送函数,只需要稍作修改即可实现发送函数了,一个字符串的结尾会有一

    2024年02月03日
    浏览(79)
  • 嵌入式学习笔记——STM32的USART相关寄存器介绍及其配置

    上一篇中,对串口做了个概述,主要是介绍了串口通信的特征,异步串行全双工通信,然后就是结合串口的框图梳理了一下STM32中USART的配置流程以及发送接收数据的流程,本文将接着上篇的内容,对串口的寄存器做个介绍,然后实现一个简单的收发实验。 根据之前GPIO的经验

    2024年02月05日
    浏览(58)
  • 蓝桥杯嵌入式CT117E-M4学习笔记02-STM32G431RBT6芯片学习

    首先学习了解一下蓝桥杯嵌入式CT117E-M4开发板的主控芯片STM32G431RBT6,本文仅为个人学习成果总结,如有错误,恳请指正。 上图为STM32CubeMX选型界面,如图可以看出STM32G431RBT6具有以下特点和硬件集成。 采用Cortex-M4 32位RISC核心架构,工作频率最高可达170Mhz。 128kBytes的FLASH,32

    2023年04月09日
    浏览(63)
  • 嵌入式C语言基础(STM32)

    前言:一条混迹嵌入式3年的老咸鱼,想到自己第一次接触到stm32的库函数时,c语言稀碎,痛不欲生的场景,该文章为萌新指条明路。 位操作在嵌入式中常用于直接对芯片的寄存器进行操作,当时作为初学者的我看着一脸懵逼,至于为什么这样修改,下面好好分析一下。  一

    2024年02月02日
    浏览(59)
  • STM32的时钟系统(嵌入式学习)

    时钟是指用于计量和同步时间的装置或系统。时钟是嵌入式系统的脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作,外设部件在时钟的驱动下完成各种工作,例如:串口数据的发送、AD转换、定时器计数等。因此时钟对于计算机系统是至关重要的,通常时钟系

    2024年02月16日
    浏览(50)
  • STM32串口通信详解(嵌入式学习)

    时钟信号在电子领域中是指用于同步和定时电路操作的周期性信号。它在数字系统和通信系统中起着至关重要的作用,用于协调各个组件之间的数据传输和操作。 时钟信号有以下几个重要的方面: 频率:时钟信号的频率是指单位时间内信号周期的数量。它通常以赫兹(Hz)为

    2024年02月09日
    浏览(69)
  • STM32的中断系统详解(嵌入式学习)

    中断是处理器中的一种机制,用于响应和处理突发事件或紧急事件。当发生中断时,当前正在执行的程序会被暂时中止,处理器会跳转到中断处理程序(也称为中断服务例程),对中断事件进行处理。处理完中断后,处理器再返回到被中断的程序继续执行。 中断可以分为内部

    2024年02月12日
    浏览(73)
  • 嵌入式-stm32重要基础知识(及踩过的坑)

    1、固件库: 固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道, 向上提供用户函数调用的接口(API)。 2、CMSIS标准与固件库的关系 就是对固件库函数的要求。 ARM 公司为了能让不同的芯片公司生产的 Cortex-M3 芯片能在软件上基本兼容,和芯片生产商

    2024年02月04日
    浏览(60)
  • STM32的定时器详解(嵌入式学习)

    想要了解STM32的时钟系统 点击这里跳转——》STM32的时钟系统(嵌入式学习) 建议先看看时钟树如何配置 点击这里跳转——》STM32的时钟树配置(嵌入式学习) 跳转——》STM32的时钟基础详解(嵌入式学习) 跳跳转——》STM32的时钟源详解(嵌入式学习) SysTick又称滴答定时

    2024年02月13日
    浏览(70)
  • STM32&ARM体系结构(嵌入式学习)

    STM32是意法半导体(STMicroelectronics)公司推出的一系列32位ARM Cortex-M微控制器(MCU)产品系列。它们基于ARM架构,并且具有广泛的应用领域,包括工业自动化、消费电子、医疗设备、通信、汽车电子等。 STM32系列提供了多个产品系列,以满足不同应用需求和性能要求。其中常见

    2024年02月08日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包