0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32的启动过程如何分析

汽车电子技术 来源:嵌入式之入坑笔记 作者: 嵌入式入坑笔记 2023-02-10 10:48 次阅读

本文分析STM32单片机从上电到运行的过程,目的在于了解STM32单片机从启动到运行的整个过程。

一般我们在使用STM32单片机的时候,都是使用官方提供的驱动文件,移植到自己即将要使用的工程中,移植完成之后再编写自己的逻辑代码,放到main( )函数中,就可以完美的运行起来了。相信很多的人都没有去关注过STM32从启动到运行这个过程都发生了什么,现在就简单分析一些这个过程。

本文以STM32F103为例进行分析。在官方给我们提供的启动文件中,将整个单片机的启动过程要做的事情都已经帮我们做好了,以至于我们在使用这款单片机的时候,几乎可以不会吹灰之力就可以运行起来。STM32F103的启动文件形如:

pYYBAGPlr7WAHISAAAAWykW-AdI267.png

根据不同的芯片容量,都有相对应的启动文件可供选择,实际使用根据芯片容量选择合适的启动文件即可。

启动文件的主要作用有:

1)设置栈

2)初始化 SP 指针

3)设置堆

4)复位中断服务函数

5)调用 SystemInit()函数来完成初始化工作

6)调用__main,该函数内部会调用 main()函数

1、设置栈

从启动文件中可以看到:

poYBAGPlr8OAFVOrAAFaSyci8hI412.png

上述代码中: 1)35行,将栈的大小设为0x00000400(即1024 = 1KB)。 2)37行,栈名称为STACK,不初始化,可读可写,8(2^3)字节对齐。 3)38行,分配一片连续的存储区域并初始化为 0,大小为0x400个字节。 4)39行,__initial_sp表示栈的结束地址,即栈顶地址,STM32中栈是由高地址向低地址生长。

2、设置堆

pYYBAGPlr86AcYjlAAEQ8AAMUJA021.png

上述代码中: 1)45行,将堆的大小设为0x00000200(即512B = 0.5KB)。 2)47行,栈名为HEAP,不初始化,可读可写,8(2^3)字节对齐。 3)48行,堆空间起始地址。 4)49行,堆空间:0x200个字节。 5)50行,堆空间结束地址。

3、对堆栈属性进行设置

poYBAGPlr_GAa5-TAAAaf4C3VUE644.png

1)PRESERVE8 指令指定当前文件保持堆栈八字节对齐。 2)告诉汇编器下面是32位的Thumb指令,如果需要汇编器将插入位以保证对齐。

4、设置中断向量表

poYBAGPlr_2ADLFEAAF8fMwZhoM566.png

1)57行,定义一块数据段,只可读,段名字是RESET。

2)58行,EXPORT:在程序中声明一个全局的标号__Vectors,该标号可在其他的文件中引用。

3)59行,在程序中声明一个全局的标号__Vectors_End。

4)60行,在程序中声明一个全局的标号__Vectors_Size。


之后的是中断的定义,可以分为两部分:

一部分是系统内部中断:

poYBAGPlsAuAal7TAADpCXTdOyM026.png

另一部分是外部中断:

poYBAGPlsBeAJr6EAAEsVhKGedY311.png

在之后是中断向量表的其他设置:

poYBAGPlsCKAND64AABEjYVDwlU902.png

1)142行,得到向量表的大小。

2)144行,定义一个代码段,可读,段名字是.text。

5、中断功能的定义

复位中断:

pYYBAGPlsC-AWQOMAADoK5Dz6uI969.png

1)149行,IMPORT:伪指令用于通知编译器要使用的标号在其他的源文件中定义。 2)150行,系统初始化。 3)151行,R0的值为SystemInit的地址。

4)152行,切换指令集,跳到SystemInit。 5)153行,R0的值为__main的地址。__main是库提供的函数。用于完成堆栈,堆的初始化等工作,还会调用__user_initial_stackheap。 6)154行,切换指令集,跳到__main,并且最终会跳转到main(),进入C语言运行环境。

6、用户栈和堆初始化

pYYBAGPlsDqAJbHUAACq2qiA0m0429.png

1)333行,如果勾选了micro lib,使用微库。 2)339行,没有勾选微库。

pYYBAGPlsEWAPJUDAAEI8EiGtpg685.png

1)344,用户堆栈初始化程序入口。 2)346,保存堆起始地址。 3)347行,保存栈结束地址。 4)348行,保存堆结束地址。 5)349行,保存栈起始地址。

7、中断跳转

中断发生之后,是怎么实现跳转到相应的中断服务函数里面的呢? 1)首先,前面

