加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 相关推荐
申请入驻 产业图谱

ESP32 自动下载原理分析

01/06 14:18
191
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

最近接触一了一个开源项目,名字叫meshtastic。主要是以LoRa这种扩频通信的方式组建一个去中心化的网络。在中国境内的话,估计比较适合山区,救援等通信场景,毕竟咱们只要不进入深山都是可以打电话的。

这个项目基本上都是使用了ESP32作为主控MCU和LoRa通信模块来实现的,其原因在于ESP32的生态确实比较好,同时,ESP32具备了蓝牙和WiFi功能,这使得我们可以轻松的通过手机APP来和设备的蓝牙通信,打通了去中心化网络的用户界面。另一方面,基于WiFi链路,我们可以通过MQTT的服务将远距离的多个子网络连接起来,形成一张大网。

再开始设计这个开源项目的硬件时,首先遇到了程序下载问题,meshtastic项目提供了一个基于web端的页面,可以直接调用串口,对我们的目标板进行Download。

这确实是一个很有意思的事情,web调用usb设备要是用Chrome浏览器,同时,对于USB 转串口来说,我们需要使用它的DTR和RTS两个引脚信号。利用这两个引脚产生一个特殊的时序,用来激发 ESP32 进入 ISP 模式。

串口工具中的 DTR(Data Terminal Ready)和 RTS(Request to Send)是 RS-232C 接口标准中的两个引脚,它们分别具有以下含义:

DTR(数据终端准备好):当该引脚为高电平时,表示数据终端设备(如计算机)已经准备好进行数据传输。通常,DTR 信号由数据终端设备发送给串口设备(如 Modem),以指示串口设备开始数据传输。

RTS(请求发送):当该引脚为高电平时,表示数据终端设备(如计算机)请求串口设备(如 Modem)开始数据传输。通常,RTS 信号由数据终端设备发送给串口设备,以请求启动数据传输过程。

总之,DTR 和 RTS 是串口通信中用于控制数据传输的关键信号,它们分别表示数据终端设备的准备状态和传输请求。通过这两个信号,可以实现数据终端设备与串口设备之间的协同工作,完成数据传输任务。

在实际应用中,DTR 和 RTS 通常用于实现全双工通信,即在同一时刻,可以实现数据的发送和接收。当 DTR 和 RTS 同时为高电平时,表示数据终端设备准备好发送数据,并请求串口设备开始接收数据。此时,串口设备收到 RTS 信号后,会启动数据接收过程。

这里简单说,就是计算机,也就是我们的上位机程序,可以控制这两个引脚输出高低电平。

那么,ESP32 若要进入 ISP 模式,需要什么的电平和时序呢?

从官网手册中查看,选择 UART Download Boot 模式,这样直接利用 uart0 进行程序下载。这个模式的进入方式就是,我们需要再芯片启动的时候,拉低 GPIO0。具体的时序,官方也给出了规范,如下图:

由此,我们可以确定,在芯片的 RST 引脚和 GPIO0 这两个引脚上需要什么样的时序。

这里,我主要研究了一下下面这个电路,它同时兼容了手动下载和自动下载两种模式,比较方面的兼容了各种不同的下载软件

首先,电路图的左边比较简单,就是使用两个按键的配合,对 ESP32 的下载模式进行控制。

然后,他右面的电路就是通过 USB 转串口芯片的 DTR 和 RTS 两个引脚进行配置,其中 CHIP_PU就是 ESP32 的 EN 引脚,也就是 RST 复位引脚,而 R7 上端的 0 就是 GPIO0 的网络。芯片 2N7002BKS 是一个双MOS 管封装的芯片,通过引脚名称可以看出,它有两对 GDS 这样的MOS 管。

我把他简化一下来分析

当 DTR=0,RTS=0 时,此时 Q2 和 Q3 都截止,因此,EN 和 GPIO0 就会走手动下载的逻辑。

当 DTR=0,RTS=1 时,此时 Q3 导通,Q2 截止,EN 保持外部状态,GPIO0 则被拉低为 0 。

当 DTR=1,RTS=0 时,此时 Q2 导通,Q3 截止,EN 被拉低为 0,GPIO0 保持外部状态。

当 DTR=1,RTS=1 时,此时 Q2 和 Q3 都截止,状态回归,都会变成外部保持状态。

时序图中看,我们其实需要 EN 和 GPIO0 同时拉低的一段,但是从上面的状态转移来看,并没有实现 EN 和 GPIO0 同时拉低的逻辑。

这里就要看一下电路图的设计,我简化的太多了,以至于把挂在 EN 引脚上的电容给忽略掉了。

有了这个电容后,默认上电后,保持手动模式,此时 GPIO0 和 EN 都被拉高。

我们发送串口状态,拉高 DTR = 1,RTS = 0。这时GPIO0 保持外部状态,被拉高。EN 就被拉低为 0。这时候 C10 已经被充电。

然后,我们再拉高 RTS = 1,DTR = 0。此时,GPIO0 将被迅速拉低为 0 。但是 EN 引脚不会立刻变为高电平,因为有电容的存在,且 DTR 为 0 。要想再次变为高电平需要有个放电充电过程。

于是,我们就获得了一个上升边沿,且此时 GPIO0 已经快速的被拉低为 0 了。

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录