在画STM32的电路图的时候,关于STM32的启动方式纠结了一下,现有的参考设计都是在STM32的启动选择引脚BOOT0和BOOT1上使用了跳帽,用以人工选择STM32的启动方式,但是在实际应用中这种设计就显得冗余,所以这里顺带研究了一下STM32的启动方式。

原文链接:https://blog.csdn.net/c12345423/article/details/52809527

STM32一共有三种启动模式,在ST官网上下载的RM0008中,我找到了启动相关的配置说明:

对应的中文翻译如下:

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

STM32三种启动模式对应的存储介质均是芯片内置的,它们是:
1)用户闪存 = 芯片内置的Flash。
2)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。
3)SRAM = 芯片内置的RAM区,就是内存啦。
 
在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执
行程序,见下表:
BOOT1=x   BOOT0=0   从用户闪存启动,这是正常的工作模式。
BOOT1=0   BOOT0=1   从系统存储器启动,这种模式启动的程序功能由厂家设置。
BOOT1=1   BOOT0=1   从内置SRAM启动,这种模式可以用于调试。

原文链接:STM32启动BOOT0 BOOT1设置方法 - zgc261 - 博客园

BOOT0 BOOT1 启动模式
0 X User Flash memory(从用户闪存存储器启动)
1 0 System memory(从系统存储器启动)
1 1 Embedded SRAM(从内嵌SRAM启动)

第一种启动方式是最常用的用户FLASH启动,正常工作就在这种模式下,STM32的FLASH可以擦出10万次,所以不用担心芯片哪天会被擦爆!

第二种启动方式是系统存储器启动方式,即我们常说的串口下载方式(ISP),不建议使用这种,速度比较慢。STM32 中自带的BootLoader就是在这种启动方式中,如果出现程序硬件错误的话可以切换BOOT0/1到该模式下重新烧写Flash即可恢复正常。

第三种启动方式是STM32内嵌的SRAM启动。该模式用于调试

(1) Boot0设置为0后,代码将从主Flash当中启动,就我们目前所编程的地方启动,只要程序正常,上电之后都是可以正常工作。这一般作为ISP 程序下载仿真烧写。一般正常批量生产的时候,我们也是推荐客户默认按照这样的方式去操作,上电之后,机器会自动运行。

(2) Boot0设置为1,Boot1设置为0,代码将从ROM区启动,这上电启动都会运行Bootloader,在此过程中可以实现IAP程序更新,这一般是通过USART 进行更新,此时如果USART或者是SPI端口没有接收到数据信号,那么MCU将会一直程序等待下去,不会自动跳到FLash主代码区。所以一般这作为个体产品

想实现代码更新的工作。这需要你那边是否要考虑以后产品升级,如若升级,可以在Boot0引脚接入一个拔码开关实现对Boot0电平的控制,从而可以实现 IAP更新功能。

(3)Boot0以及Boot1都是为1的时候,那么此时程序将从RAM当中启动,程序会直接下载到RAM当中,这一般作为调试来用,因为有的时候代码不是很大,由于 RAM下载代码速度很快,对于一些调试而言是非常有好处的,断电不会保存数据,这一点需要注意。

在使用开发板时不小心下载了个有问题的程序,然后就悲剧了。无法往芯片中烧写程序了。每次想下载程序都会弹出如下的两个错误对话框:

J-Link和STM32 芯片都不大可能就这么坏掉了。多半是烧写进去的软件有些问题,占用了相应的IO 管腿,导致无法利用J-Link与之通讯。那就想办法不让这个错误的程序运行了。例如下述代码如果烧写进去的话就会造成J-Link下次不能正常连接:

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

上述代码表示取消JTAG引脚功能,开始SWD引脚功能。

STM32 中是自带了BootLoader的,切换进BootLoader 中就可以了。具体的方法就是通过BOOT1、BOOT0两个跳线来选择启动模式。修改跳线将启动模式切换为上述的第二种方式:BOOT0=1,BOOT1=0。

断电,改跳线,重新上电,进入第二种方式:BOOT0=1,BOOT1=0,即STM32的BootLoader 模式。此时J-Link可以正常工作了,用J-Link 下载新的程序,下载成功。再断电,把跳线改回来第一种启动方式(BOOT0=0,BOOT1=0),重新上电,一切正常,问题解决。

  • Main Flash memory( BOOT0=0 BOOT1=x )

是STM32内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。

  • System memory( BOOT0=1 BOOT1=0 )

从系统存储器启动,这种模式启动的程序功能是由厂家设置的。一般来说,这种启动方式用的比较少。

系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader,也就是我们常说的ISP程序,这是一块ROM,出厂后无法修改。

一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。但是这个下载方式需要以下步骤:

Step1:将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader

Step2:最后在BootLoader的帮助下,通过串口下载程序到Flash中

Step3:程序下载完成后,又有需要将BOOT0设置为GND,手动复位,这样,STM32才可以从Flash中启动

可以看到,利用串口下载程序还是比较的麻烦,需要跳帽跳来跳去的,非常的不注重用户体验。

  • Embedded Memory( BOOT0=1 BOOT1=1 )

内置SRAM,既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试

假如我只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash,比较的费时,可以考虑从这个模式启动代码(也就是STM32的内存中),用于快速的程序调试,等程序调试完成后,再将程序下载到Flash中。

原文链接:STM32 BOOT0 & BOOT1启动方式_taita_新浪博客
        要注意的是,一般不使用内置SRAM启动(BOOT1=1 BOOT0=1),因为SRAM掉电后数据就丢失。多数情况下SRAM只是在调试时使用,也可以做其他一些用途。如做故障的局部诊断,写一段小程序加载到SRAM中诊断板上的其他电路,或用此方法读写板上的Flash或EEPROM等。还可以通过这种方法解除内部Flash的读写保护,当然解除读写保护的同时Flash的内容也被自动清除,以防止恶意的软件拷贝。

一般BOOT0和BOOT1跳线都跳到0(地)。只是在ISP下载的情况下,BOOT0=1,BOOT1=0 ,下载完成后,把BOOT0的跳线接回0,也 即BOOT0=0,BOOT1=0 。

芯片无法启动运行?

插曲:笔者曾经做过一个项目,拿到一块别人的板子和程序来修改,后来做了块板子,烧录程序后发现:烧录后通过烧录工具的“烧录后运行”选项可以正常跑起来,但一旦使程序从FLASH开始运行,则跑不了了。后来发现别人板子上的MCU是烧录过boot的,而自己做的板子是没有烧录boot的,前者程序从0x8003000开始运行,后者程序实际从0x8000000开始运行,把0x8003000处开始运行的程序烧到0x8000000的板子上的结果就是:复位向量地址不正确,导致芯片无法启动因为0x8003000的程序把中断向量表搬到了0x8003000处。
这里转载正点原子的分析:

STM32的内部闪存(FLASH)地址起始于0x08000000,一般情况下,程序文件就从此地

址开始写入。此外STM32是基于Cortex-M3内核的微控制器,其内部通过一张“中断向量表”

来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成

启动,而这张“中断向量表”的起始地址是0x08000004(0x8003000的程序中,中断向量表的地址是0x8003000),当中断来临,STM32的内部硬件机

制亦会自动将PC指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断

服务程序。

在图53.1.1中,STM32在复位后,先从0X08000004地址取出复位中断向量的地址,并跳

转到复位中断服务程序,如图标号①所示;在复位中断服务程序执行完之后,会跳转到我们的

main函数,如图标号②所示;而我们的main函数一般都是一个死循环,在main函数执行过程

中,如果收到中断请求(发生重中断),此时STM32强制将PC指针指回中断向量表处,如图

标号③所示;然后,根据中断源进入相应的中断服务程序,如图标号④所示;在执行完中断服

务程序以后,程序再次返回main函数执行,如图标号⑤所示。

综上所述,在我的设计中,我将BOOT0和BOOT1通过一个100k的下拉电阻,直接接地。10k可以:stm32的 Boot0 Boot1大家都怎么接,悬空可以吗? (amobbs.com 阿莫电子论坛)

MCU中,Boot启动方式的作用
       从官方的Datasheet上可以看到,对Boot模式的描述,如下图


       从Datasheet上可以看出,该MCU支持三种Boot Mode:


注:一般来说,只用前两种模式,而SRAM模式几乎不同;所以在设计Boot电路时,只需要注意BOOT0的逻辑即可。

1. 从主闪存存储器启动
       使用JTAG或者SWD烧录程序时的正常模式,程序直接下载到内部 FLASH 中;程序必须在该模式下才能正常工作!!!
2.从系统存储器启动
       从此ROM启动,即通过usb下载程序;在此ROM里面,一般厂家出厂芯片的时候会在里面烧录一个Bootloader跳转代码(其作用是,将通过USB下载的程序,跳转到Main Flash里面执行),有些开发板就集成了USB一键下载电路。
              a.正点原子的usb一键下载电路

逻辑分析:
       由上图可知,要下载程序,需控制的一个引脚是BOOT0。再观一键下载电路的原理图,还有一个引脚RESET。 So 如何实现一键下载呢?

划重点啦!!!!
STM32 串口下载到运行必不可少的 3个步骤:
1. 把 BOOT0 拉高(保持 BOOT1 接入GND);
2. 手动复位按键进行复位;
3. 把 BOOT0 接入GND,然后再一次复位。

       由正点原子提供的一键下载电路的原理图可以看出和stm32这两个引脚最有关联的是CH340的DTR#和RTS# 输出引脚。没错,我们就是用一键下载软件通过控制这两个引脚的高低电平,从而控制BOOT0和RESET,进而改变启动模式。(D8是为了防止三极管集电极的VCC3.3会影响到正常的复位。 其实就是利用二极管的单向导通性,尽可能保留)

