文章目录

  • 一、关于BOOT模式的介绍
  • 二、实际例子进行分析
  • 三、分析上电启动流程
  • 四、小结
  • 五、参考资料

一、关于BOOT模式的介绍

所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT1BOOT0引脚的状态,来选择在复位后的启动模式。

启动模式
1.主闪存存储器(Main Flash memory)
STM32内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。
2.系统存储器(System memory)
从系统存储器启动,这种模式启动的程序功能是由厂家设置的。一般来说,这种启动方式用的比较少。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 也就是我们常说的ISP程序, 这是一块ROM,出厂后无法修改。一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。

下载方式的步骤:
Step1:将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader
Step2:最后在BootLoader的帮助下,通过串口下载程序到Flash中
Step3:程序下载完成后,又有需要将BOOT0设置为GND,手动复位,这样,STM32才可以从Flash中启动可以看到, 利用串口下载程序还是比较的麻烦, 需要跳帽跳来跳去的。

3.内置SRAM(Embedded Memory)
内置SRAM这个模式一般用于程序调试。
4.三种模式的访问地址
主闪存存储器:访问地址为0x00000000或0x08000000
系统存储器:访问地址为0x00000000或0x1FF00000
内置SRAM:启动时地址为0x00000000或0x20000000
5.中断向量表
主闪存存储器
中断向量表从Flash的起始地址(0x08000000)开始存放。同时映射到0x00000000处。向量表偏移寄存器的值为0x00000000(实际映射到0x08000000)。
内置SRAM
中断向量表还是存放在Flash中(Flash才能固化存储,SRAM只能加电才有效),只不过拷贝到SRAM的首地址0x20000000处。此时向量表偏移寄存器的值也是0x00000000(实际映射到0x20000000)。

无论用哪种模式启动,复位时栈顶指针总能在0x00000000(或0x08000000)处找到,而复位向量总能在0x00000004(或0x08000004)处找到。

二、实际例子进行分析

程序例子参考下面链接中的stm32部分内容
https://blog.csdn.net/qq_43279579/article/details/110308101
1.采用ST_Link进行烧录程序
相关设置

运行结果

2.采用串口进行烧录程序
由于野火mini开发板配置了ISP一键下载的电路,实现通过上位机控制RTS,DTR引脚来实现BOOT0和BOOT1的改变,下载过程就不需要手动改变跳帽。
使用串口下载程序,进行烧录程序

运行结果

3.分析两者之间的差别
采用ST_Link烧录的程序,打开串口之后,开发板和上位机直接就可以直接进行通信。而对于串口烧录的程序来说,打开串口后,没有任何反应,要实现通信必需要按一下复位键,才能够通信。通过这一操作,可以看出采用ST_Link烧录的程序是直接被放置到FLASH中,而串口烧录的程序就不是位于FLASH中,需要手动复位才能在FLASH启动中被看到。

三、分析上电启动流程

STM32是从main函数开始编程的,但是在上电之后,并不是从main函数开始执行的。在进入main函数之前,STM32的CPU会最先设置SP(栈指针)、PC(程序计数器指针),接着执行“启动文件”,这个启动文件就是工程文件夹中的startup_stm32xxxx.s文件。

启动文件所做工作
①初始化堆栈指针SP=_initial_sp
②初始化程序计数器指针PC =Reset_Handler
③初始化中断向量表
④配置系统时钟
⑤调用C库函数__main(__main并不是main函数)初始化用户堆栈,从而最终调用main函数去到C的世界

在线仿真(FLASH模式)
查看地址0x0000 0000开始的数据

查看地址0x0800 0000开始的数据

通过对比这两行的数据,可以发现两个数据完全一样,所以说0x00000000实际映射到0x08000000上。无论是从0x00000000地址开始,还是0x08000000地址开始,都是一样的。

从图中可以知道SP=0x20000600,PC=0x08000131,程序会从地址0x08000131开始执行。通过查询可以知道该地址指向的是复位入口地址,复位入口主要内容如下

Reset_Handler   PROCEXPORT  Reset_Handler             [WEAK]IMPORT  __mainIMPORT  SystemInitLDR     R0, =SystemInitBLX     R0               LDR     R0, =__mainBX      R0ENDP

先执行SystemInit,其主要作用是对系统时钟进行初始化配置。然后就会继续调用__main库函数(__main并不是指函数入口main函数),其主要的功能是软件设置SP、加载.data.bss并初始化栈区。

四、小结

本文章主要是对于前面两中BOOT模式的一个介绍,用两者不同方式烧录程序,来验证说明这两种方式程序烧录后,程序所位于的位置。主要是采用手动复位的这一个操作,表面串口烧录程序不是直接位于FLASH中的。一般来说,最常用的BOOT模式,还是第一种,第二种模式,对于没有ISP一键下载的电路来说,需要自己进行跳帽的改变,对于用户来说,就会比较麻烦,影响体验感。

五、参考资料

