【esp32学习之路7——硬件定时器】

2023-05-16

一、概述

ESP32 的定时器分为 2 组,每组 2 个。ESP32 内置 4 个 64-bit 通用定时器。每个定时器包含一个 16-bit 预分频器和一个64-bit 可自动重新加载向上/向下计数器。详情可参考乐鑫文档

二、操作步骤

1、定时器初始化 - 启动定时器前应设置的参数,以及每个设置提供的具体功能。

2、定时器控制 - 如何读取定时器的值,如何暂停/启动定时器以及如何改变定时器的操作方式。

3、警报 - 如何设置和使用警报。

4、处理中断事务- 如何使用中断提供的回调函数。

知识点:
1、赫兹和秒的换算
HZ是频率的单位,是指每秒的周期次数(周期/秒);秒是时间的单位;f=1/T,T是周期。(其中f是指赫兹,T是指以秒为单位,10HZ即10次/秒)
1 HZ (1秒)1 kHz = 1 000 Hz(1MS) 1 MHz = 1 000 000Hz(1微秒)
2,分频器:分频就是把系统工作频率分频后当做定时器的工作频率;ESP32的输入时钟频率为80MHZ,就是1/80us=0.0125us计数器就会计数加一,如果设置分频系数为80,则1us就会计数加一,分频系数范围是0-65536

三、代码实现

下面用硬件定时器加中断实现一个1SLED的翻转,代码如下:

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/timer.h"
#include "driver/gpio.h"

#define TIMER_DIVIDER         (16)  //  Hardware timer clock divider
// convert counter value to seconds 80*1 000 000 HZ / 16 = 5 * 1 000 000 HZ
#define TIMER_SCALE           (TIMER_BASE_CLK / TIMER_DIVIDER)  

#define GPIO_NUM_26 26//IO口26
#define GPIO_OUTPUT_PIN_SEL  (1ULL<<GPIO_NUM_26)  // 配置GPIO_OUT位寄存器

__uint8_t led_flag = 0;

void gpio_init(void)
{
    gpio_config_t io_conf;  // 定义一个gpio_config类型的结构体,下面的都算对其进行的配置

    io_conf.intr_type = GPIO_PIN_INTR_DISABLE;  // 禁止中断  
    io_conf.mode = GPIO_MODE_OUTPUT;            // 选择输出模式
    io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL; // 配置GPIO_OUT寄存器
    io_conf.pull_down_en = 0;                   // 禁止下拉
    io_conf.pull_up_en = 0;                     // 禁止上拉

    gpio_config(&io_conf);                      // 最后配置使能
}

void IRAM_ATTR timer_group1_isr(void *para){
	    //获取定时器分组1中的哪一个定时器产生了中断
	    uint32_t timer_intr = timer_group_get_intr_status_in_isr(TIMER_GROUP_1); //仅在ISR中获取中断状态
	    if (timer_intr & TIMER_INTR_T0) {//定时器1分组的0号定时器产生中断
	        /*清除中断状态*/
	        timer_group_clr_intr_status_in_isr(TIMER_GROUP_1, TIMER_0);
	        /*重新使能定时器中断*/
	        timer_group_enable_alarm_in_isr(TIMER_GROUP_1, TIMER_0);//警报一旦触发后,警报将自动关闭,需要重新使能以再次触发
	    }
        /*led交替闪烁,时间为定时器时间1s*/
        if(led_flag==0){
        	led_flag =1;
        	gpio_set_level(GPIO_NUM_26, 0);//打开LED
        }else{
        	led_flag=0;
        	gpio_set_level(GPIO_NUM_26, 1);//关闭LED
        }
}

static void timer_init_test()
{
    //1、定时器初始化
    timer_config_t config = {
//分频器.设置定时器中计数器计数的速度,设置范围在2-65536,这里设置为16,默认的时钟源APB频率为80MHZ,所以定时器的频率为80/16=5MHZ即0.2US来一次脉冲
        .divider = TIMER_DIVIDER,
        .counter_dir = TIMER_COUNT_UP,//模式.向上递增
        .counter_en = TIMER_PAUSE,//暂停计数器计数,调用timer_start时才开始计数
        .alarm_en = TIMER_ALARM_EN,//使能定时器警报,到达计数器设置的值进入中断
        .auto_reload = 1,//设置计数器是否应该在定时器警报上使用自动重载首个计数值,还是继续递增或递减
    }; // default clock source is APB
    timer_init(TIMER_GROUP_1, TIMER_0, &config);//初始化和配置定时器,定时器组0,1中的定时器0,1一共四个定时器

    //2、定时器控制
    timer_set_counter_value(TIMER_GROUP_1, TIMER_0, 0);//指定定时器的首个计数值,写入定时器计数器的值为0
    
    //3、警报
    /* Configure the alarm value and the interrupt on alarm. */
    //MS设置64位警报值,此函数的第三个变量为64位的变量,即此变量为计数器的值5 * 1 000 000HZ * 0.2us = 1 S
    timer_set_alarm_value(TIMER_GROUP_1, TIMER_0, 1 * TIMER_SCALE);
    timer_enable_intr(TIMER_GROUP_1, TIMER_0);//使能定时器中断

    //4、处理中断事务
    timer_isr_register(TIMER_GROUP_1,TIMER_0,
			timer_group1_isr,  //定时器中断回调函数
			(void*)TIMER_0,    //传递给定时器回调函数的参数
			ESP_INTR_FLAG_IRAM, //把中断放到 IRAM 中
			NULL //调用成功以后返回中断函数的地址,一般用不到
    );

    timer_start(TIMER_GROUP_1, TIMER_0);//使能(启动)定时器
}

void app_main(void)
{
    gpio_init();//初始化GPIO

    timer_init_test();

    while (1) {

            vTaskDelay(1000 / portTICK_RATE_MS);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【esp32学习之路7——硬件定时器】 的相关文章

  • TRACE32——基于SNOOPer的变量记录

    TRACE32 基于SNOOPer的变量记录 在我们日常调试工作中 xff0c 经常会遇到一种场景 xff1a 对于某些变量或者内存的值 xff0c 希望对其进行监控 当这些变量发生写或者读的时候 xff0c 将这些操作记录下来 xff0c
  • TRACE32——内存填充测试Data.Pattern

    TRACE32 内存填充测试Data Pattern Data Pattern 命令可以用于对内存 xff08 SRAM DDR Flash等 xff09 写入随机值 xff0c 以快速地测试内存是否可以正确读写 命令格式 xff1a 示
  • STM32使用printf重定向

    最近用STM32CubeMX创建了一个demo工程 xff0c 在调试过程中 xff0c printf打印功能一直不能正常打印 xff0c 检查工程中也已将fputc函数进行了实现 奇怪的是用JTAG进行调试时打印恢复了正常 最后发现问题的
  • repo的安装和使用

    前言 Android 采用 Gerrit 提供代码评审服务 xff0c 并且开发了一个客户端工具 repo xff0c 实现多仓库管理 Git 的开发者对服务端的 Git 源码做了扩展 xff0c 使得基于 Git xff08 cgit x
  • repo sync之后不能自动 rebase 的定位

    背景 最近在使用repo sync同步代码时老是报告 xff1a branch xxx is published but not merged and is now 1 commits behind 我之前是由推送过一笔提交 xff0c 但
  • git取指定日期log问题

    库上版本有一个重要bug xff0c 使用了如下命令取一个版本 xff1a repo forall c 39 commitID 61 96 git log before 34 2022 12 09 00 00 00 34 1 pretty
  • ROS读取激光雷达点云数据(RS-Lidar为例)

    一 准备工作 xff1a 1 安装ROS xff08 含有rviz xff09 xff1b 2 安装pcl ros pcl xff08 Point Cloud Library xff09 ros 是ROS中点云和3D几何处理的接口和工具 如
  • 标准预定义的宏

    标准预定义宏是由相关的语言标准规定的 xff0c 所以它们可以在所有执行这些标准的编译器中使用 旧的编译器可能不会提供所有这些宏 它们的名字都以双下划线开头 FILE 这个宏扩展为当前输入文件的名称 xff0c 以 C 字符串常数的形式 这
  • Realsense L515使用

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 主要参考二 基本情况 xff08 一 xff09 ubuntu和ROS情况 xff08 二 xff09 主要步骤 总结
  • 电脑前置摄像头运行ORB-SLAM2 Mono

    ROS本地摄像头 下载安装usb cam包 最好将它放在ROS空间的src文件夹下 xff0c 方便管理 git clone https github com bosch ros pkg usb cam git usb cam cd usb
  • ERROR:cannot launch node of type

    当使用roslaunch启动ros节点时 xff0c 如果出现 ERROR cannot launch node of type 这个错误 xff0c 一般原因是由于没有source bashrc 因此工作空间使用 source bashr
  • Ubuntu 18.04 运行PL-VINS

    代码地址 https span class token operator span span class token comment github com cnqiangfu PL VINS span 安装过程出错参考 PL VINS配置
  • rosbag.bag.ROSBagUnindexedException: Unindexed bag

    rosbag bag ROSBagUnindexedException Unindexed bag ROSBAG
  • d435i 相机和IMU联合标定

    一 前提 我们已经对RGB摄像头和IMU进行了单独标定 参考之前博文 RGB标定 IMU kalibr官方WIKI Kalibr 二 准备标定文件 2 1 标定板yaml文件 标定下载链接 Aprilgrid 6x6 0 5x0 5 m u
  • opencv版权nofree问题

    找到3 1 0中cpp文件拷贝到3 4 12中 xff0c 重新cmake编译 xff0c 即可使用 nofree解决方案
  • realsense d435i 自制Euroc数据集

    参考 提取bag Python程序地址 span class token operator span home span class token operator span yang span class token operator sp
  • orb-slam2运行自己数据集

    因为我跑的是双目摄像头 所以首先在orb slam2下找到ros stereo cc文件然后对其中的rostopic节点进行修改 首先先找到自己对应的节点在 自己录制的 bag 数据集下打开终端执行 rosbag info xxx bag在
  • 【Linux】CMake编译C/C++工程文件

    Linux CMake编译C C 43 43 工程文件 文章目录 Linux CMake编译C C 43 43 工程文件前言一 CMake编译工程1 1 两种方式设置编译规则1 2 两种构建方式1 3 CMake构建C C 43 43 工程
  • STM32学习笔记 GPIO初始化参数结构体介绍

    GPIO初始化参数结构体如下 xff1a typedef struct uint16 t GPIO Pin GPIOSpeed TypeDef GPIO Speed GPIOMode Typedef GPIO Mode GPIO InitT
  • Failed to load resource: the server responded with a status of 401 (UNAUTHORIZED) 解决token失效 401错误码

    在这里我们要对别人的错误状态进行判断 来使用刷星token 解决token失效的 401的问题 让别人在后台看不见的地方 登陆失败 然后里面调用这里的请求 再获取最新的token值 然后重新设置到我们的本地存储里面去 span class

随机推荐