收藏官网首页
查看: 15501|回复: 0

[技术分享] ESP8266 GPIO使用说明

50

主题

94

帖子

2135

积分

金牌会员

Rank: 6Rank: 6

积分
2135
跳转到指定楼层
楼主
发表于 2017-4-26 12:08:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
校园创客福利
本帖最后由 true 于 2017-4-26 12:39 编辑

目录
1 概述
2 注意事项
3 SDK API
3.1 PIN Macro
3.2 gpio_output_set
3.3 GPIO_INPUT_GET
3.4 GPIO 中断相关



1 概述
esp8266共有16个通用 IO,管脚的位置和管脚的分别为:

  • PIN8 --- GPIO16 / Deep-Sleep Wakeup
  • PIN9 --- GPIO14 / HSPICLK
  • PIN10 --- GPIO12 / HSPIQ
  • PIN12 --- GPIO13 / HSPID
  • PIN13 --- GPIO15 / HSPICS / I2S_BCK
  • PIN14 --- GPIO2 / UART TX during flash programming / I2S_WS
  • PIN15 --- GPIO0 / SPI_CS2
  • PIN16 --- GPIO4
  • PIN18 --- SPIHD / HSPIHD / GPIO9
  • PIN19 --- SPIWP / HSPIWP / GPIO10
  • PIN20 --- SPI_CS0 / GPIO11
  • PIN21 --- SPI_CLK / GPIO6 / SD_CLK
  • PIN22 --- SPI_MSIO / GPIO7 / SD_D0
  • PIN23 --- SPI_MOSI / GPIO8 / SD_D1
  • PIN24 --- GPIO5
  • PIN25 --- GPIO3 / UART RX during flash programming / U0RXD / I2S_DATA
  • PIN26 --- GPIO1 / SPI_CS1 / U0TXD

其中,在四线 (QUAD) 模式 flash 下,有六个 IO 于 flash 通讯
在两线 (DUAL) 模式 flash 下,有四个 IO 于与 flash 通讯

2 注意事项
正常运行: RESET, CH_EN 拉高, GPIO2 拉高 + GPIO0 拉高 (GPIO15/MTDO 拉低)
[size=12.8000001907349px]刷 Flash: RESET, CH_EN 拉高, GPIO2 拉高 + GPIO0 拉低 (GPIO15/MTDO 拉低)
[size=12.8000001907349px]GPIO2, GPIO0 和 GPIO3 (U0RXD) 用作 GPIO 要留意,**电路,有可能影响其状态,造成正常启动失败
[size=12.8000001907349px]应避免使用 GPIO0, GPIO2, GPIO15

Interrupts
多次测试,建议使用 GPIO14, GPIO12, GPIO13, GPIO2, GPIO4, GPIO5

3 SDK API3.1 PIN Macro

PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO2_U);
[size=12.8000001907349px]PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO4_U);
[size=12.8000001907349px]PIN_PULLDWN_DIS(PERIPHS_IO_MUX_U0TXD_U);
[size=12.8000001907349px]PIN_PULLDWN_EN(PERIPHS_IO_MUX_GPIO5_U);

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12); // 选择 MTDI 脚复用为 GPIO12,大量管脚有多个功能,需用此宏选择具体的管脚功能

3.2 gpio_output_set
gpio_output_set(u32 set_mask, u32 clear_mask, u32 enable_mask, u32 disable_mask)
  • set_mask: 设置输出为高的位,对应位为 1 输出高,对应位为 0 不改变状态
  • clear_mask: 设置输出为低的位,对应位为 1 输出低,对应位为 0 不改变状态
  • enable_mask: 设置使能输出的位
  • disable_mask: 设置使能输入的位

  1. #include <gpio.h>

  2. // Initialize the GPIO subsystem.
  3. gpio_init();

  4. GPIO_REG_READ(GPIO_OUT_ADDRESS) & BIT2 == 1

  5. //Set GPIO2 to output mode
  6. PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);

  7. //Set GPIO2 low
  8. gpio_output_set(0, BIT2, BIT2, 0);

  9. //Set GPIO0 to HIGH
  10. gpio_output_set(BIT2, 0, BIT2, 0);

  11. //Set GPIO12 to HIGH, GPIO13 to LOW
  12. gpio_output_set(BIT12, BIT13, BIT12|BIT13, 0)
