ESP-12F(ESP8266EX)管脚定位及点灯测试
ESP-12F(ESP8266EX)管脚定位及点灯测试
管脚列表说明
ESP8266EX技术规格书:附录 - 管脚列表
文件名称:0a-esp8266ex_datasheet_cn.pdf
附录 - 管脚列表
附录 - ESP8266 管脚清单《ESP8266_Pin_List.xls》提供管脚的详细信息,如下所示。
• Digital Die Pin List
• Buffer Sheet
• Register List
• Strapping List
📖 说明:
• INST_NAME 指的是在 eagle_soc.h 定义下的 IO_MUX REGISTER,例例如 MTDI_U 指的是
PERIPHS_IO_MUX_MTDI_U。
• Net Name 指的是原理图中的管脚名称。
• 功能指的是每个管脚的多功能。
• 功能 1 ~ 5 对应 SDK 中的功能 0 ~ 4。例例如,将 MTDI 设置为 GPIO12,如下所示:
#define FUNC_GPIO12 3 //defined in eagle_soc.h
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12)
在CPU(ESP8266EX),模组(ESP-12F),开发板(NodeMCU)各个管脚描述都不相同,上面的文档是针对CPU来说的,那怎么对应呢?
用模组的LED灯
1. 在ESP-12F规格表中
找到"五、 原理图"
VDD3V3----LED1-----R1(470)----GPIO2
这里用的GPIO02,当GPIO2输出高电平时,LED无电压差,是灭的。
找到“四、 管脚定义”
脚序 | 名称 | 功能说明 |
---|---|---|
11 | IO2 | GPIO2/UART1_TXD |
表格中IO2是GPIO2,被省略了GP。
在引脚图中描述的是GPIO2。
2.CPU规格表引脚定义,和模块的功能描述是相同的。
管脚 | 名称 | 类型 | 功能 |
---|---|---|---|
14 | GPIO2 | I/O | 可⽤用作烧写 Flash 时 UART1_TX;GPIO2 |
说明:GPIO2、GPIO0 和 MTDO ⽤用于选择启动模式和 SDIO 模式;
在引脚图中描述的也是GPIO2。
3. 引脚名称分析
在《ESP8266_Pin_List.xls》文件中
参考Notes:“PAD NAME accords with the pin name in schematic”,含义 :指的是原理图中的管脚名称。上面的错误描述为“Net Name”了。
在“Digital Die Pin List”工作表中根据PAD NAME字段找到GPIO2。
PAD Name | Inst Name | Pull up/ Pull down type | Function1 | Type | Function2 | Type | Function3 | Type | Function4 | Type | Function5 | Type | At Reset | After Reset | Sleep |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
GPIO2 | GPIO2_U | Pull up | GPIO2 | I/O/T | I2SO_WS | I/O/T | U1TXD | O | I/O/T | U0TXD | O | oe=0, wpu | wpu | oe=0 |
这里的对应关系是我自己分析的,望指正。
Inst Name是GPIO2_U,也就是说需要加上前缀IO_MUX,还要在最前面加上PERIPHS_,才是在 SDK的eagle_soc.h 中定义的名称:PERIPHS_IO_MUX_GPIO2_U
在sdk里面找到eagle_soc.h
#define PERIPHS_IO_MUX 0x60000800
#define PERIPHS_IO_MUX_GPIO2_U (PERIPHS_IO_MUX + 0x38)
在reg这个工作表可以看到GPIO2的地址是0x60000838,和上面宏定义是一样的,这个地址是代表对应寄存器地址。
如果要使用Function2这个功能,则加上FUNC_,对应eagle_soc.h中定义
#define FUNC_GPIO2 0
编写测试代码
根据sdk api参考,7.1. GPIO 接⼝
在user_main.c的user_init(void)函数中添加
PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO2_U); //管脚上拉使能,选取对应引脚设置为上拉
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U,FUNC_GPIO2); //管脚功能选择,选取对应引脚设置为GPIO功能
GPIO_OUTPUT_SET(PERIPHS_IO_MUX_GPIO2_U, 0); //api参考说“GPIO_OUTPUT_SET(gpio_no, bit_value) 设置 gpio_no 管脚输出 bit_value,与上⼀一节的输出⾼高低电平的示例例相同。”,而gpio.h中是一个宏,很复杂的调用了gpio_output_set函数;gpio_no也并无说明,搜索不到。
// 假设bit_value为1表示高电平吧。我们要点亮这个灯,则输出低电平,设置为0
//注释一下其他测试代码
//user_webserver_init(SERVER_PORT);
编译报错 warning: left shift count >= width of type
根据提示,只烧写2个文件
No boot needed.
Generate eagle.flash.bin and eagle.irom0text.bin successully in folder bin.
eagle.flash.bin-------->0x00000
eagle.irom0text.bin---->0x10000
重启设备,报错,反复重启
修改为:
PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO2_U);
PIN_FUNC_SELECT(GPIO_ID_PIN(2),FUNC_GPIO2);
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1);
还是反复重启
Fatal exception 28(LoadProhibitedCause):
epc1=0x40226897, epc2=0x00000000, epc3=0x401004e5, excvaddr=0x00000002, depc=0x00000000
参考api修改,最终代码如下,灯常亮。
os_printf("-----------------\n");
os_printf("\nbegin turn on led...\n");
//PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO2_U); //管脚上拉使能,选取对应引脚设置为上拉
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U,FUNC_GPIO2); //管脚功能选择,选取对应引脚设置为GPIO功能
gpio_output_set(0, BIT2, BIT2, 0); //设置 GPIO12 输出低电平;
os_printf("\nEnd of LED!\n");
os_printf("-----------------\n");
小结:
-
不能设置上拉,需要删除PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO2_U);
-
设置低电平
GPIO_OUTPUT_SET(PERIPHS_IO_MUX_GPIO2_U, 0); //这种格式是错误的,编译报错:warning: left shift count >= width of type
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1); //串口打印正常,灯灭,应该是高电平
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0); //串口打印正常,灯常亮,应该是低电平
GPIO_OUTPUT_SET(BIT2, 1); //串口打印正常,取值0和1都是灭的
- 这个NodeMCU看来更适合刷固件,用AT指令或者lua语言,可惜都不会。这个资料文档东一个西一个的,看不懂,要命了,入不了门,不折腾了,换STM32去 。
更多推荐
所有评论(0)