01.一探究竟STM32的三种启动模式

2023-11-01 09:41

本文主要是介绍01.一探究竟STM32的三种启动模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.有哪些启动方式?怎么选择启动方式?

2. STM32 地址映射表

3.最常使用的场景:从主闪存启动

4.怎么将程序烧录至主闪存?什么时候需要从系统存储器启动?

        4.1 ICP烧录方式

        4.2 ISP烧录方式

附录:


1.有哪些启动方式?怎么选择启动方式?

表1 STM32启动模式表(*STM32参考手册)

    在系统复位后,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT0BOOT1引脚的状态,来选择在复位后的启动模式。

图1 BOOT引脚经典电路

        在从待机模式退出时,BOOT引脚的值将被被重新锁存;因此,在待机模式下BOOT引脚应保持为需要的启动配置。在启动延迟之后,CPU从地址0x0000 0000获取堆栈顶的地址,并从启动 存储器的0x0000 0004指示的地址开始执行代码。因为固定的存储器映像,代码区始终从地址0x0000 0000开始(通过ICode和DCode总线访问),而数据区(SRAM)始终从地址0x2000 0000开始(通过系统总线访问)。Cortex-M3的CPU始终从ICode总线获取复位向量,即启动仅适合于从代码区开始(典型地从Flash启动)。STM32F10xxx微控制器实现了一个特殊的机制,系统可以不仅仅从Flash存储器或系统存储器启动,还可以从 内置SRAM启动。

根据选定的启动模式,主闪存存储器、系统存储器或SRAM可以按照以下方式访问:

● 从主闪存存储器启动:主闪存存储器被映射到启动空间(0x0000 0000),但仍然能够在它原有的地址(0x0800 0000)访问它,即闪存存储器的内容可以在两个地址区域访问,0x0000 0000或0x0800 0000。

● 从系统存储器启动:系统存储器被映射到启动空间(0x0000 0000),但仍然能够在它原有的地址(互联型产品原有地址为0x1FFF B000,其它产品原有地址为0x1FFF F000)访问它。系统存储器(System memory)启动方式运行内置的Bootloader,将程序写入主存储区

● 从内置SRAM启动:只能在0x2000 0000开始的地址区访问SRAM。

一个新的疑问:这些地址到底在什么地方?

通过下面这张图你可能就对内存的分布有了比较直观的认识。下图是一张STM32F4xx的地址映射表,从0x0000 0000到0xFFFF FFFF,总计4Gbyte。单片机的片上Flash

2. STM32 地址映射表

看了上面的启动方式介绍后,你可能会提出一个新的疑问:这些地址到底在什么地方?通过下面这张图你可能就对内存的分布有了比较直观的认识。下图是一张STM32F4xx的地址映射表,从0x0000 0000到0xFFFF FFFF,总计4Gbyte。单片机的片上Flash、片上RAM、片上外设以及外部扩展接口的访问地址,都被映射到这4Gbyte的范围之内。

图2 STM32F4xx地址映射表

主存储区(Main memory)  :通常,我们编写的代码,是放到主存储区的起始位置(0x0800 0000)开始运行的,烧录程序时,直接将程序烧录到这里即可。

系统存储区(System memory):System memory(起始位置0x1FFF 000)是STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 也就是我们常说的ISP程序 ,这是一块ROM,出厂后无法修改。

3.最常使用的场景:从主闪存启动

        闪存,即flash ROM,具有掉电保存的特性。用户只需要将BOOT0引脚设置为低电平,就可以直接将可执行程序在0x0800 0000起始的地址烧录,烧录完,直接在这个地址处运行。

4.怎么将程序烧录至主闪存?什么时候需要从系统存储器启动?

4.1 ICP烧录方式

        用户可以直接通过J-TAG口将程序烧录至闪存,这种烧录方式也称为ICP(In-circuit programmer,在电路编程)。KEIL软件可直接进行ICP方式烧录程序。注意需要将BOOT0引脚设置为低电平,启动地址选择0x0800 0000:

图3 STM32烧录方式-ICP

4.2 ISP烧录方式

        什么时候需要从系统存储器启动?使用串口烧录需要从系统存储器启动STM32,串口烧录方式又称ISP(In-System Programming,在系统编程),使用引导程序(Bootloader)加上外围UART/SPI等接口进行烧录。

STM32出厂时,由ST在这个区域内部预置了一段BootLoader(起始位置0x1FFF 0000,System memory), 也就是我们常说的IAP程序 ,这是一块ROM,出厂后无法修改。这段代码提供了可以通过UART1串口将用户的代码下载到Flash中的功能,等烧录完成后,用户只需要下电、切换到闪存启动方式(BOOT0设置为低电平),复位单片机,就可以执行flash中的程序。

图4 STM32烧录方式-ISP

附录:

1.STM32F103意法半导体32位微控制器 - STMicroelectronics

2.STM32用户手册:链接:Link     提取码:hy33

这篇关于01.一探究竟STM32的三种启动模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/322118

相关文章

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

详解Java中三种状态机实现方式来优雅消灭 if-else 嵌套

《详解Java中三种状态机实现方式来优雅消灭if-else嵌套》这篇文章主要为大家详细介绍了Java中三种状态机实现方式从而优雅消灭if-else嵌套,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录1. 前言2. 复现传统if-else实现的业务场景问题3. 用状态机模式改造3.1 定义状态接口3

Spring Boot项目如何使用外部application.yml配置文件启动JAR包

《SpringBoot项目如何使用外部application.yml配置文件启动JAR包》文章介绍了SpringBoot项目通过指定外部application.yml配置文件启动JAR包的方法,包括... 目录Spring Boot项目中使用外部application.yml配置文件启动JAR包一、基本原理

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

redis中session会话共享的三种方案

《redis中session会话共享的三种方案》本文探讨了分布式系统中Session共享的三种解决方案,包括粘性会话、Session复制以及基于Redis的集中存储,具有一定的参考价值,感兴趣的可以了... 目录三种解决方案粘性会话(Sticky Sessions)Session复制Redis统一存储Spr

解决hive启动时java.net.ConnectException:拒绝连接的问题

《解决hive启动时java.net.ConnectException:拒绝连接的问题》Hadoop集群连接被拒,需检查集群是否启动、关闭防火墙/SELinux、确认安全模式退出,若问题仍存,查看日志... 目录错误发生原因解决方式1.关闭防火墙2.关闭selinux3.启动集群4.检查集群是否正常启动5.

Python清空Word段落样式的三种方法

《Python清空Word段落样式的三种方法》:本文主要介绍如何用python-docx库清空Word段落样式,提供三种方法:设置为Normal样式、清除直接格式、创建新Normal样式,注意需重... 目录方法一:直接设置段落样式为"Normal"方法二:清除所有直接格式设置方法三:创建新的Normal样