复制代码
有个简化的宏:GPIO_OUTPUT_SET(gpio_no, bit_value);
[size=12.8000001907349px]还有一个: GPIO_DIS_OUTPUT(gpio_no);
  1. GPIO_OUTPUT_SET(0, 1); // set gpio0 to 1
  2. GPIO_DIS_OUTPUT(0);    // disable the GPIO0 output (change to input)
复制代码
注意:批量输出时(同时操作四个 GPIO 口),使用 GPIO_OUTPUT_SET 要留意,宏堆叠有些奇怪现象:
[size=12.8000001907349px]GPIO14, 12, 13, 15 同时操作时,只有第一个 GPIO(14) 能改变状态,貌似被优化了还是咋的
[size=12.8000001907349px]GPIO5, 4, 14, 12 同时操作时,现象同上
GPIO1, 2, 0, 3 同时操作时,最后一个 GPIO (3) 无法改变状态
3.3 GPIO_INPUT_GET
[size=12.8000001907349px]
  1. GPIO_INPUT_GET(gpio_no);

  2. GPIO_INPUT_GET(2);
复制代码

[size=12.8000001907349px]等效于:
  1. GPIO_REG_READ(GPIO_OUT_ADDRESS) & BIT2
复制代码

3.4 GPIO 中断相关
  1. ETS_GPIO_INTR_ATTACH(func, arg);

  2. ETS_GPIO_INTR_DISABLE();

  3. EST_GPIO_INTR_ENABLE();


  4. void gpio_pin_intr_state_set(u32 gpio_no, GPIO_INT_TYPE stat);

  5. typedef enum {
  6.     GPIO_PIN_INTR_DISABLE = 0,
  7.     GPIO_PIN_INTR_POSEDGE = 1,
  8.     GPIO_PIN_INTR_NEGEDGE = 2,
  9.     GPIO_PIN_INTR_ANYEDGE = 3,
  10.     GPIO_PIN_INTR_LOLEVEL = 4,
  11.     GPIO_PIN_INTR_HILEVEL =5
  12. } GPIO_INT_TYPE;


  13. /*
  14. * Register an application-specific interrupt handler for GPIO pin
  15. * interrupts.  Once the interrupt handler is called, it will not
  16. * be called again until after a call to gpio_intr_ack.  Any GPIO
  17. * interrupts that occur during the interim are masked.
  18. *
  19. * The application-specific handler is called with a mask of
  20. * pending GPIO interrupts.  After processing pin interrupts, the
  21. * application-specific handler may wish to use gpio_intr_pending
  22. * to check for any additional pending interrupts before it returns.
  23. */
  24. void gpio_intr_handler_register(gpio_intr_handler_fn_t fn, void *arg);

  25. typedef void (* gpio_intr_handler_fn_t)(uint32 intr_mask, void *arg);

  26. /* Determine which GPIO interrupts are pending. */
  27. uint32 gpio_intr_pending(void);

  28. /*
  29. * Acknowledge GPIO interrupts.
  30. * Intended to be called from the gpio_intr_handler_fn.
  31. */
  32. void gpio_intr_ack(uint32 ack_mask);

  33. void gpio_pin_wakeup_enable(uint32 i, GPIO_INT_TYPE intr_state);

  34. void gpio_pin_wakeup_disable();
复制代码
[size=12.8000001907349px]
GPIO 中断处理:

  1. uint32 gpio_status;

  2. gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);

  3. //clear interrupt status
  4. GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);
复制代码










您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表