STM32自动下载电路分享及注意事项

news2024/11/18 13:43:21

文章目录

  • 简介
  • 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,系统存储器被选为启动区域,即系统引导模式。

  1. 程序运行模式:启动用户程序,执行从闪存中加载的应用。 大白话:运行程序

  2. 系统引导模式:允许从特定接口(如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下载程序并运行的过程如下:

  1. 配置启动模式:BOOT0 = 1, BOOT1= 0
  2. 进入bootloader:按下复位按钮,准备接收数据
  3. 存储到Flash:上位机开始发送程序,单片机通过串口接收代码数据
  4. 重新配置启动模式:下载完成后,BOOT0 = 0, BOOT1 = 0
  5. 运行Flash中的代码:按下复位按钮,运行下载的程序代码。

可以看到,每次下载程序,然后运行程序的时候,我们都需要手动配置BOOT启动模式,对应在硬件上, 就是每次都要切换跳线帽,而且每次都要按复位,这样子多少有点麻烦,于是就有了自动isp下载电路。

自动isp下载

自动isp下载电路,可以实现自动下载,就不需要去手动配置BOOT启动模式和每次都要按复位了,那肯定是有其它电路控制实现这个功能了,这个自动下载电路,肯定要能在下载程序的时候,自动配置启动模式和自动复位,这就是我们说的实现自动下载电路需要满足的电压条件,所以简单来说,STM32自动下载电路的原理是基于单片机的启动模式和外部电路控制。具体来说:

  1. 启动模式选择:STM32具有多种启动模式,其中通过BOOT0引脚的高低电平控制单片机进入内置引导程序,从而实现固件下载。如果BOOT0为高电平,单片机会进入下载模式,允许通过串口接收新程序。

  2. 复位控制:在下载过程中,通过NRST引脚将单片机复位,确保其处于可编程状态。通常使用NPN晶体管控制NRST引脚的高低电平,以实现自动复位。

  3. 通信接口:USB转串口模块连接至STM32的TX和RX引脚,负责与PC端进行数据传输。通过串口发送的下载命令和数据,将新的固件烧录到单片机中。

和手动下载电路不同的是, 自动下载电路使用ch340c串口芯片时,使用到了RTS#和DTR#两个联络信号引脚。

在这里插入图片描述

自动isp下载程序并运行的过程如下:

  1. 配置启动模式: BOOT1固定为0(BOOT1=0),CH340_RTS输出低电平,Q2导通,BOOT0被拉高,BOOT0 = 1
  2. 进入bootloader:CH340_DTR=1,Q1导通,NRST被拉低,延时100ms;延时后CH340_DTR拉低,CH340_RTS维持拉低,完成一次复位,准备接收数据。
  3. 存储到Flash:上位机开始发送程序,单片机通过串口接收代码数据
  4. 重新配置启动模式:接收完成后,CH340_RTS为高电平,Q2截止,BOOT0 = 0
  5. 运行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毫秒

注意事项

  1. 下载程序时确保BOOT引脚配置正确。如果下载后可以运行,复位或重新上电后就不能运行,可能和BOOT0的设置有关。此外,原理图中的BOOT0需要通过100K的电阻接到地。
  2. 使用usb转串口芯片时,应采用适当的退耦电容(如0.1μF),以滤除电源噪声,确保稳定工作。
  3. 软件配置RTS和DTR电平时,使用的是负逻辑 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2178906.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

gradle的入门及kotlin的了解

gradle项目创建方式 1.idea springboot initalizer 2.命令行 gradle目录结构 gradle命令 gradle wrapper 一个解决不同项目需要不同版本gradle的问题 比如,对方电脑没用安装gradle 对方电脑安装了gradle,但是版本太旧了 于是,在项目根目…

Qt 学习第十一天:QTableWidget 的使用

一、创建QTableWidget对象,设置大小,在窗口的位置 //创建tablewidgetQTableWidget *table new QTableWidget(this);table->resize(550, 300);table->move(100, 100); //移动 二、设置表头 //设置表头QStringList headerList; //定义headerList…

Webpack 特性探讨:CDN、分包、Tree Shaking 与热更新

文章目录 前言包准备CDN 集成代码分包Tree Shaking原理实现条件:解决 treeShaking 无效方案:示例代码: 热更新(HMR) 前言 Webpack 作为现代前端开发中的核心构建工具,提供了丰富的特性来帮助开发者优化和打…

63.5 注意力提示_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录注意力提示生物学中的注意力提示查询、键和值注意力的可视化使用 show_heatmaps 显示注意力权重代码示例 代码解析结果 小结练习 注意力提示 🏷sec_attention-cues 感谢读者对本书的关注,因为读者的注意力是一种稀缺…

Python 读取与处理出入库 Excel 数据实战案例(HTML 网页展示)

有如下数据,需要对数据合并处理,输出到数据库。 数据样例:👇 excel内容: 出入库统计表河北库.xlsx: 出入库统计表天津库.xlsx: 01实现过程 1、创建test.py文件,然后将下面代码复制到里面,最后…

original多因子图绘制

成品参考 首先导入数据 设置过程 设置X轴 设置图 双击空白部分设置图层宽度(也需要设置高度) 颜色配置 1.删除边框 合适的参数与颜色(设置为单色)

PDF转换为TIF,JPG的一个简易工具(含下载链接)

目录 0.前言: 1.工具目录 2.工具功能(效果),如何运行 效果 PDF转换为JPG(带颜色) PDF转换为TIF(LZW形式压缩,可以显示子的深浅) PDF转换为TIF(CCITT形…

Squaretest单元测试辅助工具使用

1、idea安装插件 Squaretest 然后关掉idea 2、安装字节码软件(jclasslib) 3、找到idea里面的Squaretest安装目录 找到包含TestStarter的jar包 4、打开 com.squaretest.c.f 打开后选择常量池 5、找到第16个修改 Long value值,修改的数字即为使…

英飞凌 PSoC6 评估板 Wi-Fi 无线通信

PSoC™ 62 with CAPSENSE™ evaluation kit 开发板(以下简称 PSoC 6 RTT 开发板)是英飞凌(Infineon)联合 RT-Thread 发布一款面向物联网开发者的 32 位双核 MCU 开发套件,其默认内置 RT-Thread 物联网操作系统。本文主…

[RabbitMQ] 7种工作模式详细介绍

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

【Linux】如何用shell脚本一键安装Java和Maven环境

Shell脚本安装环境 前言脚本Java安装脚本使用方式 Java卸载脚本Maven安装脚本Maven卸载脚本 前言 无论是在云服务器上部署Java项目 还是在本地的Linux虚拟机上运行Java项目 都需要Java的环境 设置环境则需要一些繁琐的操作 为了简化并复用这些操作 我们可以封装这些操作为一个…

AD导出gerber文件(光绘文件)

第一步: 英寸 2:5 勾选你想显示的层 默认默认 第二步: 第三步: 默认

开关电源为什么要进行负载测试,负载测试都包含哪些项目?

开关电源在现代电子设备中占据着重要的地位,其性能的稳定性和可靠性直接影响着电子设备的正常运行。为了确保开关电源的质量,需要对其进行负载测试。负载测试可以模拟实际工作环境中的负载情况,检测开关电源在不同负载条件下的输出特性、稳定…

如何创建虚拟环境并实现目标检测及验证能否GPU加速

创建虚拟环境: 先创建一个虚拟python环境,敲如下代码 然后再到该虚拟环境里面安装自己想要的包 激活虚拟环境 然后再聚类训练这些 验证GPU加速 阿里源 pip install torch torchvision -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mir…

Python的风格应该是怎样的?除语法外,有哪些规范?

写代码不那么pythonic风格的,多多少少都会让人有点难受。 什么是pythonic呢?简而言之,这是一种写代码时遵守的规范,主打简洁、清晰、可读性高,符合PEP 8(Python代码样式指南)约定的模式。 Pyth…

线段树及应用

目录 1. 线段树基础 (1)什么是线段树 (2)线段树的拆分原理 (3)相关算法对比 (4)线段树的使用前提 (5)线段树建树操作 (6)线段树…

Unity 编辑器多开

开发多人联机的功能时大多数会遇到测试机不方便的问题。想多开同一个项目Uinty又禁止。。。因为在使用Unity Editor打开一个项目时,Unity Editor会在项目目录建立一个Temp目录,同时对里面的一个UnityLockfile文件进行加锁。SO...可以使用以下方法进行多开…

macOS 开发环境配置与应用开发

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

【CSS Tricks】css动画详解

目录 引言动画关键帧序列动画各属性拆解1. animation-name2. animation-duration3. animation-delay设置delay为正值设置delay为负值 4. animation-direction5. animation-iteration-count6. animation-fill-mode7. animation-play-state8. animation-timing-function非阶跃函数…

【2025】基于Django的鱼类科普网站(源码+文档+调试+答疑)

文章目录 一、基于Django的鱼类科普网站-项目介绍二、基于Django的鱼类科普网站-开发环境三、基于Django的鱼类科普网站-系统展示四、基于Django的鱼类科普网站-代码展示五、基于Django的鱼类科普网站-项目文档展示六、基于Django的鱼类科普网站-项目总结 大家可以帮忙点赞、收…