定义好了中断的响应函数,即中断向量表,标号__Vectors,表示中断向量表的入口地址。2)我们假设STM32从FLASH启动,则中断向量表起始地址为0x8000000,STM32上电后根据boot引脚来决定PC位置,即启动后PC跳到0x08000000。3)然后CPU会先取2个地址,第一个是栈顶地址,第二个是复位异常地址(Reset_Handler),Reset_Handler最终会进入到C语言的运行环境,这个时候会先配置NVIC,使用NVIC_SetVectorTable()可以配置中断向量表的起始地址和偏移,告诉CPU该向量表是位于Flash还是Ram,偏移是多少。 4)在发生中断后,CPU找到中断向量表地址,然后根据偏移(对号入座)再找到中断地址,这样就完成了跳转了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6034

    文章

    44545

    浏览量

    634369
  • STM32
    +关注

    关注

    2270

    文章

    10890

    浏览量

    355630
  • 启动
    +关注

    关注

    0

    文章

    27

    浏览量

    13902
收藏 人收藏

    评论

    相关推荐

    STM32H7的启动过程分析

    本章教程主要跟大家讲STM32H7的启动过程,这里的启动过程是指从CPU上电复位执行第1条指令开始(汇编文件)到进入C程序main()函数入口之间的部分。
    的头像 发表于 10-17 14:42 2277次阅读

    详解STM32启动过程

    本章教程主要跟大家讲STM32H7的启动过程,这里的启动过程是指从CPU上电复位执行第1条指令开始(汇编文件)到进入C程序main()函数入口之间的部分。
    发表于 11-14 11:24 1843次阅读

    专家揭秘:STM32启动过程全解

    电子发烧友网核心提示: 本文主要阐述了STM32启动过程全面解析,包括启动过程的介绍、启动代码的陈列以及深入解析。 相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Corte
    发表于 09-10 08:50 5.3w次阅读
    专家揭秘:<b class='flag-5'>STM32</b><b class='flag-5'>启动过程</b>全解

    STM32F429启动过程详解

    第13章 STM32F429启动过程详解本章教程主要跟大家讲STM32F429的启动过程,这里的启动过程是指从CPU上电复位执行第1条指令开
    发表于 08-03 06:15

    解析STM32启动过程

    stm32系列芯片的种类和型号都有哪些?STM32启动过程是怎样的?
    发表于 10-29 06:39

    STM32整个启动过程是怎样的

    STM32整个启动过程是怎样的?整个启动过程涉及的代码有哪些呢?
    发表于 11-29 06:59

    STM32启动过程是怎样的?

    STM32启动过程是怎样的?
    发表于 11-30 06:08

    嵌入式uCLinux内核启动过程分析

    分析uCLinux的启动过程,可以加快系统启动速度、正确建立应用环境。本文要研究的就是uCLinux操作系统内核的启动过程
    发表于 08-15 16:51 784次阅读

    详解bootloader的执行流程与ARM Linux启动过程分析

    RM Linux启动过程分析是本文要介绍的内容,嵌入式 Linux 的可移植性使得我们可以在各种电子产品上看到它的身影。对于不同体系结构的处理器来说Linux的启动过程也有所不同。 本文以
    的头像 发表于 12-21 09:24 1w次阅读
    详解bootloader的执行流程与ARM Linux<b class='flag-5'>启动过程</b><b class='flag-5'>分析</b>

    STM32启动过程是怎么样的?

    下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存,这就是所谓的启动过程STM32上电或者复位后,代码区始终从0x00000000开始,其实就是将存储空间的地址映射到0x00000000中。三种启动
    的头像 发表于 11-27 16:36 3594次阅读
    <b class='flag-5'>STM32</b>的<b class='flag-5'>启动过程</b>是怎么样的?

    STM32上电后启动过程

    STM32上电后启动过程
    发表于 11-15 18:21 16次下载
    <b class='flag-5'>STM32</b>上电后<b class='flag-5'>启动过程</b>

    STM32启动过程--启动文件--分析

    STM32启动过程--启动文件--分析一、概述1、说明  每一款芯片的启动文件都值得去研究,因为它可是你的程序跑的最初一段路,不可以不知道。
    发表于 11-30 13:21 4次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>启动过程</b>--<b class='flag-5'>启动</b>文件--<b class='flag-5'>分析</b>

    stm32启动过程

    一次性搞定stm32启动模式与启动过程一、stm32启动模式二、从flash启动过程2.1 数据
    发表于 12-16 16:57 8次下载
    <b class='flag-5'>stm32</b><b class='flag-5'>启动过程</b>

    STM32启动过程分析

    1. 程序和数据在Flash和SRAM上的存储结构在讲解 STM32 启动过程之前,我们先来了解一下 STM32 的程序和数据在 Flash 和 SRAM 上到底是如何存储的,因为有了这方面的知识
    发表于 12-23 19:55 12次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>启动过程</b><b class='flag-5'>分析</b>

    stm32启动过程详解

    STM32启动过程详解 近年来,STM32微控制器在嵌入式系统中的应用越来越广泛。STM32微控制器具有高性能、低功耗、易扩展和丰富的外设接口等优势。而要让
    的头像 发表于 12-08 15:47 1607次阅读