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

news/2024/12/22 1:15:17/

文章目录

  • 简介
  • 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.ppmy.cn/news/1534030.html

相关文章

加密与安全_TOTP 一次性密码生成算法

文章目录 PreTOTP是什么TOTP 算法工作原理TOTP 生成公式TOTP 与 HOTP 的对比Code生成TOTP验证 TOTP使用场景小结 TOTP 与 HOTP 的主要区别TOTP 与 HOTP应用场景比较TOTP 与 HOTP安全性分析 Pre 加密与安全_HTOP 一次性密码生成算法 https://github.com/samdjstevens/java-tot…

计算机毕业设计 基于Python的无人超市管理系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

CSP-JS 复赛复习 习题记录——字符串(东方博宜OJ)

家人们,这不要考CSP复赛了嘛,就做了几个复习题单,和大家分享分享,也就随便做做, 望大家多多关照! 网址:东方博宜OJ - 字符串 题单 食用说明:这次的题 太简单了 还不算太难&#xff0…

MySQL安全加固

MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。…

【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现

高阶数据结构相关知识点可以通过点击以下链接进行学习一起加油! 本章是高阶数据结构笔记的第一篇文章,将分享二叉搜索树的进阶概念及其高效实现的相关知识,欢迎大家阅读! 🌈个人主页:是店小二呀 &#x1f3…

检查cuda和显卡的可用性

检查cuda和显卡的可用性 import torch device_gpu torch.device(cuda if torch.cuda.is_available() else cpu) print(device_gpu) print(torch.cuda.is_available())

Python、C++、java阶乘算法

最近,我除了Python还学了C和Java,然后在网上看到编程考题:阶乘。 首先,我们先理解什么是阶乘。 阶乘是数学中的一个概念,通常定义为从1乘到指定的数。具体来说,一个正整数的阶乘(记作n!&#…

在之前文章基础上,修改实现光柱在两种颜色之间的平滑渐变效果

为了使之前文章的光柱实现渐变发光效果,我们可以利用 THREE.ShaderMaterial 来自定义材质,并通过时间动态改变材质的颜色属性。以下是如何修改和扩展上述代码以实现这一效果: 引入必要的模块:确保引入了 ShaderMaterial, UniformsUtils, Clock 等必要的模块。定义自定义着色…