首页 > 其他分享 >STM32启动过程

STM32启动过程

时间:2023-02-11 22:25:18浏览次数:35  
标签:函数 启动 存储器 STM32 地址 main 过程

 参考资料

1.https://blog.csdn.net/weixin_42328389/article/details/120656722

2.https://space.bilibili.com/678329477/channel/seriesdetail?sid=427350

3.https://blog.csdn.net/CynalFly/article/details/114757347

4.https://blog.csdn.net/qq_39400113/article/details/116051401

5.https://blog.csdn.net/tianshi_1988/article/details/51084516

 本文主要回答关于STM32是如何运行的,为什么是main函数的疑问。

启动文件:告诉MCU如何找到并执行main函数,STM32F4的启动文件为《startup_stm32f407xx.s》

启动文件完成的主要工作:

  1.设置堆栈指针SP = _initial_sp

  2.设置PC指针 = Reset_Handler

  3.配置系统时钟

  4.配置外部SRAM用于程序变量等数据存储(可选)

  5.调用C库中的_main函数,最终调用main函数

上述知识点见《Cortex M3与M4权威指南》的4.8 Reset and reset sequence

 

 

 

 

STM32的启动方式:

BOOT0引脚状态 BOOT1引脚状态 启动模式 使用情景
0 X 从Flash中启动 正常运行时选择这种模式
1 0 从系统存储器启动 做ISP下载时用
1 1 从内嵌SRAM中启动 调试用,一般很少使用

 

存储器映射(memory map):把整个MCU内以外的存储器、外设等所有模块全部进行统一的编址,即使用地址来描述各个模块的位置。

STM32是32位单片机,地址总线是32位的,故可以寻址的空间大小为2^32B=4GB。

《Cortex M3与M4权威指南》中,预先定义好的存储器映射(半导体厂家大范围定义),ST在该基础上所做的存储器定义

上电后,CPU从地址0开始执行

存储器重映射:解决 从地址0开始执行程序 与 三种启动方式下程序存放地址不同的问题

从Flash中启动时,芯片上电后,0x0800 0000地址被映射到0地址处

从系统存储器启动时,芯片上电后,0x1FFF 0000地址被映射到0地址处。开始执行厂家提供的BootLoader,将程序下载到系统的Flash中。

  注意:程序下载好后,要重新设定BOOT引脚电平,让程序从Flash中启动

从内嵌SRAM中启动时,芯片上电后,0x2000 0000地址被映射到0地址处

STM32属于小端模式:较高的有效字节存储在较高的存储器地址,较低的有效字节存储在较低的存储器地址。

中断向量表位于代码段的最前面,其内存放中断服务程序的入口地址。

借用硬汉的图,

 

 

 上图解释:1.启动方式为从Flash中启动,上电后从0x8000 0000地址开始读取内容(此时还未开始执行程序);

      2.开始四个字节是堆栈栈顶指针的地址,0x2000 26B0(小端模式),MSP寄存器的值为0x2000 26B0

      3.后四个字节的内容(0x0800019D)装入程序计数器PC中.

      4.CPU从PC寄存器指向的物理地址取出第一条指令开始执行。也就是开始执行复位中断服务程序Reset_Handler。

        跳转到了另外的地址上开始执行程序,避开了中断向量表中的下一个中断

        触发中断时,是从中断向量表中获取对应中断函数的入口地址,转到对应的地址执行,我们所编写的是中断服务函数中的内容

 

 

      5. 调用__mian函数,__main函数是由编译器自动创建的,无法找到。当编译器发现定义了main函数,那么就会自动创建__main。可以用在线调试的方式来查看。

        __main函数最后会跳转到main函数

      6.回到熟悉的main函数。

  

突然想到的问题:如何判断当前CPU是大端的,还是小端的?

  方法1:使用联合体 union

  方法2:强制类型转换

 

标签:函数,启动,存储器,STM32,地址,main,过程
From: https://www.cnblogs.com/xing-2/p/17107385.html

相关文章

  • wt命令,在当前目录启动Windows Terminal
    使用wt命令在当前目录打开WindowsTerminal运行环境:windows10在任意目录下打开WindowsTerminal的默认目录为C:\Users\username>,若想要使用wt命令在当前目录打开Wind......
  • 虚拟机系统安装过程
    1.虚拟机启动后会出现下面的界面(白色表示选中)默认选中的是Testthismedia&installCentOS 7。    InstallCentOS7                    ......
  • 【JVM】Class文件加载过程
    1 前言JVM的入口数据就是每一个Class文件,我们上一篇,仔细分析了Class文件中的每个字节所代表的含义,那么它是如何加载进JVM的,这一篇我们来讲解。Class文件的解释运行时数......
  • 公司的微服务的单个springboot单体应用模块启动成功的标识,以及模块的启动是不是得按照
    微服务项目里面的单体模块启动成功的标识  公司的微服务项目其实没有什么启动顺序 我刚刚不按照启动顺序启动也能启动成功 ......
  • HISI3520DV300 折腾记录(二)之《内存映射、存储(DDRC,FMC)、启动模式分析》
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • juicefs debug mount启动看源码
    main.go里面importcmd包和utils包通过多个init()函数首先注册各种元数据组件下面以redis为例funcinit(){Register("redis",newRedisMeta)Register("rediss",newRe......
  • STM32 启动代码分析
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • MIT6.828_JOS启动流程
    JOS启动流程首先做个总览,JOS的启动流程主要分三步:BIOS检查内存、外设将启动盘中的0号扇区的512字节读入到物理内存的0x7c00处,这段内存就是bootloader使用jmp指令将......
  • C程序问题归纳(static,auto,register,extern,程序内存分布图,linux下程序的执行过程...
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • Nginx服务器---安装与启动
    遇到需要使用Nginx服务器的案例,简单记录一下整个过程。 整体过程:1.https://nginx.org/en/download.htmlNginx官方安装地址Mainlineversion(主流版)Stableversion(稳......