0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ESP32学习笔记:硬件定时器

CHANBAEK 来源:跳动的字节 作者:晓宇 2023-07-14 15:00 次阅读

今天我们来玩儿硬件定时器

硬件定时器概述

ESP32内置4个64-bit的通用定时器,每个定时器包含一个 16-bit 预分频器和一个64-bit 可自动重新加载向上/向下计数器,定时器是分为两组的,每组两个。

定时器有以下特性:

  • 16-bit 时钟预分频器,分频系数为 2-65536
  • 64-bit 时基计数器
  • 可配置的向上/向下时基计数器:增加或减少
  • 暂停和恢复时基计数器
  • 报警时自动重新加载
  • 当报警值溢出/低于保护值时报警
  • 软件控制的即时重新加载
  • 电平触发中断和边沿触发中断

每个定时器以APB_CLK(80MHz)作为基础时钟,通过预分频器(16-bit)进行分频后,产生最终的时钟信号,每过一个周期,计数器会向上加一或者向下减一,计数器支持自动重新加载和软件即时重新加载,计数器达到软件设定值时会触发报警事件。

使用定时器,可以按照一定的频率自动的重复执行我们需要的任务,本示例我们简单演示一个LED灯在定时器的控制下闪烁的案例。

硬件

SDA硬件连接很简单,这里接到IO4

图片

软件

初始化定时器

定时器使用前需要初始化,第一个参数为使用哪个定时器,这里有4个定时器,所以参数可为0,1,2,3;第二个参数为预分频数,定时器时钟为80MHz,如果我们这里设置为80,那么每个计数周期就是1us;第三个参数为是否向上计数,true为向上,反之亦然。

hw_timer_t * timerBegin(uint8_t timer, uint16_t divider, bool countUp);

设置定时器中断回调函数

第一个参数为使用哪个定时器;第二个参数为定时器超时,中断的回调函数;第三个参数,如果为true,则报警产生边缘类型中断。

void timerAttachInterrupt(hw_timer_t *timer, void (*fn)(void), bool edge);

设置定时器的定时值

第一个参数为使用哪个定时器;第二个参数为定时器的定时值,如果为1000000,每个计数周期为1us,定时时间就是1秒;第三个参数为是否自动重载,选择true,在定时时间到达后会重复计时。

void timerAlarmWrite(hw_timer_t *timer, uint64_t interruptAt, bool autoreload);

启动定时器

启动定时器后,将开始计时。

bool timerAlarmEnabled(hw_timer_t *timer);

定时器还有其它函数,都在库文件中,大家可以在下面两个文件中找到相关源码。

esp32-hal-timer.h
esp32-hal-timer.c

完整程序

这里我们用一个例子来演示一下,定时器计时周期设置为1秒,在中断函数中控制指示灯以1秒为周期闪烁。

#define LED_GPIO 4

/* 创建硬件定时器 */
hw_timer_t * timer = NULL;
/* LED 状态 */
byte led_state = LOW;
 
void IRAM_ATTR Timer0_Interrupt(){
  led_state = !led_state;
  digitalWrite(LED_GPIO, led_state);
}
 
void setup() {
  Serial.begin(115200);
  pinMode(LED_GPIO, OUTPUT);
 
  /* 使用定时器0,1/(80MHZ/80) = 1us ,周期为1us */
  timer = timerBegin(0, 80, true);
 
  /* 中断回调函数为Timer0_Interrupt */
  timerAttachInterrupt(timer, &Timer0_Interrupt, true);
 
  /* 计数Count为1000000,也就是1秒中断一次,重复计数 */
  timerAlarmWrite(timer, 1000000, true);
 
  /* 启动定时器*/
  timerAlarmEnable(timer);
  Serial.println("timer0 start");
}
 
void loop() {
 
}

实验效果:

图片

示波器观察:

图片

定时器使用比较简单,当然,在一些不是特别精准的场合,使用一个硬件定时器,我们也可以创建软件定时器,这样就可以定义很多个不同的定时任务了,这个后面遇到案例了我们再展开讨论。

感谢大家,关于ESP32的学习,希望大家Enjoy!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 分频器
    +关注

    关注

    43

    文章

    447

    浏览量

    49822
  • 计数器
    +关注

    关注

    32

    文章

    2254

    浏览量

    94374
  • 时钟
    +关注

    关注

    10

    文章

    1722

    浏览量

    131378
  • 定时器
    +关注

    关注

    23

    文章

    3242

    浏览量

    114521
  • ESP32
    +关注

    关注

    18

    文章

    960

    浏览量

    17116
