GPIO输出
开发板原理图如下所示:
引脚功能配置:
在使用 stm32 时,引脚都有很多的复用功能,当我们想要使用引脚的某个功能(如I2C SPI)等,就需要配置引脚的功能。ESP6266也是如此,下面列出了8266引脚的复用功能:
如上图所示,这个引脚的功能1是N0RXD(串口0数据接收引脚),功能2是I2SO_DATA(I2S数据引脚)、功能4是普通的GPIO3、功能5是CLK_XTAL(时钟晶振引脚),然后这个功能配置寄存器的地址如下所示:
在技术参考手册中,也有配置功能的描述:
由上面的分析可知,如果我们希望使用功能4配置为GPIO3,则要往寄存器对应位写入3。在 eagle_soc.h 头文件中,有设置寄存器地址和功能的宏定义:
上图的地址和写入值,都跟我们的分析相一致,使用 PIN_FUNC_SELECT 语句来选择引脚功能。
我们来分析一下 PIN_FUNC_SELECT 这个语句:
可以看到,这个宏定义其实就是往选定的引脚配置寄存器中,写入想要配置的功能(GPIO I2C SPI等)。
配置GPIO输出的过程如下:
1 先选定一个GPIO管脚,用 PIN_FUNC_SELECT(PIN_NAME, FUNC) 函数。
比如我选定GPIO14这个管脚,则这样写:PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);
这里的参数,在下面可以找到:
2 设置GPIO为输出模式,并设置电平;
如果你设置GPIO14这个管脚为高电平,则这样写:GPIO_OUTPUT_SET(GPIO_ID_PIN(14), 1);
GPIO_OUTPUT_SET 这个函数,第一个参数为GPIO引脚编号,定义如下所示:
这里,GPIO引脚编号用了一个宏定义来表示,实际上直接就是IO口的序号,GPIO理论部分结束。
点亮流水灯实验:
代码部分非常简单,如下所示:
编译程序并下载,LED灯确实在循环的闪烁,并在串口有调试信息输出:
GPIO输入
接下来使用GPIO输入来进行按键检测,首先看下原理图:
可以看到,BOOT引脚接到了GPIO0,默认被10K电阻上拉为高电平;当按键按下时,GPIO0变为低电平。
配置输入模式的步骤:
1 调用PIN_FUNC_SELECT函数,配置引脚功能为GPIO;
如配置GPIO0引脚为IO口,则使用语句PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);
2 配置GPIO引脚为输入模式;
3 设置是否开启GPIO内部上拉;
GPIO输入 按键检测实验:
由于我手中的开发板,好像确实是有硬件问题,所以无论是自己写的或者是提供的例程,这个按键检测实验都失败了。
EXTI 外部中断
ESP8266的EXTI外部中断配置,其实很简单:
可以看到,前面的配置和基本的GPIO输入模式相同,接下来就是配置外部中断:
1 调用ETS_GPIO_INTR_DISABLE(函数位于ets_sys.h头文件),先关闭GPIO中断,以进行配置;
2 调用ETS_GPIO_INTR_ATTACH这个API,注册中断回调函数(中断函数要自己实现);
3 设置为下降沿中断;
其中,可以设置的中断源如下所示:
4 使能EXTI中断;
5 编写中断服务函数(主要部分);
下面是中断服务函数的主体,来进行逐句分析:
首先是两个宏定义,用于读取寄存器和写入寄存器,如下图所示:
GPIO_REG_READ用于读取寄存器值,GPIO_REG_WRITE向寄存器写入值。
接下来,看一下GPIO相关的寄存器描述:
这就是以下代码的功能描述:
接下来,判断是否有中断,然后翻转LED,如下所示:
程序编译下载,能够正确执行。每次按键按下时,LED进行状态翻转,不会出现之前GPIO输入模式时的错误情况。
整个工程代码如下: