【32单片机学习】(11)STM32启动过程详解

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

目录

前言

一、系统架构

二、启动配置

三、启动流程

1.首先复位MCU,获取栈顶指针MSP和PC指针的内容

2.根据PC的值找到复位中断处理函数Reset_Handler

1.进入中断处理函数Reset_Handler

2.进入SystemInit函数

3._main函数

3.进入main函数

总结


前言

         通过查阅官方手册和对实际代码进行调试仿真,了解了STM32上电启动的具体过程,在此记录一下。


一、系统架构

【32单片机学习】(11)STM32启动过程详解

         代码区(code area):从0x00000000开始,通过指令总线(ICode Bus)和数据总线(DCode Bus)对Flash中代码进行访问。

        数据区(SRAM):从0x20000000开始,通过系统总线(System Bus)进行访问。

二、启动配置

【32单片机学习】(11)STM32启动过程详解

         STM32系列可以有3种启动模式,由BOOT1与BOOT0的设置决定选择Flash、System memory还是SRAM作为启动空间。

●从主闪存存储器启动(Main Flash memory):主闪存存储器被映射到启动空间(0x0000 0000),但仍然能够在它原有的地址(0x0800 0000)访问它,即闪存存储器的内容可以在两个地址区域访问,0x0000 0000或0x0800 0000。

  从系统存储器启动(System memory):系统存储器被映射到启动空间(0x0000 0000),但仍然能够在它原有的 地址(互联型产品原有地址为0x1FFF B000,其它产品原有地址为0x1FFF F000)访问它。 

 ●从内置SRAM启动(Embedded SRAM):只能在0x2000 0000开始的地址区访问SRAM,启动后这个映射消失,需要重定位中断向量表。

STM32将0x00000000到0x0005FFFF的区域作为启动空间(boot space)的别名区。

三、启动流程

1.首先复位MCU,获取栈顶指针MSP和PC指针的内容

MCU上电后,自动执行

当程序编译完成之后,sp堆栈栈顶指针都已经确定。

【32单片机学习】(11)STM32启动过程详解

 R13(SP堆栈指针)的值为0x20000868(MSP)存在地址为0x00000000中,R15(PC程序计数器)的值为0x08000420存在地址为0x00000004中,堆栈指针指向sram区,且堆栈必须建立在该区。

【32单片机学习】(11)STM32启动过程详解

【32单片机学习】(11)STM32启动过程详解

当从flash中启动时SP在地址0x08000000中存储,PC的值在地址0x08000004中存储。但仍可以在原地址中被访问。这也就是所谓的映射。

这即是手册中所说:主闪存存储器被映射到启动空间(0x0000 0000),但仍然能够在它原有的地址(0x0800 0000)访问它,即闪存存储器的内容可以在两个地址区域访问,0x0000 0000或0x0800 0000。

2.根据PC的值找到复位中断处理函数Reset_Handler

1.进入中断处理函数Reset_Handler

中断处理函数外部定义

中断向量表的作用参考STM32的中断向量表是干什么的?到底有什么用?它放在哪里?_ZDQ1431的博客-CSDN博客_stm32 中断向量

【32单片机学习】(11)STM32启动过程详解

原地址0x00000004处的内容为0x0800022D,取出后的内容变为了0x0800022C,它把末位的1变成了0,这个是由于内存对齐造成的,因为cortex-m3核PC的LSB一定读回0,因此指令至少是半字对齐的(《cortex-m3编程手册》)。

