STM32自动下载电路分享及注意事项
文章目录
- 简介
- ISP下载
- 启动配置
- USB转串口芯片CH340C
- 手动isp下载
- 自动isp下载
- RTS、DTR电平变化分析
- 注意事项
简介
在嵌入式开发中,使用STM32下载程序,可以通过仿真器下载,也可以通过串口下载。在stm32串口下载时,我们需要手动配置启动模式,为了方便进行程序的更新和下载,于是有了自动ISP下载电路。本文将分享关于STM32自动下载电路的实现过程和原理。
ISP下载
ISP,即In-System Programming,在线编程。具有ISP功能的单片机芯片,可以通过简单的下载线直接在电路板上给芯片写入或者擦除程序,并且支持在线调试。 一般而言,ISP都需要一些上位机来配合操作,比如stm32常用的软件是FlyMCU,mcu isp软件。对于stm32,ISP下载,又分为手动ISP下载和自动ISP下载。
启动配置
对于stm32,有几种启动模式需要配置。系统存储器启动就是通过ISP下载。我们可以查看stm32参考手册,里面有关于启动模式的配置。

这里的启动模式怎么理解呢?简单来说,STM32的启动模式决定了芯片上电或复位后执行的操作,启动模式前两种我们用的比较多,这里主要讲解这两种启动模式,我们可以简单理解为有两种模式。第一种模式BOOT1=X, BOOT0 = 0,(这里BOOT1=X, 意思就是:是 0是1都可以),主闪存存储器被选为启动区域,即程序运行模式; 第二种模式, BOOT1=0,BOOT0=1,系统存储器被选为启动区域,即系统引导模式。
-
程序运行模式:启动用户程序,执行从闪存中加载的应用。
大白话:运行程序 -
系统引导模式:允许从特定接口(如UART、USB等)加载新固件,用于程序下载和更新。
大白话:下载程序
这里我们可以看到对于前两种模式,BOOT1的状态只要保持为0即可,所以一般我们都是通过配置BOOT0引脚状态来控制单片机是下载还是运行。STM32在启动时会检查BOOT引脚的状态,以决定从哪个存储位置加载程序。
可以把STM32的启动模式比作一栋大楼的入口。
-
正常入口:当你从主入口(程序运行模式)进入时,你直接进入大楼,开始进行你原本的活动(运行用户程序)。
-
特别通道:如果你选择了侧门(系统引导模式),就好比你在大楼外进行一些特殊操作,比如接收新的指令或进行维修(程序下载)。
通过选择不同的入口,用户可以灵活地进入大楼并执行不同的操作,就像通过设置BOOT引脚状态来控制STM32的启动模式。本质上,是单片机可以选择从不同的位置运行程序,我们可以看下下面这张表。

系统引导模式有一段程序专门用来下载代码,这段程序叫bootlaoder,也叫自举程序,存储在stm32的内部系统存储器中,它的作用是接收串口外设发送的程序数据并放置到flash中,运行的起始地址是0x1FFF F000。在ROM区的0x0800 0000位置,存储的就是编译后的程序代码。
自举程序在手册上是这样描述的。

对于stm32f103c8t6,属于中容量产品,这也是为什么我们通常通过串口1的PA9、PA10这两个串口引脚下载程序。现在我们对启动模式有了一定了解了,我们再回过头看手册。

我们注意手册里的这句话:在系统复位后, SYSCLK的第4个上升沿, BOOT引脚的值将被锁存。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。
也就是说BOOT引脚的状态在复位后第4个上升沿,就固定下来,不再变化。对BOOT0和BOOT1的配置决定了系统将进入的启动模式。所以我们可以说,stm32 isp下载的过程, 一是需要对BOOT进行配置,二是需要进行RESET复位,确保它从设定的启动模式重新开始。
USB转串口芯片CH340C
STM32通常使用串口进行通信,而大多数计算机只有USB接口。USB转串口芯片能够将计算机的USB信号转换为STM32可识别的串口信号。此外,USB和串口之间的电平标准也不同,因此isp下载需要USB转串口芯片来进行通信下载,这里我们使用usb转ttl芯片ch340c来进行下载电路的设计,我们先了解一下ch340c。

