浅谈STM32的三种Boot模式
文章目录
- 一、关于BOOT模式的介绍
- 二、实际例子进行分析
- 三、分析上电启动流程
- 四、小结
- 五、参考资料
一、关于BOOT模式的介绍
所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT1
和BOOT0
引脚的状态,来选择在复位后的启动模式。
启动模式
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模式相关推荐
- 浅谈STM32的三种Boot模式的差异以及用汇编语言设计一个LED灯程序
STM32的三种Boot模式的差异 1.三种方式的比较 用汇编程序完成LED的程序 1.三种方式的比较 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值 ...
- STM32的三种Boot模式的差异
STM32的三种Boot模式的差异 一. STM32启动配置 二. 内置SRAM简介 三. 例程验证 3.1 硬件设置 3.2 创建工程调试版本 3.3 配置分散加载文件 3.5 配置中断向量表 3. ...
- STM32的三种Boot模式地址分配
STM32的三种Boot模式地址分配 一.STM32的三种Boot模式 1.主闪存存储器 2.系统存储器 3.内置SRAM 二.三种模式地址分配验证 主闪存存储器 系统存储器 三.汇编程序完成每间隔1 ...
- STM32的三种BOOT模式
文章目录 一.三种BOOT模式的对比 1.内部 FLASH 启动方式 2.内部 SRAM 启动方式 3.系统存储器启动方式 二.BOOT模式下代码运行后所在地址分析 1.从内部 FLASH 启动 2. ...
- 探究 STM32 的三种 BOOT(启动) 模式并实例验证
目录 一.什么是 Boot 模式 二.实例验证 三.总结 四.参考资料 说明 STM32 的三种 Boot 模式的差异,并在之前第11-12周"C语言各种变量的存储地址"作业代码基 ...
- STM32三种BOOT模式
探究STM32三种BOOT模式 简介 一.三种BOOT模式比较 二.开发BOOT模式选择 三.实验项目 (1)实验要求 (2)实验过程 a.STM32内置的Flash启动--最常用 b.从系统存储器启 ...
- STM32单片机的启动模式 三种BOOT模式介绍
在绘制32单片机时,参考别人的原理图对单片机的启动方式BOOT有疑问, 这里写目录标题 自己的理解和应用 一.三种BOOT模式启动的介绍 二.自己开发BOOT模式的选择 官方的文档介绍 自己的理解和应 ...
- STM32三种BOOT模式介绍
一.三种BOOT模式介绍 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存.用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启 ...
- STM32三种BOOT模式的差异
文章目录 前言 三种BOOT模式 主闪存存储器 系统存储器 内置SRAM 烧录程序验证 主要代码 主闪存存储器烧录验证 系统存储器烧录验证 内置SRAM烧录验证 前言 本篇文章分析了3种BOOT模式下 ...
最新文章
- Web跨浏览器进程通信
- eeglab中文教程系列(18)-自己创建电极位置以及电极位置文件
- jdbc封装mysql_用Java手动封装JDBC连接池(一)
- ios找不到信任证书_ios信任苹果企业级应用
- hdu 4857 Little Devil I
- 企业非法集资风险预测_2020CCF--企业非法集资风险预测83.35baseline
- 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式
- MySql 、Oracle 获取表结构和字段信息
- android audiotrack mp3,播放mp3数据压缩由JLayer和Audiotrack latin mp3在android
- 如何使用scikit-learn工具来进行PCA降维
- 使用traceview进行Android性能测试(转)
- 察看无限网络linux,linux 无线网络调试
- 维珍创始人的10大成功秘诀
- ies文件 vray_VRayIES灯光
- 锋利jquery第三章案例 总结
- android基于xposed框架,学习笔记:Android Xposed 框架入门
- wps图表横纵坐标怎么设置_用WPS的excel插入图表怎样快速设置横纵坐标轴
- 无法定位元素问题:使用phantomjs来进行模拟人的计算机行为的时候可能的报错(么牢牢啊)以及自己的问题解决
- 新元宇宙奇科幻小说原创作品每周连载《地球人奇游天球记》第九回女神伴飞
- Java加上Xtend,满足你对C#语法的所有想象
热门文章
- 【解决Hibernate异常 identifier of an instance of xxx(实体类) was altered from xxx to xxxPK】
- 高德地图轨迹回放功能
- b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释
- 3D 小游戏《欢乐贪吃龙》关键技术盘点 | Cocos 技术派第13期
- Windows服务器时间不断修改(时间不同步已解决)
- Android 连接 TSC打印机, 打印标签(文字、图片)
- matlab计算幂律分布,Matlab拟合曲线之幂律分布
- Oracle实例囚笼(Instance Caging)
- 安装PS出现“由于找不到VCRUNTIME 140_1.dll”的解决方法
- mmdetection安装教程 | 踩坑总结