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的引脚电平是被拉高的。但是引脚拉高有两种可能性:
- 第一是:输出功能,并且输出高
- 第二是:输入功能,并且上拉
为了搞清楚,其上电时,它引脚的状态,设置简单的测试环境。把可能干扰的电路以及其他全部弄掉,仅仅剩下一个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的初始状态。
实验方法:
使用逻辑分析仪,采样各个引脚的波形,然后分析。
分析分为两个步骤,首先判断上电后,引脚的电平;然后判断是输入还是输出。
- 首先判定上电后引脚的电平
由于用户程序写的是,上电置低,所以只要观察,上电后,特别是350ms以内,相应引脚的波形是否有高电平出现。
1) 如果有高电平,说明引脚初始电平为高,
2) 如果无高电平,说明引脚初始电平为低。 - 然后判断是输出还是输入
- 对于初始状态为高电平,那么其状态就可能有两种,一种是输出置高,另一种是输入上拉两种状态了。判断方法如下:
各引脚使用下拉电阻,然后在上电测量,使用逻辑分析仪采样,观察波形。
- 如果上电后的350ms内是高电平,则该引脚是初始状态为:输出置高
- 如果上电后的350ms内是低电平,则该引脚是初始状态为:输入上拉
- 对于初始状态为低电平,那么其状态就可能有两种,一种是输出置低,另一种是输入下拉两种状态了。判断方法如下:
各引脚使用使用上拉电阻,然后在上电测量,使用逻辑分析仪采样,观察波形。
- 如果上电后的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