这里只对我们用到的几个引脚进行介绍,VCC,V3,GND接电源正极和地,根据实际情况外接0.1uf的退耦电容,RTS#,DTR#,DCD#, RI# ,DSR#,CTS# 这几个引脚为modem联络信号,由计算机软件程序控制,可以理解为通过上位机软件,来完成联络信号的控制,目的是控制单片机自动下载程序时所需满足的电压条件。在STM32自动下载电路中,我们只用到RTS#(Request To Send,请求发送), DTR#(Data Terminal Ready,数据终端就绪)两个引脚。TXD、RXD是串行数据的输出(发送)、输入端(接收), 需要连接通信MCU的输入(接收)、输出(发送)端口;UD+、UD-连接typeC接口中对应的D+,D-。
手动isp下载
普通isp下载,不具有自动下载功能,需要手动进行启动模式的配置,因此也叫手动isp下载。手动isp下载,不需要用到CH340C的联络信号RTS#, DTR#, 所以在下载电路中,我们只需给CH340C供电,连接typec对应的D+, D-, 在将串口芯片的TX, RX连接到MCU的串口通信引脚就行了,对于stm32f103c8t6,前面我们讲过可以通过USART1接口启用自举程序,所以这里串口芯片的TX, 就连接到c8t6的pa10(RX), 串口芯片的RX, 连接到c8t6的pa9(TX)。

手动isp下载程序并运行的过程如下:
- 配置启动模式:BOOT0 = 1, BOOT1= 0
- 进入bootloader:按下复位按钮,准备接收数据
- 存储到Flash:上位机开始发送程序,单片机通过串口接收代码数据
- 重新配置启动模式:下载完成后,BOOT0 = 0, BOOT1 = 0
- 运行Flash中的代码:按下复位按钮,运行下载的程序代码。
可以看到,每次下载程序,然后运行程序的时候,我们都需要手动配置BOOT启动模式,对应在硬件上, 就是每次都要切换跳线帽,而且每次都要按复位,这样子多少有点麻烦,于是就有了自动isp下载电路。
自动isp下载
自动isp下载电路,可以实现自动下载,就不需要去手动配置BOOT启动模式和每次都要按复位了,那肯定是有其它电路控制实现这个功能了,这个自动下载电路,肯定要能在下载程序的时候,自动配置启动模式和自动复位,这就是我们说的实现自动下载电路需要满足的电压条件,所以简单来说,STM32自动下载电路的原理是基于单片机的启动模式和外部电路控制。具体来说:
-
启动模式选择:STM32具有多种启动模式,其中通过BOOT0引脚的高低电平控制单片机进入内置引导程序,从而实现固件下载。如果BOOT0为高电平,单片机会进入下载模式,允许通过串口接收新程序。
-
复位控制:在下载过程中,通过NRST引脚将单片机复位,确保其处于可编程状态。通常使用NPN晶体管控制NRST引脚的高低电平,以实现自动复位。
-
通信接口:USB转串口模块连接至STM32的TX和RX引脚,负责与PC端进行数据传输。通过串口发送的下载命令和数据,将新的固件烧录到单片机中。
和手动下载电路不同的是, 自动下载电路使用ch340c串口芯片时,使用到了RTS#和DTR#两个联络信号引脚。

自动isp下载程序并运行的过程如下:
- 配置启动模式: BOOT1固定为0(BOOT1=0),CH340_RTS输出低电平,Q2导通,BOOT0被拉高,BOOT0 = 1
- 进入bootloader:CH340_DTR=1,Q1导通,NRST被拉低,延时100ms;延时后CH340_DTR拉低,CH340_RTS维持拉低,完成一次复位,准备接收数据。
- 存储到Flash:上位机开始发送程序,单片机通过串口接收代码数据
- 重新配置启动模式:接收完成后,CH340_RTS为高电平,Q2截止,BOOT0 = 0
- 运行Flash中的代码:接收完成后此时CH340_DTR为高电平,Q1截止,NRST恢复为高电平,因此无法实现自动运行程序,需手动按下复位按钮运行代码。但实际上我们可以让它自动运行,在软件上,可配置“编程后运行”,从主闪存0x800 0000位置运行,实现自动运行下载的程序代码。
因此这个电路搭配软件进行使用, 基本上就可以实现一键自动下载代码并运行代码的效果了!对比一下手动isp下载,可以发现,自动isp下载的过程,实际上就是上位机软件通过控制DTR和RTS来实现对BOOT0和NRST(复位引脚)的控制。
值得注意的是,FlyMcu软件底部有关于RTS和DTR高低电平的选择,用的是RS232电平,使用的是负逻辑,和我们常见的ttl电平正好相反,即0是高电平,1是低电平,所以在实际电路中是DTR#的高电平复位,RTS#低电平进Bootloader,在软件上应设置成“DTR的低电平复位,RTS高电平进Bootloader”。
RTS、DTR电平变化分析
一开始采样的时候,遇到一个奇怪的现象,RTS#在下载过程中会有几微妙不稳定的抖动,在产生抖动的同时DTR#也由原来的拉低变成拉高了,根据我们前面的分析,这个是有点问题的,会多产生了一次复位,这个复位好像是没有必要的。后面分析既然是RTS#、DTR#的变化,那就分析一下它为什么会变化,而RTS#、DTR#是由上位机软件控制的,所以猜想可能跟软件有关。