收藏 人收藏

    评论

    相关推荐

    通用硬件定时器的相关资料下载

    ESP32ESP-IDF 学习笔记(三)【通用硬件定时器(Timer)】文章目录
    发表于 12-09 06:09

    为什么选择esp_timer定时器作为esp32首选软件定时器

    ESP32ESP-IDF 学习笔记(四)【高分辨率软件定时器esp_imer)】文章目录
    发表于 01-07 08:14

    ESP32S2硬件定时器中断翻转GPIO问题求解

    使用ESP32S2作为平台,设置硬件定时器每隔500us调用一次中断函数,在中断函数里面翻转一个GPIO的管脚;用逻辑分析仪能抓到一个周期为1ms,脉宽为500us的方形波形;但是初始化
    发表于 02-16 07:47

    ESP8266的管脚的控制和软件定时器的使用

    先说定时器ESP8266内部的定时器分为软件定时器硬件定时器。手册中指出
    的头像 发表于 07-29 14:57 9453次阅读
    <b class='flag-5'>ESP</b>8266的管脚的控制和软件<b class='flag-5'>定时器</b>的使用

    ESP32 开发笔记(四)LVGL控件学习 Window 窗口控件 X

    ESP32 开发笔记(四)LVGL控件学习 Window 窗口控件 X
    发表于 11-14 09:06 6次下载
    <b class='flag-5'>ESP32</b> 开发<b class='flag-5'>笔记</b>(四)LVGL控件<b class='flag-5'>学习</b> Window 窗口控件 X

    基于硬件定时器的软件定时器

    概括硬件定时器很精确,软件定时器无论如何都有延迟,主要用在不需要精确定时的地方,而且软件定时比较浪费单片机资源。梳理讲到
    发表于 11-25 09:51 8次下载
    基于<b class='flag-5'>硬件</b><b class='flag-5'>定时器</b>的软件<b class='flag-5'>定时器</b>

    ESP32ESP-IDF 教学(三)——通用硬件定时器(Timer)

    ESP32ESP-IDF 学习笔记(三)【通用硬件定时器(Timer)】文章目录
    发表于 11-26 11:36 37次下载
    <b class='flag-5'>ESP32</b> 之 <b class='flag-5'>ESP</b>-IDF 教学(三)——通用<b class='flag-5'>硬件</b><b class='flag-5'>定时器</b>(Timer)

    [ESP32]学习笔记02

    [ESP32学习笔记02]使用ViusalStudio2017开发ESP32、按键输入检测前言一、安装Visual Studio 2017二、配置开发环境1.安装ViusalGDB2.
    发表于 12-03 17:36 23次下载
    [<b class='flag-5'>ESP32</b>]<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>02

    [ESP32]学习笔记04

    Analog-to-Digital Converter(模数转换)的使用今天我们学习ESP32提供的ADC外设的使用,ESP32的每个ADC单元都支持两种模式,单次读取和连续读取(D
    发表于 12-22 19:02 9次下载
    [<b class='flag-5'>ESP32</b>]<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>04

    SPI主线协议——ESP32学习笔记

    目录SPI主线协议——ESP32学习笔记零、前言一、什么是SPI?二、通信过程​三、极性和相位四、总结SPI主线协议——ESP32学习
    发表于 12-22 19:23 18次下载
    SPI主线协议——<b class='flag-5'>ESP32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>

    ESP32_PWM学习总结

    esp32——PWM学习总结什么是PWM在esp32中初始化配置定时器配置通道配置修改输出占空比方式使用软件改变 PWM 占空比使用硬件改变
    发表于 12-22 19:39 12次下载
    <b class='flag-5'>ESP32</b>_PWM<b class='flag-5'>学习</b>总结

    ESP32 单片机学习笔记 - 04 - ADC和定时器

    ESP32 单片机学习笔记 - 04 - ADC和定时器一、模拟数字转换 ADC编程指南:Analog to Digital Conver
    发表于 01-17 13:18 11次下载
    <b class='flag-5'>ESP32</b> 单片机<b class='flag-5'>学习</b><b class='flag-5'>笔记</b> - 04 - ADC和<b class='flag-5'>定时器</b>

    定时器学习笔记

    学习报告20210522定时器的概述与结构8051单片机片内有二个十六位定时器/计数定时器0(T0)和
    发表于 01-17 13:29 2次下载
    <b class='flag-5'>定时器</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>

    基于ESP32的低功耗蓝牙暗室定时器

    电子发烧友网站提供《基于ESP32的低功耗蓝牙暗室定时器.zip》资料免费下载
    发表于 02-09 11:53 0次下载
    基于<b class='flag-5'>ESP32</b>的低功耗蓝牙暗室<b class='flag-5'>定时器</b>

    ESP32-C3硬件定时器简介及使用

    ESP32-C3 有2个定时器组,每个组有2个定时器,共有4个定时器
    的头像 发表于 03-14 11:43 4611次阅读
    <b class='flag-5'>ESP32</b>-C3<b class='flag-5'>硬件</b><b class='flag-5'>定时器</b>简介及使用