ESP8266_04管脚控制与软件定时器

ESP8266_04管脚控制与软件定时器

from :https://mp.weixin.qq.com/s/APawDx4io4gKJyOeuErTLA

原创: MCU启航 单片机爱好者 今天

这一节主要有两部分内容:1、管脚的控制;2、软件定时器的使用。

先说定时器,ESP8266内部的定时器分为软件定时器和硬件定时器。手册中指出硬件定时器其实就跟单片机里的timer一样,而软件定时器纯粹由软件实现,咱们可以理解为单片机里面类似for循环之类的循环延时函数。

定时器理解了,管脚控制就简单了,先上一下我这里的模块原理图:

原理很简单,板上有一个三色的LED,所以这里实现一个定时实现LED开关的程序。先说GPIO的用法,分俩步。使用之前包含“user_interface.h”文件:

1、设置管脚为普通的GPIO模式

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);

函数PIN_FUNC_SELECT的功能是选择管脚功能,第一个参数是管脚的名字,第二个参数看起来像管脚编号,但其实是管脚对应的功能。

在编译器中选中FUNC_GPIO12,按F3,会打开eagle_soc.h文件,在这个文件里你会发现,无论是FUNC_GPIO12,FUNC_GPIO13,还是多少,对应的宏定义都是3:

#define FUNC_GPIO12                     3

2、设置管脚方向和电平

gpio_output_set(BIT12, BIT13, BIT12|BIT13, 0):

该函数的功能是设置GPIO属性,共有四个参数,没有用到的填0即可。

第一个参数,设置输出为高的位;

第二个参数,设置输出为低的位;

第三个参数,设置使能输出的管脚;

第四个参数,设置使能输入的管脚。

所以上面一行代码的意思是:设置GPIO12和GPIO13为输出,12输出高,13输出低。同理,下面一行代码的意思是:设置GPIO12为输入。

gpio_output_set(0, 0, 0, BIT12):

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

然后是软件定时器的使用,使用之前包含如下两个头文件:

#include "ets_sys.h"       //内有timer结构体的定义

#include "osapi.h"

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

1、定义一个软件定时器的结构体

os_timer_t LED_timer;             //定义一个软件定时器的结构体,用于实现周期操作

2、关掉该定时器的定时功能

os_timer_disarm(&LED_timer);      //配置之前,先关闭

3、设置该定时器的回调函数。使用定时器,必须设置回调函数

os_timer_setfn(&LED_timer, (os_timer_func_t *)LED_TURN, NULL);

该函数共有三个参数:

第一个,你要设置哪个定时器?LED_timer

第二个,定时器定时时间到了之后,要执行哪个函数:LED_TURN

第三个,回调函数的参数,没有的话写NULL即可。

完了,也很简单。等等!定时的时长是多少?别急。

4、使能定时器,并设置时长,是否循环执行

os_timer_arm(&LED_timer, 3000, 1);

该函数共有三个参数:

第一个,你要使能哪个定时器?         LED_timer

第二个,时长多长?                                 3000,单位是毫秒。另有微秒的函数,可自行研究。

第三个,这三秒定时的功能只运行一次,还是循环执行?1,循环;0,一次。

第三步里,提到了一个函数LED_TURN,这个函数就是开启或关闭LED的函数:

void LED_TURN()

{

static state_flag = 0;

if(state_flag == 0)

{

//GPIO12拉高,GPIO13拉低

gpio_output_set(BIT12, BIT13, BIT12|BIT13, 0);

state_flag = 1;

}

else

{

gpio_output_set(BIT13, BIT12, BIT12|BIT13, 0);

state_flag = 0;

}

}

到此,软件定时器的用法说完了。

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

 注意事项:手册建议,不要在程序中使用while(1)  实现死循环,非常危险。

依次clean和build一下,生成bin文件,下载后可看到板上的LED,依次亮灭。

程序下载链接:https://pan.baidu.com/s/1fDc4ap2TeazjP_nQL7ZtVg
         提取码:9onb

原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/11260321.html

时间: 2024-10-15 21:53:03

ESP8266_04管脚控制与软件定时器的相关文章

第二天:SLAM智能小车DIY乐趣-小车控制stm32软件基础

SLAM智能小车DIY乐趣-小车控制stm32软件基础 ####写在前面#### 前面介绍了小车控制stm32硬件基础,本文就来介绍配套的小车控制stm32软件基础.关于stm32开发相关的基础知识这里就不多说了,有需要的小伙伴可以查阅相关资料进行学习,这里重点从小车控制项目入手,直接进行跟实际需求相关的开发.本文主要内容: 1) 电机控制 2) 编码器数据读取 3) 串口数据收发 4) 电机速度PID控制 5) 周期性控制 6) 小车控制软件整体框图 ####正文#### 1.电机控制 电机控

