STC支持通过串口进行ISP/IAP,但每次烧写程序时都要对单片机进行掉电再上电操作。在项目开发中不免要进行多次程序烧写调试,每次都进行对单片机掉电再上电就很麻烦了,为此我查阅了一些资料,目前主流的自动下载解决方法分为3类:
1. 在程序中,通过单片机自带的串口检测下载命令流。
简单来说,就是在主程序中不断的检测串口接收到的数据是否为下载命令流,如果是,就通过软件对单片机进行软复位烧写程序。优点:不需要任何的外围器件,完全通过软件实现。缺点很明显,占用了一个串口,每个项目中都要增加下载流检测程序,增加程序大小。
注:下载命令流是下载之前发送的一串特定的数据。
2. 通过低成本的单片机检测下载命令流,对目标单片机进行硬件重启。
这种方法是市面上普遍采用的方法,与方法一不同的是将下载命令流的检测工作交给STC15W104等小体积、低成本、引脚少单片机进行,虽然改进了方法一中提到的缺点,但成本增加了很多(至少1元),而且15W104单片机没有串口,是通过软件进行模拟,有可能导致检测不到下载流,不能每次都触发重启电路。
3. 通过MODEM联络输出信号RST(#)/DTR(#)。
CH340芯片中,RST(#)/DTR(#)引脚会在下载程序过程中由高变低(或者由低变高),发生一次电平跳变。
无下载信号时,RST引脚为高电平,无电平跳变,由Q1和Q2造成的单稳态振荡电路处于稳态,Q1导通,Q2截止,Q3导通,为单片机供电。
有下载信号时,RST引脚发生电平跳变(由高到低),通过耦合电容C13,向Q1的基极发送一个负脉冲信号,Q1截止,Q2导通,Q3截止,单片机断电。同时负脉冲使E2放电,E2两端形成电压差,脉冲结束后,E2充电,电路处于非稳态,经过一段时间T0后,电路重新恢复稳态,Q1导通,Q2截止,Q3导通,恢复单片机供电。
T0与R12和E2的值有关,计算式为:
T0 = 0.7*R12*E2
在实际应用中,100%能响应,稳定性高,成本也很低。但是在使用串口通信时,也会错误的触发电路,在此我提出的解决方法是RTS信号输入端加一个三极管Q4,用于控制信号流入,相当于阀门。控制该阀门由两种方法:
1) 通过手动将Q4基极,接高电平时允许信号流入,用于程序下载;接低电平时三极管截止,不允许信号流入,用于串口通信。
2) 通过单片机引脚控制。STC单片机中,增加P4口,29-31功能引脚与P4口复用。我们可以在IO口充足的情况下,使用P4口来控制三极管导通与否(单片机默认IO口为高电平,调试过程中发现30脚只有1V左右,不知道为什么。。。)。这样操作非常方便,使用串口通信时,在串口初始化函数中加一句:CH_OE = LOW,就可以避免这个BUG。
基于自动下载电路,我用万用板搭建一个STC89/90/12(DIP40)单片机系统板,测试上百次,无一失败,稳定性强,原理图如下: