当前位置: 首页 > news >正文

BOOT电路

本质:BOOT电路本质上是单片机的引脚

作用:BOOT电路的作用是用于确定单片机的启动模式

使用方法:在单片机上电或者复位时给BOOT管脚设置为指定电平即可将单片机设置为指定启动模式。

原理:单片机上电或复位后会先启动内部晶振,第四个SysTick时单片机内部电路会将BOOT引脚的值进行锁存,也就是保存BOOT引脚的值,再根据BOOT引脚的值确定不同的启动模式。

数据手册

数据手册中关于BOOT的相关说明如下图(手册为stm32f4xx系列)

 存储器采用固定的存储器映射,其中代码区域起始地址为 0x0000 0000,通过 ICode/DCode 总线访问,而数据区域起始地址为 0x2000 0000,通过系统总线访问。在这种情况下,Cortex-M4F CPU 通过 ICode 总线获取复位向量,因此只有代码区域(通常为 Flash 存储器)可以提供自举空间。然而,STM32F4xx 微控制器实施了一种特殊机制,允许从其他存储器(如内部 SRAM)进行自举。这意味着即使复位向量存储在 Flash 存储器中,STM32F4xx 微控制器也可以通过特殊机制从内部 SRAM 或其他存储器启动和执行程序。这种特殊机制为STM32F4xx微控制器提供了更大的灵活性,使其能够从多种存储器区域进行自举,而不仅局限于代码区域(Flash)中。这样的设计可以为开发人员提供更多选择,以满足不同应用场景的需求。

STM32F4xx 微控制器中可以通过 BOOT[1:0] 引脚选择三种不同的自举模式。这些引脚提供了控制启动模式的能力,允许开发人员在启动时选择不同的启动选项。表 3中列出了这些不同的自举模式,包括从不同存储器区域启动或采用不同的引导配置。在不同的自举模式下,微控制器会执行不同的启动流程,以满足需求。通过适当选择 BOOT[1:0] 引脚的状态组合,可以配置 STM32F4xx 微控制器以启动到特定的模式,这种灵活性有助于应对不同的应用需求和场景。

在 STM32F4xx 微控制器中,复位后,在 SYSCLK 的第四个上升沿会锁存 BOOT 引脚的值。这意味着在复位后的一段时间内(通常是 SYSCLK 的第四个上升沿),系统会稳定 BOOT 引脚的状态,并使用这个状态来确定启动的方式。用户可以通过设置 BOOT1 和 BOOT0 引脚的状态来选择所需的自举模式。通过控制这两个引脚的组合状态,用户可以指定微控制器在启动时应该从哪个存储器区域(如 Flash、SRAM等)启动,或者采用不同的启动配置选项。因此,通过设定 BOOT1 和 BOOT0 引脚,用户可以灵活地选择适合其应用需求的启动模式,从而实现对 STM32F4xx 微控制器启动行为的控制。

在 STM32F4xx 微控制器中,BOOT0 是一个专用引脚,而 BOOT1 则是一个与 GPIO 引脚共享的引脚。一旦完成对 BOOT1 的采样并确定了启动模式,相应的 GPIO 引脚即可进入空闲状态,变为可用于其他用途。这种设计使得在确定启动模式后,原本用于选择启动模式的 GPIO 引脚可以释放出来,供开发人员用于连接其他外设或执行其他功能。这种灵活性允许用户在启动完成后重用这些引脚,以满足不同的应用需求。因此,一旦对 BOOT1 引脚进行采样并完成启动模式的选择,相应的 GPIO 引脚可以自由地被重新配置和使用,而不再限定于启动模式选择用途。这样的设计有助于优化引脚资源的利用,并允许开发人员充分发挥 STM32F4xx 微控制器的功能。

在 STM32F4xx 微控制器中,当设备退出待机模式时,会对 BOOT 引脚进行重新采样。因此,在设备处于待机模式期间,这些引脚必须保持所需的自举模式配置,以确保在退出待机模式后系统能够按照预期的方式启动。一旦启动延迟结束,CPU 将会从地址 0x0000 0000 获取栈顶值,然后从地址 0x0000 0004(自举存储器的起始地址)开始执行代码。这意味着在设备重新启动时,系统会先获取栈顶值,然后从自举存储器的地址处开始执行代码,这样确保了系统正确地启动并恢复到正常工作状态。因此,在 STM32F4xx 微控制器中,对 BOOT 引脚的正确配置和保持与所需的自举模式相关的状态非常重要,以确保设备能够顺利退出待机模式并正确启动。系统会按照设定的自举模式配置来执行启动流程,从而保证设备在重新启动后能够正常运行。

当STM32F4xx微控制器以SRAM自举方式启动时,需要在应用程序初始化代码中重新分配向量表以确保中断服务程序能够正确执行。在这种情况下,需要使用NVIC异常及中断向量表和偏移寄存器进行重新分配。

具体做法包括以下步骤:
1. 将中断向量表地址设置为SRAM中的新地址。
2. 更新NVIC偏移寄存器的值,以确保向量表中的中断向量正确映射到相应的中断服务程序。

通过重新分配向量表,可以确保系统能够正确处理中断,使应用程序在SRAM自举模式下能够正常运行。这一步是必要的,因为在SRAM自举模式下,系统不再从Flash等其他存储器中读取中断向量表,而是从SRAM中读取,所以需要重新分配以确保正确的中断处理流程。

三种启动模式

1)主FLASH = 芯片内置的Flash。
2)SRAM = 芯片内置的RAM区,就是内存。
3)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。这个系统存储器只是帮你通过ISP程序下载hex进去的