于是把FlyMcu软件换成了mcuisp 软件。

NICE! 这个波形就很完美,和我们前面分析的波形一致。我们再来分析一下这个时序图。

STM32自动下载电路过程可以分为3个阶段,下载前,下载中,下载后。
下载前,RTS#, DTR#都为高电平, 此时BOOT0为0V,NRST为3.3V
下载中,上位机软件控制DTR为低电平,RTS输出高电平,此时DTR#输出高电平(3.3V),RTS#输出低电平(0V),NRST变为0V(复位),BOOT0为3.3V。之后需要延时 100ms 等待芯片复位完成。
延时 100ms后,上位机软件控制DTR为高电平,此时DTR#输出低电平(0V),RTS#维持输出低电平(0V),NRST信号被拉高变为3.3V,BOOT0为3.3V,表示复位结束,从系统存储器中运行。
下载后,上位机软件控制RTS#、DTR#输出都为高电平,恢复到刚开始的电平状态,此时BOOT0=0V, NRST维持为高电平3.3V,单片机进入Flash,等待复位启动程序。如若在软件勾选“编程后运行”,单片机将跳到主闪存存储器的地址(0x0800 0000)处开始自动执行代码,此时的RTS,DTR等各电平变化和不勾选其实是一致的。

在FlyMcu软件下载过程中, 右侧会显示RTS和DTR电平状态变化, 配合上面的波形图就很清晰了。RTS#, DTR#这里的“#”实际上就是取反的意思,因为采用的是负逻辑,所以实际上右侧的信息应为:
开始全片擦除(全片擦除时间会比较长,请耐心等候!)
全片擦除成功
DTR#电平置高(+3-+12V),复位
RTS#置低(-3 - -12V),选择进入BootLoader
…延时100毫秒
DTR#电平变低(-3 - -12V)释放复位
RTS#维持低 开始连接…4, 接收到:79 1F
在串口COM7连接成功@115200bps,耗时734毫秒
注意事项
- 下载程序时确保BOOT引脚配置正确。如果下载后可以运行,复位或重新上电后就不能运行,可能和BOOT0的设置有关。此外,原理图中的BOOT0需要通过100K的电阻接到地。
- 使用usb转串口芯片时,应采用适当的退耦电容(如0.1μF),以滤除电源噪声,确保稳定工作。
- 软件配置RTS和DTR电平时,使用的是负逻辑 。
相关文章:
STM32自动下载电路分享及注意事项
文章目录 简介ISP下载启动配置 USB转串口芯片CH340C手动isp下载自动isp下载RTS、DTR电平变化分析注意事项 简介 在嵌入式开发中,使用STM32下载程序,可以通过仿真器下载,也可以通过串口下载。在stm32串口下载时,我们需要手动配置启…...
【深度学习基础模型】极限学习机(Extreme Learning Machines, ELM)详细理解并附实现代码。
【深度学习基础模型】极限学习机(Extreme Learning Machines, ELM)详细理解并附实现代码。 【深度学习基础模型】极限学习机(Extreme Learning Machines, ELM)详细理解并附实现代码。 文章目录 【深度学习基础模型】极限学习机&a…...
把交换机的两个接口连接起来会怎么样?
当把交换机的两个接口连接起来时,可能会产生网络风暴,具体情况如下: 一、形成环路的过程 如果将交换机的两个端口直接连接,就会在网络中形成一个物理环路。例如,假设交换机有端口 A 和端口 B,用一根网线将…...
无人机陆空双模式。
🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&am…...
14. 文档对象模型
打开网页时,浏览器会检索网页的 HTML 文本并对其进行解析,就像第 12 章中的解析器解析程序一样。浏览器会建立一个文档结构模型,并使用该模型在屏幕上绘制页面。这种文档表示法是 JavaScript 程序在沙盒中的玩具之一。它是一种可以读取或修改…...
【计网】【计网】从零开始学习http协议 ---理解http重定向和请求方法
去光荣地受伤, 去勇敢地痊愈自己。 --- 简嫃 《水问》--- 从零开始学习http协议 1 知识回顾2 认识网络重定向3 http请求方法3.1 http常见请求方法3.2 postman工具进行请求3.3 处理GET和POST参数 1 知识回顾 前面两篇文章中我们学习并实现了http协议下的请求与应…...
yolov8/9/10/11模型在中医舌苔分类识别中的应用【代码+数据集+python环境+GUI系统】
yolov8、9、10、11模型在中医舌苔分类识别中的应用【代码数据集python环境GUI系统】 背景意义 目前随着人们生活水平的不断提高,对于中医主张的理念越来越认可,对中医的需求也越来越多。 传统中医的舌诊主要依赖于医生的肉眼观察,仅仅通过这…...
k8s部署安装
k8s部署安装 一 K8s集群环境搭建1.1 k8s中容器的管理方式1.2 k8s集群部署1.2.1 k8s环境部署说明1.2.2 k8s集群环境初始化1.2.2.1 所有节点禁用swap和本地解析1.2.2.2 所有节点安装docker1.2.2.3.所有节点设定docker的资源管理模式为systemd1.2.2.4.所有阶段复制harbor仓库中的证…...
gpt为什么可以依据上下文来回答问题,依据的是什么原理
GPT 可以依据上下文回答问题,主要依据以下几个原理: Transformer 架构: 并行计算与长距离依赖处理:Transformer 架构摒弃了传统的递归神经网络和长短时记忆网络的序列依赖处理方式,具有并行计算的能力。它可以同时处理…...
2023 CCPC哈尔滨 报告
比赛链接:Dashboard - 10.6组队训练赛-2023CCPC哈尔滨站 - Codeforceshttps://codeforces.com/group/w6iGs8kreW/contest/552949 做题数:3 题 三题都是队友写的。所以来补一下 B L J。 B题: B. Memory Little G used to be a participant …...
基于深度学习的手术中的增强现实导航
基于深度学习的手术中的增强现实(AR)导航技术是一种结合了先进的计算机视觉算法、深度学习模型与增强现实技术的创新应用。其主要目的是为外科手术提供实时的、精确的手术指导,帮助医生在复杂的手术过程中更好地理解患者的解剖结构࿰…...
输电线路缺陷图像检测数据集,导线散股,塔材锈蚀两类,分别为581张和1407张,标注为xml和txt格式 1988张
输电线路缺陷图像检测数据集,分为导线散股,塔材锈蚀两类,分别为581张和1407张,标注为xml和txt格式 数据集名称 输电线路缺陷图像检测数据集 (Transmission Line Defect Detection Dataset) 数据集概述 该数据集是一个专门用于训…...
百度飞桨(paddlepaddle)安装
百度飞桨(paddlepaddle)安装 Anaconda升级 打开 Anaconda Prompt (或者 Mac 下的终端),键入: conda upgrade --all pip 安装 python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/s…...
≌图概念凸显有长度不同的射线
黄小宁 【摘要】自有射线概念后的2300年里一直无人能知有长度不同的射线、无人能知有互不≌的射线,从而使数学一直有几何“常识”:任何射线都没有长度差别。保距变换和≌图概念使人能一下子看到有长度不同的射线。 变量x所取各数也均由x代表,…...
解决Nginx出现“Too many open files”的问题
解决Nginx出现“Too many open files”的问题 在那个不经意的瞬间,我感到一阵莫名的恍惚。同事突然提出要看我的手机,她的目光落在了我那泛黄的手机壳上。出乎意料地,她开始细心地擦拭,从内到外,动作轻柔而专注。那一刻…...
webGL进阶(一)多重纹理效果
效果: 代码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&q…...
flink-jdbc-driver
Flink JDBC 驱动程序是一个 Java 库,使客户端能够通过 SQL 网关将 Flink SQL 发送到 Flink 集群。 首先启动:1.flink集群,随意任何集群。 2.启动flink-sql-gateway: sql-gateway.sh start -Dsql-gateway.endpoint.rest.addresslo…...
快速的配置Prettier,让代码更整洁
快速的配置Prettier,让代码更整洁 一个人一个代码风格,先抛开语法的使用不谈,加不加空格、加不加分号也是萝卜白菜各有所爱,那怎么统一我们的代码格式呢 prettier 就是为我们解决这个问题的 1. 如何制定我们的代码风格 我们可以在…...
JavaEE: HTTPS的魅力与优势揭秘
文章目录 HTTPSHTTPS 是什么HTTPS 基本工作过程Fiddle 等抓包工具,为啥能解析 HTTPS 的数据? HTTPS HTTPS 是什么 HTTPS 是一个应用层协议,是在 HTTP 协议的基础上引入了一个加密层. 几个核心概念: 明文: 要传输的原始数据.密文: 把明文进行加密之后得到一个让别人不能理解…...
软件设计师——系统基础开发
📔个人主页📚:秋邱-CSDN博客☀️专属专栏✨:软考——软件设计师🏅往期回顾🏆:软件设计师——信息安全🌟其他专栏🌟:C语言_秋邱 一、软件工程概述 1.1、考…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
