这次让我来说说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 )
这样一来只需要在程序开头修改就可以作用整个文件,比较方便。