a.一开始,MCUISP先让DTR#输出高电平,RTS#输出低电平,满足NPN管正向导通条件,Q2导通后,RESET变为0;再看Q3,也满足导通条件,故BOOT0输出高电平(即此时BOOT0 BOOT1为1 0) ,则进入启动串口下载模式。
       b.下载完程序之后,软件拉高RTS#,DTR#之后再拉低。此时,Q2不导通,RESET输出高电平,BOOT0输出低电平。启动模式变为Flash启动,即用户闪存。

第1步只是存储了程序,第2步是让程序加载运行。

启动模式,BOOT0和BOOT1详解相关推荐

  1. activity启动模式 android,专题:详解Android组件Activity的启动模式singleTask_51CTO.COM

    在Android应用程序中,可以配置Activity以四种方式来启动,其中最令人迷惑的就是"singleTask"这种方式了,官方文档称以这种方式启动的Activity总是属于一个 ...

  2. 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

  3. Java单机部署,Nacos docker单机模式部署实现过程详解

    Nacos 的部署,我使用的时docker 部署(单机模式 mysql),官网文档:https://nacos.io/zh-cn/docs/quick-start-docker.html 拉取代码: ...

  4. mysql启动参数(/etc/my.cnf)详解汇总

    mysql启动参数(/etc/my.cnf)详解汇总 MYSQL–my.cnf配置中文详解 basedir = path 使用给定目录作为根目录(安装目录). character-sets-dir = ...

  5. 虚拟化磁盘模式、数据存储详解

    虚拟化磁盘模式.数据存储详解 1. 配置模式 1.1. 普通 1.2. 普通延迟置零 1.3. 精简 2. 磁盘模式 2.1. 从属 2.2. 独立-持久 2.3. 独立-非持久 3. 数据存储 3. ...

  6. php-fpm 启动参数及重要配置详解

    2019独角兽企业重金招聘Python工程师标准>>> php-fpm 启动参数及重要配置详解 约定几个目录 /usr/local/php/sbin/php-fpm /usr/loc ...

  7. python的编程模式-Python设计模式之状态模式原理与用法详解

    本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...

  8. Linux配置启动挂载:fstab文件详解

    Linux配置启动挂载:fstab文件详解 [日期:2014-12-23] 来源:Linux社区 作者:aceking10 [字体:大 中 小] fstab文件介绍 fstab文件包含了你的电脑上的存 ...

  9. 怎样进入android模式,安卓手机如何进入Recovery模式的通用方式详解

    2014-12-12 15:24:16 安卓手机如何进入Recovery模式的通用方式详解 标签:安卓 Recovery模式 教程 Recovery模式是什么?这里说的Recovery模式主要指的是安 ...

最新文章

  1. 揭富人与穷人21个不同思维 看富豪如何脱颖而出
  2. Javascript实现网页水印(非图片水印)
  3. android 美颜资料整理
  4. 【跃迁之路】【497天】程序员高效学习方法论探索系列(实验阶段254-2018.06.17)...
  5. 为什么python中不需要变量名和变量类型声明?
  6. 【算法竞赛学习】学术前沿趋势-论文代码统计
  7. linux netty udp服务端,Netty实现UDP服务端
  8. linux共享文件可读写,在Ubuntu中设置samba共享可读写文件夹
  9. ocdma相干非相干_非相干系统是什么意思
  10. hutool的定时任务不支持依赖注入怎么办_可调度定时任务在SpringBoot中的实践
  11. SQL Server的锁机制
  12. winform textbox提示历史记录
  13. 番茄花园GHOST SP3无法安装IIS 信息服务的解决方法
  14. VMware Workstation 17 Pro密钥
  15. OPEN-WRT老毛子固件的无线中继设置建议
  16. 跳转到app下载页面和app评论页面
  17. TF、keras两种padding方式:vaild和same
  18. JavaScript中常用数组方法总结
  19. android自定义控件padding属性无效的解决
  20. git报错-The file will have its original

热门文章

  1. shell 编程100例
  2. 2022-2027年(新版)中国LCP行业发展前景及需求规模预测报告
  3. 3975: 人工智能(障)?
  4. LeetCode hot-100 简单and中等难度,21-30.
  5. 用统信uos安装docker并运行项目
  6. 动态规划之DP中判断是否到达某一状态(最短时间是什么)?
  7. startup_LPC17XX.s 启动文件分析
  8. iwebshop分销商城系统具体有哪些优势?
  9. 响应式网页上banner使用,unslider
  10. python输入数据带单位_python – Pandas用单位插入数据