ESP8266_06硬件定时器与IO中断

ESP8266_01搭建开发环境

ESP8266_02程序的编译与下载

ESP8266_03SDK与Makefile的基本用法

ESP8266_04管脚控制与软件定时器

ESP8266_05 ESP8266有几个串口?

ESP8266_06硬件定时器与IO中断

ESP8266_07基于PWM的呼吸灯

ESP8266_08基于flash的数据掉电保护

ESP8266_09基于IIC控制的OLED屏幕

ESP8266_10 ESP8266的STATION模式

ESP8266_11 ESP8266的UDP广播

ESP8266_12 ESP8266客户端模式下的TCP通信

ESP8266_13服务器端模式下的TCP通信

ESP8266_14 SOFTAP模式下的服务器端和客户端

ESP8266_15天气预报之TCP的GET操作

ESP8266_16天气预报之JSON数据的生成与解析

ESP8266_17简单网络时间协议-SNTP

ESP8266_18 MQTT协议接入ONENET平台

ESP8266_19MQTT协议接入ONENET平台_订阅主题

ESP8266_20 基于ONENET平台的数据上传之TCP的POST操作

ESP8266_21基于ESP8266的一键配网

ESP8266_22基于自身ADC的电压采样

ESP8266_23基于硬件定时器的红外遥控器解码

         这一节主要有两部分内容:1、GPIO的中断用法;2、硬件定时器的使用。

         先说定时器,前面说过了软件定时器的用法,如果你已经掌握了,那么硬件定时器基本是差不多的。都要设置回调函数、定时时间,区别的话,不用定义结构体,同时要选择中断源。

         GPIO的中断也很好理解,跟单片机的管脚用法基本一样,设置为输入模式,开启中断等等~

         如何演示?

依然使用三色LED,同时板上还有一个按键。所以这里实现一个按键控制LED闪烁开关的程序。按一下按键,LED开始闪烁,再按一下,停止闪烁,并熄灭。

先说GPIO配置为输入、中断的用法,分6步,使用之前包含“user_interface.h”文件:

         1、设置管脚4为GPIO模式

         PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4);

         函数PIN_FUNC_SELECT的功能是选择管脚功能,第一个参数是管脚的名字,第二个参数是管脚对应的功能。

         2、设置GPIO4为输入模式

         GPIO_DIS_OUTPUT(GPIO_ID_PIN(4));

         3、禁止所有的IO中断

         ETS_GPIO_INTR_DISABLE();

4、设置中断处理函数

ETS_GPIO_INTR_ATTACH(GPIO_intr_handler,NULL);

5、配置GPIO4为下降沿触发的中断方式

gpio_pin_intr_state_set(GPIO_ID_PIN(4),GPIO_PIN_INTR_NEGEDGE);

6、使能GPIO中断

ETS_GPIO_INTR_ENABLE();

         注:参考手册esp8266-technical_reference_cn的20页。

 

         然后是硬件定时器的使用:

使用方法也很简单,共分3步:

1、选择中断源,选择定时器是否自动填充

hw_timer_init(0,1);         

该函数共有两个参数:

参数1:选择中断源。0,使用 FRC1 中断源,1,使用 NMI 中断源

参数2:是否自动填装。0,不自动填充,1,自动填充。

2、设置回调函数

hw_timer_set_func(LED_TURN);   

3、启动定时器,设置定时时间,单位us

hw_timer_arm(1000000);

 

注:参考手册2c-esp8266_sdk_api_guide_cn_v1.5.4的21页。

 

         下载了例程的童鞋会看到,我给定时器在不同情况下设置了两个回调函数:

hw_timer_set_func(LED_TURN);   

         hw_timer_set_func(LED_OFF);

         第一个函数LED_TURN实现的是LED定时闪烁,第二个函数LED_OFF实现的是LED熄灭。熄灭的时候,定时器依然在跑,只是管脚始终都拉低了。有人会问,你把定时器关掉不行吗?弄这么麻烦?

         这个~~~

         如果我告诉你SDK里面没有硬件定时器关闭的函数,你信吗?

         事实就是这样,我翻了一遍hw_timer.c文件,里面只有开启定时器的函数,没有关闭的函数。但是,它提到了控制哪个寄存器的哪一位能开启定时器,所以,感兴趣的童鞋可以自己写一个硬件定时器关闭的函数。

         保存、编译、下载一条龙,然后重新上电,按一下按键,你会发现LED开始闪烁,再按一下,LED熄灭了。

         到此,硬件定时器和GPIO中断的用法说完了。

         链接:https://pan.baidu.com/s/1aJJsmoAF7s9fPH160zs_SQ

提取码:t1r6

         除此之外,再说一下“ICACHE_FLASH_ATTR”的用法。

         打开ESP8266的SDK,你会看到很多函数前面加了这个东西。这是啥?(以下内容摘自乐鑫论坛)

         这是SDK内部定一个的一个宏。简单来说,添加了 "ICACHE_FLASH_ATTR" 宏的函数,将存放在 IROM 中,CPU 仅在调用到它们的时候,将它们读到 cache 中运行;没有添加 "ICACHE_FLASH_ATTR" 宏的函数,将在一开始上电运行时,就加载到 IRAM 中运行。

         由于空间有限,无法将所有代码都一次性加载到 IRAM 中运行,因此在大部分函数前添加 "ICACHE_FLASH_ATTR" 宏,放在 IROM 中。

         请注意,不要在中断处理函数中调用带有 "ICACHE_FLASH_ATTR" 宏的函数,否则将引起异常。

发布了27 篇原创文章 · 获赞 7 · 访问量 5204

猜你喜欢

转载自blog.csdn.net/lazyduck/article/details/98077917