解决STM32接入CH340芯片升级电路初始化进入升级模式时可能出现的死机问题
目录
1. 问题描述
我所用的CH340G(CH340K也用过)接在MCU的电路中,在插入CH340G/K 的接插件(TYPE-C或其他)后MCU就会卡死,这种现象实际上是MCU进入了升级模式导致的。
解决方式从CH340G/K 的升级电路入手。
2. 问题分析
2.1 CH340G/K 的初始化波形
初始化波形:
- RST#,CH340G的RST#引脚,低电平有效(正常情况是高电平);
- DTR#,CH340G的DTR#引脚,低电平有效(正常情况是高电平);
2.2 第1种USB升级电路
此电路简单:
- CH340G/K 的DTR# 接-> MCU-BOOT0
- CH340G/K 的RTS# 接-> MCU-REST
- CH340G/K 的 RST# 直连 MCU-REST,并上拉直3.3V;
- CH340G/K 的 DTR# 直连 MCU-BOOT0,并下拉直地;
升级,时配置:
出现问题:
MCU正常工作时,插入TYPE-C瞬间,CH340G/K 初始化,初始化波形如第2.1章节。
此时,在RST#上升沿结束时,即MCU复位完成时,DTR为高电平,即BOOT0为高电平,MCU进入升级模式,问题出现了。
这种电路可以正常升级,只要不插入TYPE-C 或其他CH340G/K 的接口 可以正常工作。
2.3 第2种USB升级电路
把第一种电路反过来连接,也不行,原因是,DTR#和RST#是同时完成上升沿动作的。
这种电路可以正常升级,只要不插入TYPE-C 或其他CH340G/K 的接口 可以正常工作。
2.4 第3种USB升级电路
在第1种电路的基础上,将DTR#反向,即利用PNP三极管电路:
这样做的目的是在 MCU-REST 完成上升沿后检测到的 MCU-BOOT0 电平为低电平,R51不焊。
CH340G/K 的 RST# 直连 MCU-REST,并上拉直3.3V;
结果,发现也不行,现象同上。
这种电路可以正常升级,只要不插入TYPE-C 或其他CH340G/K 的接口 可以正常工作。
2.5 第4种USB升级电路
如2.4章节,CH340G/K 的 RST#结束上升沿时,MCU-BOOT0检测到的电平为低电平,问题依旧,故问题应该在波形另一端,波形开始位置,MCU-REST 应该最先拉低???
试一下,在2.4章节的基础上,将CH340G/K 的 RST# 与 DTR# 反接:
CH340G/K 的 DTR# 直连 MCU-REST,并上拉直3.3V;
上电,插入TYPE-C ,MCU不再死机,继续正常工作。
注:这种电路存在一个问题,插入TYPE-C时 ,MCU虽不再死机,但是会重启,这是因为 DTR# 直连MCU的RESET引脚,一旦CH340G/K初始化,MCU将会复位。
此时,CH340G/K 的升级配置应为:
升级时,CH340G/K 的 引脚状态:
2.6 第5种USB升级电路
由第4种升级电路可知,在CH340G/K 初始化时,CH340的DTR#脚控制MCU的RESET引脚,因为MCU完成复位时,MCU的BOOT0为低电平,MCU不会进入升级模式,但问题在于在CH340G/K 初始化时,MCU依旧会复位,也就是插入TYPE-CMCU就会重启,在某些情况下,这个不是我们想要的结果。
由章节2.1中的初始波形图片可知,CH340G/K 的 DTR# 先拉低,DTR# 和 RTS# 同时拉高,DTR# 低电平保持时间较长,为防止 DTR# 的低电平造成MCU复位,可以通过 RTS# 控制 DTR#,也就是在 RTS# 为低电平器件,使 DTR# 无法下拉至低电平。
在章节2.5中的电路基础上增加PNP三极管,如下图:
- 在 RTS# 为高的情况下,MCU的NRST无法被拉低,因为三极管无法截止,MCU不会复位;
- 在 RTS# 为低的情况下,DTR# 为低,三极管无法截止,MCU不会复位;
其他部分电路:
BOOT0控制部分:
复位部分:复位里面的电容可能对启动造成延时,导致MCU启动失败,必要时去掉或者选择容值较小的电容
插入TYPE-C 后,MCU引脚电平变化:
可知,RESET不会被拉低,MCU不会复位;
经过观察,插拔TYPE-C数据收发正常,不会中断。
此时,CH340G/K 的升级配置应为:
注: 如果电路走线过长可能导致电平略微延时造成误触发,可在下图位置加入100nF(可调)的电容;
2.7 整理一下最终的电路形态
图1
图2
3. 总结
在 CH340G/K 初始化时:
- MCU-REST 在 MCU-BOOT0 处于低电平状态下,进行下拉操作,在MCU-REST 与 MCU-BOOT0 恢复正常电平时,将导致MCU死机,MCU-REST 先于 MCU-BOOT0 下拉可解决该问题;
- MCU-REST 在 上升沿结束时将判断 MCU-BOOT0 的状态,MCU-BOOT0 处于高电平,MCU死机,MCU-BOOT0 处于低电平 MCU 正常;
作者:LuDvei