关于ESP8266自动下载和CH340的几件事

2023-10-30

最近在玩ESP8266,做了些东西,比如考研倒计时器、网络闹钟、网络灯(用手机控制亮度)、气象站等等。

ESP8266本身挺简单的,倒是这个自动下载电路,我还是第一次玩,以前玩51也用过串口下载,都是自己冷启动,玩STM32用的ST-LINK,直接下载。

现在才发现其实可以设计一个自动下载电路,根据不同的MCU下载的条件不同,电路设计也有区别。

这里我就简单说一下ESP8266的自动下载电路以及CH340芯片的一个坑。

 

原理图如下:

使用的是CH340C,实际上其他型号也差不多,CH340C相比CH340G就是少用个晶振。

可以看到相比普通的串口,此电路中将CH340的RTS(注意不是RST)和DTS引出,通过右侧电路,构成自动下载电路。

那么ESP8266如何进入下载模式呢。很简单,两句话。

1.在复位上升沿时,如果BOOT为1,则进入运行模式,此时内部程序正常运行。

2.在复位上升沿时,如果BOOT为0,则进入运行模式,此时可通过串口下载程序。

那么要想进入下载模式,一开始我的想法是应该是RST和BOOT都为0,然后RST置为1,这样RST就有一个上升沿,且BOOT为0。这句话先放这,我们再来看。

那么现在分析一下右侧电路逻辑。

DTR = 0,RTS = 0,此时Q1截止,Q2截止,RST= 1,BOOT= 1;
DTR = 0,RTS = 1,此时Q1截止,Q2导通,RST= 1,BOOT= DTR = 0;
DTR = 1,RTS = 0,此时Q1导通,Q2截止,RST= RTS = 0,BOOT= 1;
DTR = 1,RTS = 1,此时Q1截止,Q2截止,RST= 1,BOOT= 1;

你会发现无法出现RST= 0,BOOT= 0。但是我们上面分析中需要RST= 0,BOOT= 0,好像无解啊。那么这个电路怎么实现ESP8266自动下载呢。

在官方的 SDK 中的下载脚本源码中有如下代码:

def _connect_attempt(self, mode='default_reset', esp32r0_delay=False):
        """ A single connection attempt, with esp32r0 workaround options """
        # esp32r0_delay is a workaround for bugs with the most common auto reset
        # circuit and Windows, if the EN pin on the dev board does not have
        # enough capacitance.
        #
        # Newer dev boards shouldn't have this problem (higher value capacitor
        # on the EN pin), and ESP32 revision 1 can't use this workaround as it
        # relies on a silicon bug.
        #
        # Details: https://github.com/espressif/esptool/issues/136
        last_error = None

        # If we're doing no_sync, we're likely communicating as a pass through
        # with an intermediate device to the ESP32
        if mode == "no_reset_no_sync":
            return last_error

        # issue reset-to-bootloader:
        # RTS = either CH_PD/EN or nRESET (both active low = chip in reset
        # DTR = GPIO0 (active low = boot to flasher)
        #
        # DTR & RTS are active low signals,
        # ie True = pin @ 0V, False = pin @ VCC.
        if mode != 'no_reset':
            self._setDTR(False)  # IO0=HIGH
            self._setRTS(True)   # EN=LOW, chip in reset
            time.sleep(0.1)
            if esp32r0_delay:
                # Some chips are more likely to trigger the esp32r0
                # watchdog reset silicon bug if they're held with EN=LOW
                # for a longer period
                time.sleep(1.2)
            self._setDTR(True)   # IO0=LOW
            self._setRTS(False)  # EN=HIGH, chip out of reset
            if esp32r0_delay:
                # Sleep longer after reset.
                # This workaround only works on revision 0 ESP32 chips,
                # it exploits a silicon bug spurious watchdog reset.
                time.sleep(0.4)  # allow watchdog reset to occur
            time.sleep(0.05)
            self._setDTR(False)  # IO0=HIGH, done

        for _ in range(5):
            try:
                self.flush_input()
                self._port.flushOutput()
                self.sync()
                return None
            except FatalError as e:
                if esp32r0_delay:
                    print('_', end='')
                else:
                    print('.', end='')
                sys.stdout.flush()
                time.sleep(0.05)
                last_error = e
        return last_error

代码很明了了。也就是两个过程:

1.设置 DTR = 1,RTS = 0,此时 Q1 导通,Q2 截止,RST= RTS = 0,BOOT= 1,芯片掉电复位;

2.设置 DTR = 0,RTS = 1,此时 Q1 截止,Q2 导通,RST= 1,BOOT= 0,芯片重新上电;

当时我就懵了,因为按照代码,逻辑图如下

在RST上升沿时BOOT才刚下降,这是不是有点太冒险了、后来我想了想,考虑到RST有电容的存在,有充放电的过程,BOOT是没有电容的,所以下图才是正确的。

可以看到,在RST判定为1时,BOOT为0。此时就进入下载模式了。

 

 

OK,到这里ESP8266和ESP32的自动下载电路就分析完了,其实设计其他MCU的串口自动下载电路思路大抵相同,需要补充的是,CH340的辅助引脚是由上位机控制的,所以设计电路就需要了解上位机控制逻辑。

 

最后还有个CH340的坑。我在做好我的小设计后,本来以为能愉快的玩耍了,直到今天我做了个带电池的闹钟,才发现一个问题。

前几个小作品没有用到电池,闹钟用到了。没有电池的作品直接用USB供电,同时USB也是CH340串口。而带电池的闹钟,USB可以供电,也是CH340串口,同时也能使用电池供电。

区别就在于没有电池时,直接插上USB后,供电和通信同时进行,有电池时,插上USB后,只增加了通信。坑来了,后者由于有电池已经开始运行了,插上USB后,CH340会通过自动下载电路给ESP8266一个复位。

这时就很难瘦了,假如我代码都写好了,平时电池供电正常用着呢,这时我要电池充电了,于是插上USB,结果CH340直接给我复位了,虽然说复位并不会影响闹钟的时间、设置什么的(因为关键数据我保存到FLASH了),但是插上USB充电就复位也太坑了吧。

而且我的闹钟在响铃时,只要插上USB,立马复位,于是闹钟不响了。

说这么多,归根结底就是插上USB后,CH340和电脑连接正常,于是给RTS#一个低电平,通过下载电路,RST为0,于是芯片复位。

 

解决办法很简单(但我百度找了很长时间,终于找到问题所在),那就是。。。。。。。更新CH340驱动。。。。。。

噗,哈哈,没错,就是驱动问题,必须要2019年的驱动(截止2021/5/13,WCH官网最新的驱动是2019年的),所以这个问题属于WCH公司自己的锅。

我反复安装2014年版本(就是以前买各种板子淘宝卖家送的资料包里的)以及我在WCH官网下载的最新2019版,反复测试后,确定就是驱动问题。

为了避免其他问题,哪怕你没有我上面说的这个困扰,也把CH340驱动更新一下吧,说不定还有其他的坑。

贴一下下载地址,我知道你懒得找:http://www.wch.cn/downloads/CH341SER_ZIP.html

点进去就是最新驱动下载页面。

 

 

哦对了,实测CP210x系列没有这个问题,CP210x还是稳啊,目前我的CP210x驱动是2016年的。

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于ESP8266自动下载和CH340的几件事 的相关文章

  • 从一个程序中启动和关闭另一个程序

    今天正在编写的程序是一个插件 PlugIn 插件其实就是一个动态链接库 可以被主程序装入内存中 并调用插件中按照主程序规定编写的函数 由于插件受制于主程序 因此我必须另外提供一个程序可以扩展插件的功能 于是乎 我就编写了一个更加复杂的程序来
  • JSTS学习(一) - 简介

    JSTS是一个符合OGC规范的简单要素空间位置判定函数JavaScript库 JSTS也是Java类库JTS的一个接口 且与OpenLayer3具有互操作性 目前原生的OpenLayers3并不支持空间拓扑关系查询 此类库可以作为重要的补充
  • 前端面试题汇总

    前端面试题汇总 一 Html css js 1 Html5新增的语义化标签有哪些 语义化标签的优点 提升可访问性 SEO 结构清晰 利于维护 header页面头部 main页面主要内容 footer页面底部 Nav导航栏 aside侧边栏

