ESP32 + ESP-IDF |GPIO 02 - 使用高分辨率定时器,每100ms时间间隔驱动外部两个LED灯闪烁
文章目录
- 一、前言
- 二、VSCODE + ESP-IDF
- 2.1、快速创建项目
- 2.2、选择串口通道,ESP芯片型号
- 三、代码
- 3.1、头文件
- 3.2、全局变量
- 3.3、app_main( )函数
- 3.4、定时器回调函数
- 3.5、实验代码
- 四、相关API
- 4.1、函数esp_timer_init( )
- 4.2、函数esp_timer_create( )
- 4.3、函数esp_timer_start_periodic( )
- 4.4、变量类型esp_timer_handle_t
- 4.5、变量类型esp_timer_create_args_t
一、前言
ESP-IDF实际上是基于freeRTOS的SDK,官网介绍freeRTOS还经过剪裁与优化。
使用过RTOS的同学肯定知道其实RTOS也有定时器(专业点来说它是软定时器),跟基于一定频率轮询的任务Task相比,RTOS的软定时器一般优先级较低。本次实验使用ESP32的16bit高分辨率定时器,它是基于硬件定时器的。硬件定时器的实时性肯定比软件定时器好得多!
以下摘自ESP官网:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/system/esp_timer.html
总结:
- 官方直接限制了定时器的最高频率是20kHZ(50us),官方的建议是使用外部的硬件外设来解决,或者使用DMA。简单来说,esp32不能用于高频(超过20kHz)的中断应用。
- esp_timer跟freeRTOS的定时器一样,可以提供一次性的定时器与周期性的定时器。区别在于esp_timer的优先级高,freeRTOS的定时器的优先级低。
- esp_timer是使用64位硬件定时器实现的API。
- 定时器回调函数尽可能做少的工作。(跟学习stm32的硬件定时器时一样)
实验的现象:
闪烁的频率增加至10Hz(100ms)
ESP-IDF Monitor打印出来的信息:
二、VSCODE + ESP-IDF
2.1、快速创建项目
按照上一章节的方式创建一个sample_project的模版。
2.2、选择串口通道,ESP芯片型号
还是按照上一章节的方式来选择串口通道与ESP芯片信号
三、代码
3.1、头文件
增加一个头文件esp_timer.h
3.2、全局变量
- 声明定时器1的回调函数
- 定义定时器1的句柄
- 定义定时器1参数结构体
3.3、app_main( )函数
创建定时器之前,先调用esp_timer_init( )初始化所有定时器。
3.4、定时器回调函数
3.5、实验代码
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "esp_timer.h"/* 定时器1回调函数 */
void timer1_Callback(void *arg);static uint8_t s_led_state = 0;
static const char *TAG = "blink LED & 16bit timer";
static esp_timer_handle_t timer1_handler; /* 定时器1的句柄 *//* 定时器1的参数 */
static esp_timer_create_args_t timer_Once_Obj = {.name = "Timer_NUM_1", /* 定时器的名称 */.arg = NULL, /* 传递给回调函数的参数 */.callback = &timer1_Callback, /* 回调函数 */
};void app_main(void)
{ESP_LOGI(TAG, "Example configured to blink GPIO LED!");/* 复位GPIO的状态 */gpio_reset_pin(26);gpio_reset_pin(27);/* 设置GPIO为输出模式 */gpio_set_direction(26,GPIO_MODE_OUTPUT);gpio_set_direction(27,GPIO_MODE_OUTPUT);/* 初始化定时器 */esp_timer_init(); /* 创建定时器1 */esp_timer_create(&timer_Once_Obj,&timer1_handler);/* 启动定时器1(周期性) */esp_timer_start_periodic(timer1_handler,100 * 1000);while(1){vTaskDelay(300 / portTICK_PERIOD_MS); /* 延时300ms */}}/* 定时器1回调函数 */
void timer1_Callback(void *arg)
{int64_t get_time = esp_timer_get_time(); /* 获取自启动以来的时间(单位us) */ESP_LOGI(TAG, "Time is : %lld", get_time); /* 通过log打印出来 */ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" : "OFF");gpio_set_level(26,s_led_state); /* GPIO26输出电平 */gpio_set_level(27,s_led_state); /* GPIO27输出电平 */s_led_state = !s_led_state; /* 取反LED的状态 */
}
四、相关API
4.1、函数esp_timer_init( )
4.2、函数esp_timer_create( )
如果定时器不再需要时,调用esp_timer_delete( )将其删除。
4.3、函数esp_timer_start_periodic( )
4.4、变量类型esp_timer_handle_t
简单来说,就是用于创建定时器对象的句柄。
static esp_timer_handle_t timer1_handler; /* 定时器1的句柄 */
4.5、变量类型esp_timer_create_args_t
/* 定时器1的参数 */
static esp_timer_create_args_t timer_Once_Obj = {.name = "Timer_NUM_1", /* 定时器的名称 */.arg = NULL, /* 传递给回调函数的参数 */.callback = &timer1_Callback, /* 回调函数 */
};
ESP32 + ESP-IDF |GPIO 02 - 使用高分辨率定时器,每100ms时间间隔驱动外部两个LED灯闪烁相关推荐
- ESP32 + ESP-IDF |GPIO 01 - 驱动外部两个LED灯,以每300ms的时间间隔闪烁
文章目录 一.前言 二.VSCODE + ESP-IDF 2.1.快速创建项目 2.2.选择串口通道,ESP芯片型号 三.代码 3.1.main.c 3.1.1.头文件 3.1.2.全局变量 3.1. ...
- NVIDIA Jetson Nano GPIO口和通信协议简单介绍及点亮第一个程序LED灯闪烁
在前面的文章中,我已经想大家介绍了NVIDIA Jetson Nano这个板子.今天我将给大家介绍NVIDIA Jetson Nano最重要的一个接口–GPIO.Jetson Nano 和树莓派一样作 ...
- STM32定时器控制LED灯闪烁及PWM练习
一.STM32定时器控制LED灯闪烁 1.相关配置 1)配置RCC和SYS 2)配置IO 配置PC15,并命名为D1. 3)配置定时器 选定时器2,配置Clock Source为Internal Cl ...
- STM32学习 3:GPIO管脚配置与第一个STM32实验:LED灯闪烁
STM32学习 3:GPIO管脚配置与第一个STM32实验:LED灯闪烁 1,GPIO管脚简介与配置 1.1GPIO框图 1.2GPIO不同模式 1.3 GPIO寄存器 1.4 GPIO库函数配置 2 ...
- STC8H8K64U——定时器T0(LED灯闪烁)
LED灯闪烁 使用定时器实现延时实现LED灯闪烁,定时 5ms,count 计数50定时 250ms #include <STC8H.H>sbit LED = P2^0; unsigned ...
- 中断系统应用实例(1)用定时器T1工作方式1控制两个LED以不同周期闪烁
1.控制目标 利用定时器T1工作方式1控制两个LED以不同周期闪烁,使得LED1每秒闪烁4次(即周期为250ms),LED2每秒闪烁1次(即周期为1s). 2.控制分析 2.1 LED侧分析 若要使L ...
- AT89C52利用定时器控制单个led灯闪烁
AT89C52利用定时器控制单个led灯闪烁 keil芯片选择AT89C52 新建一个.c文件,将代码拷贝进去,然后保存. 然后将保存的.c文件加载到工程项目里面去. 设置好生产hex文件,就可以编译 ...
- STC15单片机-GPIO模式介绍以及LED灯闪烁
GPIO 1.说明 GPIO,英文全称 General-purpose input/output,即通用型输入输出,是单片机中最常用的外设之一. 2.设置模式 STC15系列单片机最多有62个I/ ...
- 实例2:树莓派GPIO控制外部LED灯闪烁
实例2:树莓派GPIO控制外部LED灯闪烁 实验目的 通过背景知识学习,了解四足机器人mini pupper搭载的微型控制计算机:树莓派. 通过树莓派GPIO操作的学习,熟悉GPIO的读写控制. 通过 ...
最新文章
- 柏拉图-理想国(西方哲学的源头)-教你如何思考人生 思考世界 思考社会
- 2010年上半年计算机专业技术资格考试工作安排
- VTK:将点转换为字形用法实战
- 全屏的三栏div+css布局示例
- iOS- 关于AVAudioSession的使用——后台播放音乐
- sql if 和insert_拼多多面试:Mybatis是如何实现SQL语句复用功能的?
- 判断单链表是否带环?若带环,求环的长度?求环的入口点?(C语言)
- Spring、SpringMVC、Spring Boot、Spring Cloud 概念、关系及区别
- 起步 - 安装 Git
- ajax head带参数两次请求
- Spring Boot 注解描述
- Java初学者也可以实现的图书系统小练习
- ssh+dwr实现级联操作
- 计算机云计算论文范文,云计算环境下计算机管理系统论文
- 如何借助SVG+CSS用2个小时撸完一个网易云音乐的动效海报(可控制速度)
- Quantopian投资组合和绩效分析工具:Pyfolio
- 重带电粒子的能量歧离(energy straggling)
- stm32f105vct6例程_STM32F105VCT6_USB_TEST
- 美迪网站推广教你怎样写原创文章
- clickhouse SLB 服务搭建
热门文章
- linux socket函数详解,linuxSocket_函数.doc
- PPT导入视频裁剪后,如何裁剪后的视频另存为保存下来?
- 曾经开发的一个武冈市市民意见采集系统
- 使用css画太极,CSS画太极阴阳图
- C++ fgets()函数
- 利用短时傅里叶变换(STFT)对信号进行时频谱分析和去噪声
- Leetcode_123_Best Time to Buy and Sell Stock III
- MemSQL性能测试结果
- MPC(模型预测控制)_附matlab例程
- Python人工智能基础到实战课程-北方网视频