毫秒,微妙级别软件定时器

单片机开发中,软件定时器是常用的工具.定时执行特定任务和延时功能,都可以用软件定时器实现. 常见的延时函数的实现做法有: 1. 使用空指令进行延时,通过控制空指令的执行次数,进行延时.优点:不需要占用系统外设.缺点:系统运行指定个空指令的时间不稳定,中途出现的中断处理会严重影响计时的精确性. 2.使用单片机的定时器外设,设定特定的时间产生中断,进行计时.优点:计时准确,不受其他中断影响计时.缺点:浪费单片机外设资源,并且延时处理不能嵌套调用,灵活性不够. 这里要介绍的是利用单片机内部的sysTi

【TencentOS tiny】深度源码分析(8)——软件定时器

软件定时器的基本概念 TencentOS tiny 的软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受硬件定时器资源限制的定时器服务,本质上软件定时器的使用相当于扩展了定时器的数量,允许创建更多的定时业务,它实现的功能与硬件定时器也是类似的. 硬件定时器是芯片本身提供的定时功能.一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断.硬件定时器的精度一般很高,可以达到纳秒级别,并且是中

实现自己的软件定时器

为什么要实现软件定时器: 在芯片平台上,地址空间也是相当宝贵的,如果保留了更多的硬件定时器的话,就需要更多的地址空间,那么我们能不能作个折中方案呢?答案是肯定的,我们可以使用一个硬件定时器,来模拟实现一个软件定时器,可以满足更多的定时需求,需要注意的一点就是软件定时器精度可能会有稍微误差,因为会涉及到任务调度.锁中断等,在对定时精度要求不高的场景,可以考虑使用软件定时器.Linux内核中的timer_list精度为10ms,这里我们来实现一套精度为1ms的软件定时器(当然可以实现精度为微秒级的,

高效软件定时器的设计

软件定时器在协议栈等很多场景都有广泛的应用,有时候会有大量的定时器同时处于工作状态,它们的超时时间各异,要高效的保证每个定时器都能够较为准确的超时并执行到其回调函数并不是一件易事.本文分析嵌入式实时操作系统Nucleus的定时器方案,它巧妙的管理了一条按照相对时间来排序的双向链表,避免每次tick中断都要遍历链表检查超时和更新剩余时间,实现了一种相当高效的软件定时器. 结构体TM_TCB来表示动态创建的定时器,其定义如下 typedef struct TM_TCB_STRUCT { /*Nucl

软件定时器-闹钟提醒我们该吃饭吃饭,该睡觉睡觉

闹钟提醒我们该吃饭吃饭,该睡觉睡觉 原文地址:http://blog.csdn.net/u011833609/article/details/28862125 softwaretimer.h #ifndef _SOFTWARETIMER_H_ #define _SOFTWARETIMER_H_ typedef enum{z_false = 0, z_true = !z_false} z_bool; typedef unsigned char z_uchar; typedef unsigned c

μC/OS-II中使用软件定时器

在试着将μC/OS-II移植到ARM7芯片(LPC2138)上的过程中,发现使用OSTmrCreate创建的OSTmr始终都不能执行CallbackFunction,OS版本是v2.85,最后是这么解决的. 在文档<uCOS-II-RefMan.PDF>中找到了关于“OSTmrSignal()”这个函数的一段描述: OSTmrSignal() is called either by a task or an ISR to indicate that it’s time to update th

软件定时器osTimerCreate返回NULL

CMSIS-RTOS是对FreeRtos的封装,函数名比較适合纯软件编程. 如今的版本号是1.0.2. id1 = osTimerCreate(osTimer(Timer_1), osTimerOnce, NULL); 可是这个osTimerCreate总是返回0x00000000. 就是创建软件定时器不成功. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/di

OSAL之时间管理,软件定时器链表管理

读源码写作,尊重原创: 本博文根据蓝牙4.0, 协议族版本是1.3.2 OSAL的时钟实现在OSAL_CockBLE.c与OSAL_Clock.h两个文件中.OSAL支持完整的UTC(世界统一时间),以2000年1月1日00:00:00为时间起点,可以精确到年.月.日.时.分.秒的时间值. 背景知识 // number of seconds since 0 hrs, 0 minutes, 0 seconds, on the 1st of January 2000 UTC存储自2000年1月1日开