雁过留声 发表于 2024-10-9 23:11:18

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

简介

在嵌入式开辟中,使用STM32下载程序,可以通过仿真器下载,也可以通过串口下载。在stm32串口下载时,我们需要手动配置启动模式,为了方便进行程序的更新和下载,于是有了自动ISP下载电路。本文将分享关于STM32自动下载电路的实现过程和原理。
ISP下载

ISP,即In-System Programming,在线编程。具有ISP功能的单片机芯片,可以通过简单的下载线直接在电路板上给芯片写入大概擦除程序,并且支持在线调试。 一样平常而言,ISP都需要一些上位机来配合操纵,好比stm32常用的软件是FlyMCU,mcu isp软件。对于stm32,ISP下载,又分为手动ISP下载和自动ISP下载。
启动配置

对于stm32,有几种启动模式需要配置。体系存储器启动就是通过ISP下载。我们可以查看stm32参考手册,内里有关于启动模式的配置。
https://i-blog.csdnimg.cn/direct/7dbb0531c3ae4694b422b1b3eb5b1128.png
这里的启动模式怎么明白呢?简单来说,STM32的启动模式决定了芯片上电或复位后实行的操纵,启动模式前两种我们用的比较多,这里重要讲解这两种启动模式,我们可以简单明白为有两种模式。第一种模式BOOT1=X, BOOT0 = 0,(这里BOOT1=X, 意思就是:是 0是1都可以),主闪存存储器被选为启动区域,即程序运行模式; 第二种模式, BOOT1=0,BOOT0=1,体系存储器被选为启动区域,即体系引导模式。

[*] 程序运行模式:启动用户程序,实行从闪存中加载的应用。 大白话:运行程序
[*] 体系引导模式:答应从特定接口(如UART、USB等)加载新固件,用于程序下载和更新。 大白话:下载程序
这里我们可以看到对于前两种模式,BOOT1的状态只要保持为0即可,所以一样平常我们都是通过配置BOOT0引脚状态来控制单片机是下载还是运行。STM32在启动时会检查BOOT引脚的状态,以决定从哪个存储位置加载程序。
可以把STM32的启动模式比作一栋大楼的入口。


[*] 正常入口:当你从主入口(程序运行模式)进入时,你直接进入大楼,开始进行你本来的运动(运行用户程序)。
[*] 特别通道:如果你选择了侧门(体系引导模式),就好比你在大楼外进行一些特殊操纵,好比吸收新的指令或进行维修(程序下载)。
通过选择差别的入口,用户可以灵活地进入大楼并实行差别的操纵,就像通过设置BOOT引脚状态来控制STM32的启动模式。本质上,是单片机可以选择从差别的位置运行程序,我们可以看下下面这张表。
https://i-blog.csdnimg.cn/direct/3e0396d05b9a4592a82a5428a763f194.png
体系引导模式有一段程序专门用来下载代码,这段程序叫bootlaoder,也叫自举程序,存储在stm32的内部体系存储器中,它的作用是吸收串口外设发送的程序数据并放置到flash中,运行的起始所在是0x1FFF F000。在ROM区的0x0800 0000位置,存储的就是编译后的程序代码。
自举程序在手册上是这样形貌的。
https://i-blog.csdnimg.cn/direct/83c5dd2b6dc04f768dba39b615446b4f.png
对于stm32f103c8t6,属于中容量产品,这也是为什么我们通常通过串口1的PA9、PA10这两个串口引脚下载程序。现在我们对启动模式有了一定了解了,我们再回过头看手册。
https://i-blog.csdnimg.cn/direct/9a914d574889408aa3f9031b93c3b4dd.png
我们留意手册里的这句话:在体系复位后, 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。
https://i-blog.csdnimg.cn/direct/686b5fbb8c0e4d34b1c64b76bca213a3.png
这里只对我们用到的几个引脚进行介绍,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)。
https://i-blog.csdnimg.cn/direct/a8102729dd5a4e93897b7e6e6deff927.png
手动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#两个联络信号引脚。
https://i-blog.csdnimg.cn/direct/e7212d6c7baa49bda1afb8ff2db0f990.png
自动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#是由上位机软件控制的,所以猜想可能跟软件有关。
https://i-blog.csdnimg.cn/direct/8baf5546cc7f432e80827ccbdf2b4afd.png
https://i-blog.csdnimg.cn/direct/29ca6568dddd4e0886c16a3c1fe585b4.png
于是把FlyMcu软件换成了mcuisp 软件。
https://i-blog.csdnimg.cn/direct/51f88e88950a4be38bf5370753e2779b.png
NICE! 这个波形就很完美,和我们前面分析的波形同等。我们再来分析一下这个时序图。
https://i-blog.csdnimg.cn/direct/00bb0ce0f1254e1cba8fe0069894b032.png
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等各电平变革和不勾选其实是同等的。
https://i-blog.csdnimg.cn/direct/b5c1a943f05c4238ba8b2b672daa49bc.png
在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电平时,使用的是负逻辑 。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: STM32自动下载电路分享及留意事项