从主FLASH启动
其中用于FLASH的地址范围为0x0800 0000~0x080F FFFF ,大小为1MB

将主Flash地址0x08000000映射到0x00000000,这样代码启动之后就相当于从0x08000000开始。主闪存存储器是STM32内置的Flash,作为芯片内置的Flash,是正常的工作模式。一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。

从系统存储区启动
系统存储区地址范围为0x1FFF 0000~0x1FFF 7A0F,大小为30KB

系统存储区实际上存放了一段ST事先写好的BootLoader程序,且不可以被修改,用于ISP下载,也就是串口方式下载,当我们将BOOT0拉高,BOOT1拉低时,也就是系统存储器模式启动,单片机会将0x1FFF 0000~0x1FFF 7A0F这段空间映射到0x0000 0000处,运行系统内置的BootLoader程序,也就是串口下载的程序,使用串口将程序下载到FLASH中,下载完成之后就将BOOT0拉低,重启,使用主FLASH的方式运行使用串口下载的程序了。

从SRAM启动
SRAM位于block2 地址范围从0x2000 0000开始,不同型号大小不同

将SRAM地址0x20000000映射到0x00000000,这样代码启动之后就相当于从0x20000000开始。内置SRAM,也就是STM32的内存,既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。假如我只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash,比较的费时,可以考虑从这个模式启动代码,用于快速的程序调试,等程序调试完成后,在将程序下载到SRAM中。

BOOT电路

Boot0和Boot1引脚被用来设定单片机的启动模式,它们通常需要单独的电源和电源地是为了避免不同引脚之间的干扰和影响,确保引脚功能的准确性和可靠性。具体原因包括以下几点:

1. **电源隔离**:Boot0和Boot1引脚需要连接到不同的电源线路上,因为在某些情况下,这两个引脚可能会需要不同的电源供应条件。通过单独的电源连接,可以避免由于电源干扰而导致引脚功能异常或误操作。

2. **地线隔离**:同样,Boot0和Boot1引脚通常需要连接到不同的地线上,即电源地。分开地线连接有助于减少地线回路干扰和使得引脚的接地更为稳定,确保系统的可靠性和稳定性。

3. **信号隔离**:Boot0和Boot1引脚在电路设计中可能受到其他信号线的影响,为了避免不同信号线之间的干扰,单独的电源和地线也能帮助减少信号干扰,确保引脚操作的准确性。

总的来说,单独的电源和电源地连接有助于确保Boot0和Boot1引脚在工作时具有良好的电气特性,减少外部干扰和影响,保证单片机启动模式设置的准确性和可靠性。

在Boot0和Boot1电路上引脚上加电阻通常有以下几个作用:

1. **限流作用**:添加电阻可以限制引脚上的电流,避免在异常情况下(比如短路)产生过大的电流,保护单片机不受损害。

2. **消除漂移**:在复杂电路环境中,引脚可能会受到外部信号的影响而产生漂移,通过给引脚加上电阻可以帮助减小这种影响,保持引脚信号的稳定性。

3. **防抖作用**:引脚上的电阻可以帮助减少引脚信号的抖动或干扰,确保信号传输的稳定性和可靠性。

4. **调节电平**:通过选择合适大小的电阻,可以调节引脚上的电平,确保单片机在正确的电平下正常工作。

总的来说,给Boot0和Boot1电路上的引脚添加电阻有助于保护单片机、稳定信号、减小影响,并确保正常的工作状态。在设计电路时,需要根据具体情况选择合适的电阻数值和类型,以满足系统要求并提高系统性能和稳定性。

相关文章:

  • 【4.3计算机网络】网络规划与设计
  • QT C++实践|超详细数据库的连接和增删改查操作|附源码
  • 【k8s配置与存储--持久化存储(HostPath、EmptyDir、NFS)】
  • 【查漏补缺你的Vue基础】Vue数据监听深度解析
  • SQL函数学习记录
  • mac m3安装nvm安装说明;mac安装xbrew
  • 【机器人最短路径规划问题(栅格地图)】基于遗传算法求解
  • 【GB28181】wvp-GB28181-pro快速修改登录页面名称(前端)
  • 拉美巴西阿根廷媒体宣发稿墨西哥哥伦比亚新闻营销如何助推跨境出海推广?
  • springboot/ssm学院个人信息管理系统Java高校课程作业管理系统web
  • 数仓模型设计方法论
  • 自然语言处理Gensim入门:建模与模型保存
  • 软件设计模式:适配器模式详解
  • day02_前后端环境搭建(前端工程搭建,登录功能说明,后端项目搭建)
  • yolov5v7v8目标检测增加计数功能--免费源码
  • CentOS 7 修改主机名
  • egg(89)--egg之redis的发布和订阅
  • Java超时控制的实现
  • Js基础——数据类型之Null和Undefined
  • Just for fun——迅速写完快速排序
  • node学习系列之简单文件上传
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • 多线程 start 和 run 方法到底有什么区别?
  • 跨域
  • 驱动程序原理
  • 使用parted解决大于2T的磁盘分区
  • 写给高年级小学生看的《Bash 指南》
  • ​configparser --- 配置文件解析器​
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # Panda3d 碰撞检测系统介绍
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #if和#ifdef区别
  • #NOIP 2014# day.2 T2 寻找道路
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (pojstep1.3.1)1017(构造法模拟)
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (小白学Java)Java简介和基本配置
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)重识new
  • (转载)从 Java 代码到 Java 堆
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .gitignore
  • .NET CLR基本术语
  • .net framework4与其client profile版本的区别
  • .NET 中创建支持集合初始化器的类型
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • @AutoConfigurationPackage的使用