esp32自动下载原理以及失败原因分析

自动下载原理

esp32代码最常用的下载方式是通过串口,也就是TXD和RXD。但只有这两个线还不能完成自动下载。因为需要想办法让esp32进入下载启动模式,而进入下载启动模式的方法是让系统重启,重启时GPIO0和GPIO2保持低电平,这个在官方的文档中有说明。

这边我有一个疑惑,这个拉低的具体时间到底是多少?也就是说reset前多少时间要把GPIO0和GPIO2拉低,同时reset后这个拉低需要保持多久?请注意这个问题,下文会继续讨论,这两个时间关乎到烧录是否能成功。

关于自动reset和自动拉低就需要借用串口的流控,RTS和DTR。流控本身不是给我们用来自动下载代码用的,但是因为可以修改他们的功能,所以就可以人为的控制它们的时序,变成类似普通gpio的功能。官方给出的电路是这样的:

具体三极管原理就不分析了,直接看真值表就可以。可以先给EN一个低电平的脉冲,让系统重启,同时在EN拉高的瞬间让IO0和IO2拉低,这样就能让系统进入下载启动模式。这样似乎完美的解决了自动下载的问题。

遇到的问题

但是在实际使用中,我经常会遇到自动下载超时的问题,同一批主板有一些可以自动下载,有一些不可以;在有些电脑上可以,在有些电脑不可以。不过当时也没有太在意,毕竟工程中可以通过在IO0上接一个对地的按键,下载时按着按键就可以了。这个事有点对不住我的同事,因为个人的懒惰,导致你们按的手疼。最近闲着有时间了就仔细的想了一下这个问题(可惜手头没有示波器不能抓波形)。

理论分析

用万用表量了一下,流控信号DTR,RTS都出来了,系统也是可以正常重启的,但是就是不能烧录,说明整个硬件的连线没有问题。那么问题应该是出在时序上,也就是上文提到的那个问题,到底在reset后,IO0要保持多久的低电平。

同时看上图的真值表。如果要reset某个时间一定会要给EN一个低电平脉冲,所以势必会进入EN=0,IO0=1的状态。此时下一步就是让EN=1,IO0=0。而完成这两步,需要DTR和RTS同时翻转,我感觉根据PC操作系统不实时的关系这两个翻转应该不可能瞬间完成,不过无论先翻转哪个,EN一定是先于IO0翻转的。而假定DTR和RTS的翻转时差足够高,那么就有可能出现IO0延迟拉低,在系统reset初期是高电平,这样系统就直接进入了spiflash启动模式。

实际波形抓取

手头暂时没有示波器,这一步略过,有同学看到了可以帮我验证一下。

解决办法

根据理论分析的结论,造成不能进入下载模式的原因是DTR和RTS的翻转有时差导致了IO0延迟变低,那么理论上我们可以通过延迟EN变高的时间来同步IO0的延迟,而延迟EN变高的方式就是:

                                           给EN对地加一个大电容

当然这个延迟需要多久需要根据示波器的波形来看(延迟时间太久了会发生什么我没细想)。正常reset对地电容都是0.1uf,我尝试修改为了10uf,直接解决了这个不能自动下载的问题。当然10uf可能不是最完美的,但是大致思路就是这样子的了。

彩蛋

关于上图的IO2电路上有一个框,这里再啰嗦一下,因为我在实际工作中的疏忽导致了一些问题。首先IO2的控制电路和IO0的电路是一样的,所以他们的逻辑状态也是一样的。但是根据第一张图给出的,IO2默认是下拉的,而IO0默认是上拉的,所以大部分情况下可以不用这个电路。但是有一种情况是要的,IO2充当了SDIO的TF_D0功能,当使用sd卡时一般会接一个上拉电阻,所以如果IO2外接了上拉电阻时就会要框中的电路,否则依旧进不了下载启动模式。那么问题来了,为什么sd卡的IO一定要接上拉?

发布了1 篇原创文章 · 获赞 0 · 访问量 10

猜你喜欢

转载自blog.csdn.net/weixin_41975300/article/details/104834771