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

文章目录

简介

在嵌入式开发中,使用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电平时,使用的是负逻辑 。
相关推荐
国科安芯21 小时前
航天器多路并联大功率电源系统设计与ASP4644均流特性分析
单片机·嵌入式硬件·fpga开发·安全性测试
茯苓gao1 天前
嵌入式开发笔记:CANopen相关移位运算与通信协议术语详解
网络·嵌入式硬件·学习·信息与通信
梁朝辉1 天前
STM32H750VBT6中ADCINP与INN什么区别
stm32·单片机·嵌入式硬件
省四收割者1 天前
一文详解信号完整性(1)
python·嵌入式硬件·数学建模·信息与通信·信号处理·智能硬件
崇山峻岭之间1 天前
单片机无感FOC驱动之ADC
单片机·嵌入式硬件
Ligocious1 天前
1.点亮一颗小小的LED
单片机·嵌入式硬件
KaifuZeng1 天前
通信与接口协议面试八、CAN通信
单片机·嵌入式硬件·面试·通信与接口协议
智源单片机设计1 天前
基于单片机的直流电机双闭环调速系统设计
单片机·嵌入式硬件
kebidaixu1 天前
两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 芯片详解
stm32
kebidaixu1 天前
两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 芯片调试实录:四个关键问题与解决方案
stm32