查看ESP8266 GPIO的源代码
←
ESP8266 GPIO
跳转到:
导航
,
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
== 概述 == ESP8266共有16个通用 IO,管脚的位置和管脚的分别为: [[文件:Esp8266ex-layout.jpg | 360px]] * 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 通讯 <br><br> == 注意事项 == 正常运行: RESET, CH_EN 拉高, GPIO2 拉高 + GPIO0 拉高 (GPIO15/MTDO 拉低) 刷 Flash: RESET, CH_EN 拉高, GPIO2 拉高 + GPIO0 拉低 (GPIO15/MTDO 拉低) GPIO2, GPIO0 和 GPIO3 (U0RXD) 用作 GPIO 要留意,外围电路,有可能影响其状态,造成正常启动失败 应避免使用 GPIO0, GPIO2, GPIO15 ;; Interrupts 多次测试,建议使用 GPIO14, GPIO12, GPIO13, GPIO2, GPIO4, GPIO5 <br><br> == SDK API == === PIN Macro === PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO2_U); PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO4_U); PIN_PULLDWN_DIS(PERIPHS_IO_MUX_U0TXD_U); PIN_PULLDWN_EN(PERIPHS_IO_MUX_GPIO5_U); PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12); // 选择 MTDI 脚复用为 GPIO12,大量管脚有多个功能,需用此宏选择具体的管脚功能 参考 SDK_DIR/include/eagle_soc.h <br><br> === 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: 设置使能输入的位 <source lang=cpp> #include <gpio.h> // Initialize the GPIO subsystem. gpio_init(); GPIO_REG_READ(GPIO_OUT_ADDRESS) & BIT2 == 1 //Set GPIO2 to output mode PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2); //Set GPIO2 low gpio_output_set(0, BIT2, BIT2, 0); //Set GPIO0 to HIGH gpio_output_set(BIT2, 0, BIT2, 0); //Set GPIO12 to HIGH, GPIO13 to LOW gpio_output_set(BIT12, BIT13, BIT12|BIT13, 0); </source> 有个简化的宏:GPIO_OUTPUT_SET(gpio_no, bit_value); 还有一个: GPIO_DIS_OUTPUT(gpio_no); <source lang=cpp> GPIO_OUTPUT_SET(0, 1); // set gpio0 to 1 GPIO_DIS_OUTPUT(0); // disable the GPIO0 output (change to input) </source> ;; 注意:批量输出时(同时操作四个 GPIO 口),使用 GPIO_OUTPUT_SET 要留意,宏堆叠有些奇怪现象: GPIO14, 12, 13, 15 同时操作时,只有第一个 GPIO(14) 能改变状态,貌似被优化了还是咋的 GPIO5, 4, 14, 12 同时操作时,现象同上 GPIO1, 2, 0, 3 同时操作时,最后一个 GPIO (3) 无法改变状态 <br><br> === GPIO_INPUT_GET === GPIO_INPUT_GET(gpio_no); GPIO_INPUT_GET(2); 等效于: GPIO_REG_READ(GPIO_OUT_ADDRESS) & BIT2 <br><br> === GPIO 中断相关 === <source lang=c> ETS_GPIO_INTR_ATTACH(func, arg); ETS_GPIO_INTR_DISABLE(); EST_GPIO_INTR_ENABLE(); void gpio_pin_intr_state_set(u32 gpio_no, GPIO_INT_TYPE stat); typedef enum { GPIO_PIN_INTR_DISABLE = 0, GPIO_PIN_INTR_POSEDGE = 1, GPIO_PIN_INTR_NEGEDGE = 2, GPIO_PIN_INTR_ANYEDGE = 3, GPIO_PIN_INTR_LOLEVEL = 4, GPIO_PIN_INTR_HILEVEL =5 } GPIO_INT_TYPE; /* * Register an application-specific interrupt handler for GPIO pin * interrupts. Once the interrupt handler is called, it will not * be called again until after a call to gpio_intr_ack. Any GPIO * interrupts that occur during the interim are masked. * * The application-specific handler is called with a mask of * pending GPIO interrupts. After processing pin interrupts, the * application-specific handler may wish to use gpio_intr_pending * to check for any additional pending interrupts before it returns. */ void gpio_intr_handler_register(gpio_intr_handler_fn_t fn, void *arg); typedef void (* gpio_intr_handler_fn_t)(uint32 intr_mask, void *arg); /* Determine which GPIO interrupts are pending. */ uint32 gpio_intr_pending(void); /* * Acknowledge GPIO interrupts. * Intended to be called from the gpio_intr_handler_fn. */ void gpio_intr_ack(uint32 ack_mask); void gpio_pin_wakeup_enable(uint32 i, GPIO_INT_TYPE intr_state); void gpio_pin_wakeup_disable(); </source> GPIO 中断处理: <source lang=c> uint32 gpio_status; gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); //clear interrupt status GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); </source> <br><br> <br><br> <br><br> <br><br> <br><br> <br><br> <br><br> <br><br> <br><br> <br><br>
返回到
ESP8266 GPIO
。
个人工具
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面