1.STM32三种BOOT模式介绍
2.基于ubuntu,树莓派和stm32的C程序的内存分配问题
3.STM32上电引导过程 | 启动模式、启动文件、启动流程
4.STM32启动过程解读与跟踪验证

浅谈STM32的三种Boot模式相关推荐

  1. 浅谈STM32的三种Boot模式的差异以及用汇编语言设计一个LED灯程序

    STM32的三种Boot模式的差异 1.三种方式的比较 用汇编程序完成LED的程序 1.三种方式的比较 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值 ...

  2. STM32的三种Boot模式的差异

    STM32的三种Boot模式的差异 一. STM32启动配置 二. 内置SRAM简介 三. 例程验证 3.1 硬件设置 3.2 创建工程调试版本 3.3 配置分散加载文件 3.5 配置中断向量表 3. ...

  3. STM32的三种Boot模式地址分配

    STM32的三种Boot模式地址分配 一.STM32的三种Boot模式 1.主闪存存储器 2.系统存储器 3.内置SRAM 二.三种模式地址分配验证 主闪存存储器 系统存储器 三.汇编程序完成每间隔1 ...

  4. STM32的三种BOOT模式

    文章目录 一.三种BOOT模式的对比 1.内部 FLASH 启动方式 2.内部 SRAM 启动方式 3.系统存储器启动方式 二.BOOT模式下代码运行后所在地址分析 1.从内部 FLASH 启动 2. ...

  5. 探究 STM32 的三种 BOOT(启动) 模式并实例验证

    目录 一.什么是 Boot 模式 二.实例验证 三.总结 四.参考资料 说明 STM32 的三种 Boot 模式的差异,并在之前第11-12周"C语言各种变量的存储地址"作业代码基 ...

  6. STM32三种BOOT模式

    探究STM32三种BOOT模式 简介 一.三种BOOT模式比较 二.开发BOOT模式选择 三.实验项目 (1)实验要求 (2)实验过程 a.STM32内置的Flash启动--最常用 b.从系统存储器启 ...

  7. STM32单片机的启动模式 三种BOOT模式介绍

    在绘制32单片机时,参考别人的原理图对单片机的启动方式BOOT有疑问, 这里写目录标题 自己的理解和应用 一.三种BOOT模式启动的介绍 二.自己开发BOOT模式的选择 官方的文档介绍 自己的理解和应 ...

  8. STM32三种BOOT模式介绍

    一.三种BOOT模式介绍 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存.用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启 ...

  9. STM32三种BOOT模式的差异

    文章目录 前言 三种BOOT模式 主闪存存储器 系统存储器 内置SRAM 烧录程序验证 主要代码 主闪存存储器烧录验证 系统存储器烧录验证 内置SRAM烧录验证 前言 本篇文章分析了3种BOOT模式下 ...

最新文章

  1. Web跨浏览器进程通信
  2. eeglab中文教程系列(18)-自己创建电极位置以及电极位置文件
  3. jdbc封装mysql_用Java手动封装JDBC连接池(一)
  4. ios找不到信任证书_ios信任苹果企业级应用
  5. hdu 4857 Little Devil I
  6. 企业非法集资风险预测_2020CCF--企业非法集资风险预测83.35baseline
  7. 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式
  8. MySql 、Oracle 获取表结构和字段信息
  9. android audiotrack mp3,播放mp3数据压缩由JLayer和Audiotrack latin mp3在android
  10. 如何使用scikit-learn工具来进行PCA降维
  11. 使用traceview进行Android性能测试(转)
  12. 察看无限网络linux,linux 无线网络调试
  13. 维珍创始人的10大成功秘诀
  14. ies文件 vray_VRayIES灯光
  15. 锋利jquery第三章案例 总结
  16. android基于xposed框架,学习笔记:Android Xposed 框架入门
  17. wps图表横纵坐标怎么设置_用WPS的excel插入图表怎样快速设置横纵坐标轴
  18. 无法定位元素问题:使用phantomjs来进行模拟人的计算机行为的时候可能的报错(么牢牢啊)以及自己的问题解决
  19. 新元宇宙奇科幻小说原创作品每周连载《地球人奇游天球记》第九回女神伴飞
  20. Java加上Xtend,满足你对C#语法的所有想象

热门文章

  1. 【解决Hibernate异常 identifier of an instance of xxx(实体类) was altered from xxx to xxxPK】
  2. 高德地图轨迹回放功能
  3. b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释
  4. 3D 小游戏《欢乐贪吃龙》关键技术盘点 | Cocos 技术派第13期
  5. Windows服务器时间不断修改(时间不同步已解决)
  6. Android 连接 TSC打印机, 打印标签(文字、图片)
  7. matlab计算幂律分布,Matlab拟合曲线之幂律分布
  8. Oracle实例囚笼(Instance Caging)
  9. 安装PS出现“由于找不到VCRUNTIME 140_1.dll”的解决方法
  10. mmdetection安装教程 | 踩坑总结