ESP8266EX 上电时引脚的初始化状态

问题:
ESP8266EX 使用SDK:NONOS_SDK_1.5.3_16_04_18,IOT_demo中的light。
上电后的350ms内,GPIO12,GPIO13,GPIO14引脚的电平始终为高电平。

在使用ESP8266EX作为MCU做了一个wifi 七彩灯。4路PWM引脚分别为:R(GPIO 14), B(GPIO12), G(GPIO 13), W(GPIO4), 全部引脚设置为PWM引脚,初始占空比为零。
但过程中发现,每次上电后,总会RGB先亮一下,熄灭(然后进入我写的程序)。

解决:
用是逻辑分析仪采样发现RGB三个引脚上有350ms左右的高电平出现,(W引脚没有这个现象),起初以为是软件设置有误,于是将所有的代码全部注释,user_init()中只写RGB初始化为零的语句。再一次上电,发现RGB三个引脚居然还是一样的现象,首先出现350ms的高电平,然后拉低。
由此猜测:
1) ESP8266一上电,会有350ms左右的时间是不受用户控制的(至少是使用官方SDK的用户)。
2) 在上电后的350ms左右,RGB的引脚电平是被拉高的。但是引脚拉高有两种可能性:

  1. 第一是:输出功能,并且输出高
  2. 第二是:输入功能,并且上拉

为了搞清楚,其上电时,它引脚的状态,设置简单的测试环境。把可能干扰的电路以及其他全部弄掉,仅仅剩下一个ESP8266最小系统模块。这里使用的是ESP8266EX(AI的模块)。

1)  使用官方SDK:NONOS_SDK_1.5.3_16_04_18
2)  使用例程App:IOT_DEMO的light
3)  修改light源码:将user_light中全部注释,然后初始化以下引脚GPIO(0,2,4,5,12,13,14,15,16),将其设置为输出,然后置低电平。
4)  由于要进入Flash启动模式,所以先让GPIO15 = 0,GPIO2 = 1,GPIO0 = 1; 先判断其他引脚
5)  最后判断GPIO15,GPIO2,GPIO0的初始状态。

实验方法:
使用逻辑分析仪,采样各个引脚的波形,然后分析。
分析分为两个步骤,首先判断上电后,引脚的电平;然后判断是输入还是输出。

  1. 首先判定上电后引脚的电平
    由于用户程序写的是,上电置低,所以只要观察,上电后,特别是350ms以内,相应引脚的波形是否有高电平出现。
    1) 如果有高电平,说明引脚初始电平为高,
    2) 如果无高电平,说明引脚初始电平为低。
  2. 然后判断是输出还是输入
  1. 对于初始状态为高电平,那么其状态就可能有两种,一种是输出置高,另一种是输入上拉两种状态了。判断方法如下:
    各引脚使用下拉电阻,然后在上电测量,使用逻辑分析仪采样,观察波形。
  • 如果上电后的350ms内是高电平,则该引脚是初始状态为:输出置高
  • 如果上电后的350ms内是低电平,则该引脚是初始状态为:输入上拉
  1. 对于初始状态为低电平,那么其状态就可能有两种,一种是输出置低,另一种是输入下拉两种状态了。判断方法如下:
    各引脚使用使用上拉电阻,然后在上电测量,使用逻辑分析仪采样,观察波形。
  • 如果上电后的350ms内是高电平,则该引脚是初始状态为:输入下拉
  • 如果上电后的350ms内是低电平,则该引脚是初始状态为:输出置低

测量后的结果如下:

GPIO NO.

PIN NO.

初始状态

初始电平

GPIO0

Pin15

输入上拉

H

GPIO2

Pin14

输入上拉

H

GPIO4

Pin16

输入下拉

L

GPIO5

Pin24

输入下拉

L

GPIO12

Pin10

输入上拉

H

GPIO13

Pin12

输入上拉

H

GPIO14

Pin9

输入上拉

H

GPIO15

Pin13

输入上拉

H

GPIO16

Pin8

输出置高

H

如果想要在上电后,不出现高电平,解决的办法就是在相应的引脚上接上下拉电阻,然后就可以正常使用了,置高置低都不影响。我使用的是330欧姆的电阻,亲测可以用。


Pillarpeng
2016.8.4