ESP8266 SDK开发篇(五)——GPIO

这次让我来说说ESP8266操作GPIO的方法,首先引入三个头文件,这里包括了所有GPIO接口。

#include "gpio.h"
#include "eagle_soc.h"
#include "gpio16.h"

然后是引脚定义,引脚有三种定义类型,分别是:

PIN_PULLUP_DIS(PIN_NAME);           //管脚上拉屏蔽
PIN_PULLUP_EN(PIN_NAME);            //管脚上拉使能
PIN_FUNC_SELECT(PIN_NAME,FUNC) ;    //管脚功能选择

前两个我基本没用过,我主要是用第三个,另外有些GPIO口是没有内部上拉的,好像是GPIO4、GPIO5,记不太清了,有兴趣了解的朋友就要另外度娘了,也可以在评论区留言互相学习。
关于PIN_NAME和FUNC可以在头文件eagle_soc.h中找到定义,也可以去乐鑫官网找管脚清单,里面对寄存器的说明很详细。
例子:PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4); \\对GPIO4的定义


设置GPIO管脚的输入输出可以通过如下函数

gpio_output_set(uint32 set_mask,    //设置输出高电平的位,无则为0
                uint32 clear_mask,  //设置输出低电平的位,无则为0
                uint32 enable_mask, //设置使能输出位
                uint32 disable_mask //设置使能输入位)
例子:
gpio_output_set(BIT12, BIT13, BIT12|BIT13, 0);设置GPIO12输出高电平,GPIO13输出低电平; 
gpio_output_set(0, 0, 0, BIT12);设置GPIO12为输入

此外还能通过相关输入输出宏达到同样的效果

GPIO_OUTPUT_SET(gpio_no,bit_value);     //设置gpio_no输出bit_value
GPIO_DIS_OUTPUT(gpio_no);               //设置gpio_no为输入管脚
GPIO_INPUT_GET(gpio_no);                //获取gpio_no管脚电平
例子:
GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 1);    //GPIO13输出高电平
GPIO_DIS_OUTPUT(0);                     //设置GPIO0为输入管脚
GPIO_INPUT_GET(GPIO_ID_PIN(5));         //读取GPIO5管脚电平

这样对GPIO管脚的定义和操作就结束了,最好把GPIO的初始化放到函数里,避免user_init()函数过长。


最后再说一个小方法,我在学校做项目的时候,因为要自己设计pcb板,有时候管脚连线会发生变化,而我写的函数有很多,这样要在那么长的代码里找到gpio_init()这个函数实在麻烦,所以可以通过宏定义的方式来定义GPIO口,比如:

#define RELAY_LED_PIN_NUM         4
#define RELAY_LED_PIN_FUNC        FUNC_GPIO4
#define RELAY_LED_PIN_MUX         PERIPHS_IO_MUX_GPIO4_U
#define RELAY_LED_PIN_RD_INIT()   PIN_FUNC_SELECT( RELAY_LED_PIN_MUX, RELAY_LED_PIN_FUNC )
#define RELAY_LED_PIN_SET_HIGH()  GPIO_OUTPUT_SET(RELAY_LED_PIN_NUM,1)
#define RELAY_LED_PIN_SET_LOW()   GPIO_OUTPUT_SET(RELAY_LED_PIN_NUM,0)
#define RELAY_LED_PIN_STATUS      ( GPIO_INPUT_GET(RELAY_LED_PIN_NUM) != 0 )

这样一来只需要在程序开头修改就可以作用整个文件,比较方便。

你可能感兴趣的:(ESP8266)