LDR  R0,  =SystemInit 将函数SystemInit的入口地址传给R0,从反汇编窗口可以看到指令被写成LDR   r0,   [pc,#36],表明SystemInit的入口地址在存放在PC指针偏移36处,即:                      0x08000022C(+0x4)+0x24=0x08000254(因为CM3内部使用了指令流水线,读PC时返回的值是当前指令的地址+4《Cortex™-M3权威指南》)下一条指令在0x0800022E处。

2.进入SystemInit函数

MCU复位后,PC所指向的第一行代码

复位PC后,此时程序寻址到PC指针指示的地址0x0800022C处准备执行

BLX R0 将R0的值传给PC(必须保证加载到PC的数值是奇数(即LSB=1),传给PC后,PC的LSB读回0),调用SystemInit函数。

SystemInit这个函数里面开启了外部晶振,设置了锁相环PLL,关闭了所有中断,设置了时钟为72MHz,并且重定位中断向量表在0x08000000处(这句在Flash启动时可以不需要,因为能从0x00000000映射到0x08000000)。

3._main函数

__main()是编译系统提供的一个函数,负责完成库函数的初始化和初始化应用程序执行环境

STM32启动详细流程之__main_非常规自我实现的博客-CSDN博客

3.进入main函数

【32单片机学习】(11)STM32启动过程详解

 从SystemInit函数返回后,用同样的方式调用C/C++标准实时库的__main函数,进行了一些处理(如用户堆栈初始化等)后,调用main函数,进入C语言环境。


总结

基于上面分析,可以总结STM32启动的大体过程。

1、上电复位,CPU从0x00000000处获取栈顶指针MSP(默认使用主堆栈),从0x00000004处获取程序计数器PC。

2、MSP指针必然指向SRAM区的,因为堆栈必须建立在该区。

3、根据PC的值找到复位中断处理函数Reset_Handler。

4、调用SystemInit函数。

5、调用__main函数,初始化运行环境和应用程序。

6、调用main函数,进入C语言环境。文章来源地址https://www.toymoban.com/news/detail-476791.html

到了这里,关于【32单片机学习】(11)STM32启动过程详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • (STM32F103单片机)DHT11温湿度传感器

    目录   一,产品介绍 二,产品亮点 三,产品参数 四,引脚连接及通信说明  五,原理讲解 六,源码 1,DHR11.C 2.DHR11.H 3,main.c DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高

    2023年04月08日
    浏览(56)
  • STM32单片机学习4--STM32控制八段码

    数码管:实际上是多个LED按照一定顺序排列,并加上遮罩所构成的元件。 八段码一般会引出9个引脚,其中7个引脚显示数字(或某些字母),1个显示小数点,1个作为片选端。 根据连接方式的不同,数码管分为 共阳 和 共阴 。 共阳在这端输出低电平时点亮,高电平时会熄灭

    2024年01月23日
    浏览(48)
  • 嵌入式STM32 单片机 GPIO 的工作原理详解

    STM32的 GPIO 介绍 GPIO 是通用输入/输出端口的简称,是 STM32 可控制的引脚。GPIO 的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 以 STM32F103ZET6 芯片为例子,该芯片共有 144 脚芯片,包括7个通用目的的输入/输出口(GPIO)组,分别为

    2024年02月20日
    浏览(50)
  • STM32单片机入门学习笔记——MPU6050

    笔记整理自B站UP主江科大自化协教程《[10-2] MPU6050简介_哔哩哔哩_bilibili》,所用单片机也为教程推荐单片机。 如果芯片里再集成一个3轴的磁场传感器,测量XYZ轴的磁场强度,那就叫做9轴姿态传感器,如果再集成一个气压传感器,测量气压大小,那就叫做10轴姿态传感器,一

    2024年02月08日
    浏览(52)
  • 68、基于STM32单片机DHT11温湿度蓝牙控制报警器app系统设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、PCB图 六、程序源码 七、资料包括 温度、湿度和人类的生产、生活有着密切的关系,同时也是工业生产中最常见最基本的工艺参数,例如机械、电子、石油、

    2024年02月08日
    浏览(59)
  • 单片机(STM32,GD32,NXP等)中BootLoader的严谨实现详解

    Bootloader( 引导加载程序 )的主要任务是引导加载并运行应用程序,我们的软件升级逻辑也一般在BootLoader中实现。本文将详细介绍BootLoader在单片机中的实现,包括 STM32、GD32、NXP Kinetis 等等的所有单片机,因为无论是什么样的芯片,它实现的逻辑都是一样的。 注意,本篇文章主

    2024年02月02日
    浏览(60)
  • 86、基于STM32单片机的温湿度DHT11 MQ-2烟雾火灾报警器蓝牙物联网设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案                     二、设计功能 三、实物图 四、原理图 五、硬件框图 六、流程图 七、程序源码   八、资料包括 随着社会和经济的发展,防火工作越来越重要,但是目前国内的许多研发都侧重

    2024年02月06日
    浏览(47)
  • 单片机设计_室内环境智能监测系统(STM32 OLED ESP8266 DHT11 MQ-2 加湿器)

    想要更多项目私wo!!! 室内环境智能监测系统 主要功能:         1.检测空气温湿度         2.检测光照强度         3.检测烟雾浓度         4.数据显示在手机端和设备OLED屏幕上         5.当空气温度高于设定的阈值时,风扇开启         6.当空气湿度低于

    2024年02月09日
    浏览(68)
  • STM32单片机入门学习笔记——定时器TIM第二部分

    笔记整理自B站UP主 江科大自化协 教程 《STM32入门教程-2023持续更新中》 ,所用单片机也为教程推荐单片机。 第一部分:定时器基本定时的功能,定时器每隔这个时间产生一个中断,来实现每隔一个固定时间执行一段程序的目的,比如要做一个时钟、秒表或者使用一些程序算

    2024年02月08日
    浏览(55)
  • STM32单片机入门学习笔记——定时器TIM第一部分

    笔记整理自B站UP主 江科大自化协 教程 《STM32入门教程-2023持续更新中》 ,所用单片机也为教程推荐单片机。 第一部分:定时器基本定时的功能,定时器每隔这个时间产生一个中断,来实现每隔一个固定时间执行一段程序的目的,比如要做一个时钟、秒表或者使用一些程序算

    2024年02月03日
    浏览(57)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包