随机推荐

  • pyqt5弹出提示框

    弹窗的分类 1 软件关闭提示弹框 2 信息提示弹框 3 错误提示弹框 4 信息警告弹框 5 关于弹窗 模块导入 from PyQt5 QtWidgets import QMessageBox 1 软件关闭弹框 这类的弹框一般是在整个软件关闭
  • Shell脚本入门 03:字符串与数组

    文章目录 目的 字符串 获取字符串长度 拼接字符串 截取字符串 替换字符串 判断与默认值 内嵌文档与内嵌字符串 内嵌文档 Here Document 内嵌字符串 Here String 数组 数组定义与使用 获取数组长度 拼接数组 删除数组
  • UBUNTU20.04配置qt+vtk+pcl+libtorch+cuda+cudnn+tensorrt开发环境

    总目录 1 环境及版本说明 2 下载并安装Qt 3 下载并编译vtk 4 下载并编译PCL依赖库 4 1 metslib 4 2 libpng 4 3 libpcap 5 编译PCL 6 cuda cudnn tensorrt安装与测试 6
  • 关于js导出excel的标题日期问题

    注意 获取日期放入标题和sheet中 不能用空格 否则不好使 var startTime startTime val substring 0 10 var endTime endTime val substring 0 10 var tit
  • STM32系统学习——TIM(基本定时器)

    一 定时器分类 STM32F1 系列中 除了互联型的产品 共有 8 个定时器 分为基本定时器 通用定时器和高级定时器 基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器 只能定时 没有外部 IO 通用定时器 TIM2
  • qemu-linux-user ELF vs XCOFF 1

    最后更新2021 12 14 注 以下及以后本系列都是个人对相关技术在此时此刻的理解和研究 会根据学习深入 不断修正 但过去历史文章不见得会被 及时 修改订正 见谅 当然欢迎读者批评指正 本人虚心接受 但什么时候把文章修改正确 不好说 qe
  • 关于echarts无数据时显示问题

    我是做java开发的 最近公司让我做前端统计图表柱形图之类的 我用的就是echarts 版本是2 2 7 接下来 就说说我遇到的问题 因为我是小白 所以记录一下 ajax请求返回数据为空时显示暂无数据 echarts默认的是显示气泡 我换了
  • K-means聚类算法的应用以及实现

    K means 聚类算法属于无监督学习 它会将相似的对象归到同一个簇中 该算法原理简单 执行效率高 并且容易实现 是解决聚类问题的经典算法 尽管如此 任何一款算法都不可能做到完美无瑕 K measn 算法也有自身的不足之处 比如 K mea
  • k8s deployment 以root角色启动容器

    containers name image securityContext runAsUser 0 这样可以使容器以root用户运行 0指root用户的uid
  • C# 新增

    C 三层架构实现新增功能 第一步 用WPF实现用户界面代码 WPF中的代码就不详细说明了 现在只要和大家分享一下的是它们的后台的实现新增方法的代码 要实现我们的新增 并且新增数据 数据库必不可少 在数据库中写个新增方法的存储过程 用一个 t
  • [数学建模]MATLAB回归分析

    一 前言 第24届冬季奥林匹克运动会在北京隆重展开 我们要研究一个问题 奥运会东道主是否有优势 在历史数据中 我们发现好像东道主的国家在当年奥运会上获得金牌的数目比四年前非东道主国家获得的金牌数多 我们需要探究这个规律 二 历史背景 回归
  • 自学Python05-学会Python中的函数定义

    亲爱的同学们 今天我们将开始学习 Python 中的函数 函数就像一个魔法盒子 可以让我们在程序中执行一段代码 并且可以反复使用 这样 我们的程序就可以变得更加简洁和易于理解 现在 让我们一起来学习如何使用函数吧 首先 我们需要知道如何定义
  • Linux操作系统之进程命令和库文件

    文章目录 一 有关进程命令 1 ps命令 显示当前终端信息 2 ps ef命令 查看当前终端进程的详细信息 二 前台程序和后台程序模式的切换 1 首先了解前台后台命令 2 前后台的切换 1 kill 命令 2 进程前后台切换 三 runle
  • 第六章习题

    R1 个无线网络运行在 基础设施模式 下是什么含义 如果某网络没有运行在基础设施模式下 那么它运行在什么模式下 这种运行模式与基础设施模式之间有什么不同 在基础结构操作模式下 每个无线主机都通过基站连接到较大的网络 如果未在基础架构模式下运
  • 图灵携手全球机器学习技术大会,拥抱 AGI 变革时代

    备受行业关注的 2023 全球机器学习技术大会 ML Summit 将于10月20 21日在北京金茂威斯汀大饭店隆重举行 此次大会由 Boolan 和 CSDN 联合主办 秉承 全球专家 卓越智慧 的宗旨 特邀近 50 位人工智能与机器学习
  • 判断cuda是否安装成功

    进入环境中 输入以下命令 python import torch torch cuda is available 返回结果如下图
  • sklearn 中的线性回归、岭回归、Lasso回归参数配置及示例

    文章目录 线性回归 引入 重要参数 重要属性 重要方法 例子 岭回归 引入 重要参数 重要属性 重要方法 示例 Lasso 回归 引入 重要参数 重要属性 重要方法 示例 本文主要讲一些sklearn中回归模型的使用 如果需要了解相关理论
  • marquee的滚动属性参数

    null从
  • 泛型编程杂谈

    谈 泛型 GP 之前 先谈一下面向对象 OO OO强调世界是由对象组成的 对象是由方法和属性组成的 个人感觉还应该加上事件 而对象之间又有继承 is a 和组合等 关系 OO很符合我们认识世界的直觉 它以封装 继承和多态为特性 我们在现实工
  • 关于ESP8266自动下载和CH340的几件事

    最近在玩ESP8266 做了些东西 比如考研倒计时器 网络闹钟 网络灯 用手机控制亮度 气象站等等 ESP8266本身挺简单的 倒是这个自动下载电路 我还是第一次玩 以前玩51也用过串口下载 都是自己冷启动 玩STM32用的ST LINK