手动下载 使用过51单片机的都知道,在下载程序的时候,需要对系统重新上电才能下载完成,也就是需要冷启动才可以下载,那么什么是冷启动,冷启动和复位的区别又是什么呢? 冷启动:单片机首次上电或断电后重新上电,单片机经过了完整初始化,包括硬件和外设的初始化。
复位:在已上电的情况下,通过复位引脚、看门狗等触发的复位信号,通常不重新初始化硬件,仅清除特定的寄存器或状态 类比一下就是,冷启动就相当于电脑运行中保存好数据后重启启动,复位就相当于强制对电脑进行重新启动。对单片机而言,单片机掉电,电量放完重新上电引起的复位,我们叫做冷启动复位;单片机不掉电,通过复位引脚或其他类型的复位,我们叫做热启动复位。也就是说冷启动是从系统无电到有电的过程,而热启动是系统在有电情况下的操作。 那为什么冷启动就可以下载程序而复位不行呢? 这是因为STC的程序分为引导区和程序区,引导区就是STC单片机出厂时,芯片内部已经预置的、固化的引导程序,这段程序的作用就是负责监控和判断单片机是否进入ISP模式,如果这段程序在启动时检测到来自上位机的下载请求,则进行下载程序,因此这段代码区又叫做ISP监控程序区(ISP区)。冷启动的时候,单片机会从ISP监控程序区开始执行,而复位时系统会跳过ISP区,直接从程序区的起始地址开始执行程序。 在STC单片机官方数据手册中,有关于冷启动复位和热启动复位的说明和描述。 单片机要进入下载模式,就需要从系统ISP监控程序区开始执行程序,我们可以通过冷启动复位实现。当单片机冷启动上电时,系统从ISP监控程序区开始执行程序,检测是否有合法的下载命令流,如果没有合法的下载命令流,就直接从用户程序区0000H处开始执行用户程序。这里的“合法下载命令流”指的是什么呢?在STC-ISP编程软件点击下载/编程按钮时,软件会以设置好的波特率向串口发送"0x7F"信号,直到MCU上电冷启做出响应,才停止发送“0x7F”信号,然后软件进入编程模式,单片机接收程序码将其写入flash程序存储器中,成功后立即运行用户程序。这里的“0x7F”信号就是我们说的“合法的下载命令流”。 我们再看到热启动复位这一栏的这句话: 我们发现通过对ISP_CONTR这个寄存器送入60H,同样可以实现和冷启动一样的现象——使系统从ISP监控程序区开始执行程序并且检测是否有合法的ISP下载命令流,也就是说我们通过对ISP_CONTR寄存器写入60H这个数据就可以实现自动下载程序了,这个效果和我们冷启动进行程序下载是一样的。 了解完冷启动下载的原理后,我们再来看一下51单片机的手动下载电路是怎样的,单片机下载程序就需要串口芯片和电脑进行通信,这里我们采用CH340N芯片,里面内置了晶振,引脚数少,使用起来更方便。我们只需将CH340N的芯片RX, TX ,对应连接到51单片机的TX,RX即可。电路如下图 该电路在下载程序时需要对单片机进行冷启动。这里要注意的是,当冷启动断电时,由于ch340的引脚会给单片机继续供电,可能会导致下载失败。所以这里在CH340N的TXD引脚反向接了一个二极管,在CH340N的RXD串联了一个300欧电阻,实现单片机彻底断电。 自动下载自动下载电路其实就是通过硬件或软件的方式,实现免手动冷启动功能。硬件上就是通过三极管,mos管或者其他硬件使电源复位一下,软件上就是通过对寄存器的相关操作实现软复位。 前面我们讲到通过对ISP_CONTR寄存器写入60H这个数据就可以实现自动下载程序了。这种方式实现的代码也有很多,我们以最简单的方式给大家做个示例。 以stc89c52rc单片机为例,查看其ISP_CONTR寄存器,其SFR地址为E7H,(其他单片机型号地址请查看手册),通过对B6, B5两位写1和0,我们可以实现软件选择从用户程序区启动还是从ISP程序区启动, 我们将SWBS和SWRST都写为1,其他位默认为零,即 0110 0000 = 0x60, 向地址为 E7H的寄存器 写入60H, 然后我们只要在程序下载的时候判断该寄存器的值是否为60H即可。那单片机如何判断程序是否下载呢? 当我们发送或者接收串口数据时起始位是零,因此我们可以通过检测单片机串口RXD端(P3.0口)是否变为低电平来判断程序是否正在下载中。 总结来说就是我们可以在P3.0口变为低电平时,向地址为E7H的寄存器写入60H这个数据, 即可实现自动下载程序。我们需要在编写的代码加上三句逻辑代码。 通过这种方式实现的自动下载有两点要注意,一是需要把if判断的语句放在while循环里面,二是使用这种方式会占用P3^0串口,如果程序有其他地方使用到这个口用这种方式就不太理想了,网上也有其他程序不占用串口资源的,这里不做过多介绍可以自行尝试,我们主要还是介绍通过ch340串口芯片的联络信号引脚来实现自动程序下载,实现方式也有很多,有三极管配合mos管使用的,有配合NE555使用的,我们就以较为简单的为例,看一下自动下载电路原理图: 主要原理是通过软件产生的RTS联络信号来控制mos管的通断,其实就是一个Mos管控制电源通断的一个应用,主要是由一个NPN的三极管和一个PMOS管构成,三极管在这里起到一个电平转换的作用,MOS管相当于一个控制电源通断的开关,当三极管的基极输入为高电平时,三极管Q1导通,PMOS栅极即U5 EN为低电平,Vgs= - vcc = -5V,MOS管导通, 5V电源输出开启。
当三极管基极输入为低电平时,三极管Q1断开,EN为高电平,Vgs=0V,MOS管截止,5V电源输出关闭。 因此通过此电路我们就可以实现单片机电源冷启动实现自动下载程序,而不用手动去控制电源的通断了。 我们用到的是CH340N芯片,该芯片没有DTR引脚,所以我们主要分析RTS引脚。 当我们在软件点击“下载/编程”按钮时,我们用逻辑分析仪拉一下RTS波形
可以发现一开始RTS一开始为高电平,当点击“下载/编程”后,RTS被拉低,拉低的时间跟下载程序的大小和设置的最低波特率和最高波特率有关,当下载完毕后RTS拉高,恢复为最初的高电平。 RTS、Vb、EN、5V引脚波形变化分析我们把几个关键的引脚拉下波形,看下它在自动下载过程是怎么变化的。主要观察RTS和Vb、Vb和EN、EN和5V这三对引脚的波形变化。
RTS–Vb
刚开始RTS为5V高电平,Vb为0V低电平,当点击编程时RTS拉低, RTS由5V变为0V,由于电容两端不能突变,Vb也会随之拉低5V,变为-5V,随着电容开始缓慢充电,充电完成Vb为低电平0V,下载完成后RTS拉高恢复成高电平5V。 Vb–EN
上电后Q1导通,Vb被钳位在0.7V,三极管导通后EN为低电平0V,随着RTS拉低,Vb也拉低为-5V,此时Q1关断,EN由低电平0V变为高电平5V,随着电容开始充电,Vb电位开始升高,升高到使Q1导通时,EN又变为低电平。这样EN就从低->高->低的电平变化,实现对MOS管的通断控制。 EN–5V
当EN为低电平0V时,Vgs= - VCC = - 5V,PMOS管导通,5V电源得电为高电平5V;当EN为高电平5V时,Vgs = 0V, 此时MOS截止,5V电源断开为低电平0伏;当EN从高电平5V变为低电平0V时,PMOS重新导通,5V电源通电为高电平5V。
这样我们就通过硬件实现了5V电源的自动通断,接上单片机后,就可以实现免手动冷启动下载了。 整个过程的电平变化用草图画了一下就是这样: 总结本文介绍了51单片机的自动下载的实现过程,一是通过代码去实现,二是通过硬件CH340N串口芯片的联络信号控制引脚,利用RTS的电平变化去控制MOS管的电源通断,实现自动下载。需要注意的是MOS管的选取和电容、电阻参数的选取会对下载电路产生影响,这里选取PMOS管AO3401,注意源极和漏极的方向不要接反,C8电容的容值如果选取过大,会影响下载的速度。只有选取合适的参数,才可以正确实现功能。
|