ESP32 - Micropython ESP-IDF 双线教程 中断和定时器 (1)

ESP32 - Micropython ESP-IDF 双线教程 中断和定时器

    • ESP32中断
    • ESP32定时器
    • 归纳
    • ESP32 - Micropython 定时器
      • 示例代码
      • 代码介绍
    • ESP32 - IDF 定时器
      • 示例代码
      • 代码解释
      • ESP32-IDF定时器使用介绍

ESP32中的中断和定时器是两种重要的硬件特性,它们在嵌入式系统开发中扮演着关键角色。以下是关于ESP32中断和定时器的详细介绍:
本文无中断实例代码,中断代码可以在按键部分查找

ESP32中断

1. 中断概述

中断是一种硬件机制,用于处理在程序正常执行期间不发生但在特定触发发生时的事件。ESP32的每个内核最多提供32个中断槽,用于响应各种外部和内部事件。

2. 中断类型

  • 硬件中断:响应外部硬件事件,如GPIO中断(如按键按下时)或触摸中断(检测到触摸时)。
  • 软件中断:响应软件指令,如定时器中断(当定时器超时时)或看门狗定时器中断。

3. ESP32 GPIO中断

  • 功能:ESP32板上的所有GPIO引脚都可以配置为充当中断请求输入。
  • 配置:使用attachInterrupt()函数将中断附加到GPIO引脚。该函数接受三个参数:GPIO引脚号、中断服务例程(ISR)函数名和触发模式。
  • ISR(中断服务例程):每次GPIO引脚上发生中断时调用的函数。ISR应该尽可能简短且快速,因为它们会阻止正常的程序执行。

ESP32定时器

1. 定时器概述

ESP32内置4个64位通用定时器,每个定时器包含一个16位预分频器和一个64位可自动重新加载的向上/向下计数器。这些定时器可以用于各种时间相关的应用,如事件计时、周期性操作、脉冲宽度调制(PWM)等。

2. 定时器特性

  • 16位预分频器:用于对APB时钟进行分频,产生时基计数器时钟(TB_clk)。
  • 64位时基计数器:支持向上/向下计数,并可在报警时自动重新加载。
  • 触发中断:支持电平触发和边沿触发中断。

3. 定时器使用

  • 初始化:通过配置相关寄存器来初始化定时器,包括设置预分频器值、计数方向、中断使能等。
  • 设置中断时间:通过配置定时器的计数器和预分频器来设定中断触发的时间间隔。
  • 设置回调函数:当定时器触发中断时,可以调用预设的回调函数来执行特定任务。
  • 使能定时器:配置完成后,使能定时器以开始计时。

归纳

  • 中断:用于处理外部和内部事件,通过中断服务例程实现快速响应。ESP32的每个内核支持多达32个中断,可配置GPIO引脚作为中断源。
  • 定时器:用于计时、计数和生成定时事件。ESP32内置4个64位通用定时器,支持多种触发方式和中断机制,适用于各种实时应用。

在ESP32的MicroPython环境中,可以使用machine.Timer类来实现定时器功能。machine.Timer类允许你创建一个或多个定时器,这些定时器可以在指定的时间间隔后执行回调函数。以下是一个使用ESP32-MicroPython实现定时器功能的示例代码和介绍:

ESP32 - Micropython 定时器

示例代码

from machine import Timer
import time# 定义一个回调函数,当定时器触发时被调用
def timer_callback(timer):print("Timer triggered!")# 这里可以添加你想要在定时器触发时执行的代码# 创建一个定时器对象,并设置其触发周期和回调函数
# 第一个参数是定时器编号,通常为0或1,但某些平台可能支持更多
# 第二个参数是触发周期,单位为毫秒(ms)
# 第三个参数是定时器模式,machine.Timer.PERIODIC表示周期性触发
# 第四个参数是回调函数
tim = Timer(0)  # 假设使用定时器0
tim.init(period=1000, mode=Timer.PERIODIC, callback=timer_callback)# 等待一段时间,以便观察定时器的触发情况
print("Waiting for timer to trigger...")
time.sleep(5)  # 等待5秒# 停止并删除定时器
tim.deinit()
print("Timer stopped.")

代码介绍

  1. 导入必要的模块:从machine模块中导入Timer类,并导入time模块以便使用time.sleep()函数。

  2. 定义回调函数:创建一个名为timer_callback的函数,该函数将在定时器触发时被调用。在这个示例中,回调函数只是简单地打印一条消息,但你可以在这里添加任何你想要在定时器触发时执行的代码。

  3. 创建和配置定时器:使用Timer类创建一个定时器对象(在这个例子中,我们假设使用定时器0)。然后,使用init()方法配置定时器的参数。这些参数包括定时器的触发周期(以毫秒为单位)、定时器模式(在这个例子中,我们使用Timer.PERIODIC来设置定时器周期性触发)以及回调函数。

  4. 等待定时器触发:为了观察定时器的触发情况,我们在主程序中添加了一个简单的等待循环,使用time.sleep(5)让程序暂停5秒钟。在这段时间内,你应该能够看到定时器每隔1秒触发一次,并打印出"Timer triggered!"的消息。

  5. 停止和删除定时器:在等待结束后,我们调用deinit()方法来停止并删除定时器。这将释放与定时器相关的资源,并停止定时器的触发。

请注意,具体的定时器编号(在Timer()构造函数中作为第一个参数传递)可能因硬件平台和MicroPython版本而异。在某些平台上,可能只能使用特定的定时器编号,或者可能有更多的定时器可用。因此,在实际应用中,请参考使用的开发板和MicroPython版本的文档来了解可用的定时器编号和限制。

ESP32 - IDF 定时器

示例代码

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/timer.h"
#include "esp_log.h"#define TIMER_GROUP 0
#define TIMER_IDX   0
#define TIMER_INTERVAL_MS 1000  // 定时器间隔为1秒static const char *TAG = "timer_example";// 定时器回调函数
static void IRAM_ATTR timer_group0_handler(void *arg)
{// 这里可以添加定时器触发时需要执行的代码ESP_LOGI(TAG, "Timer handler triggered");
}void app_main(void)
{// 初始化定时器timer_config_t config = {.alarm_en = true,.auto_reload = true,.divider = TIMER_BASE_CLK / 1000, // 计数器时钟分频系数.counter_dir = TIMER_COUNT_UP,.intr_type = TIMER_INTR_LEVEL,.intr_enable = true,};// 配置定时器timer_init(TIMER_GROUP, TIMER_IDX, &config);// 设置定时器超时时间timer_set_counter_value(TIMER_GROUP, TIMER_IDX, 0x00000000ULL);timer_set_alarm_value(TIMER_GROUP, TIMER_IDX, TIMER_INTERVAL_MS * config.divider);// 安装定时器中断服务例程timer_isr_register(TIMER_GROUP, &timer_group0_handler, NULL, ESP_INTR_FLAG_IRAM, NULL);// 启动定时器timer_start(TIMER_GROUP, TIMER_IDX);// 主循环,在这里可以添加其他任务while (1) {// ...vTaskDelay(pdMS_TO_TICKS(1000)); // 延时1秒,保持主循环运行}
}

代码解释

  1. 头文件引入:引入了FreeRTOS和ESP-IDF中用于定时器的头文件。

  2. 宏定义:定义了定时器组(TIMER_GROUP)、定时器索引(TIMER_IDX)和定时器间隔(TIMER_INTERVAL_MS)。

  3. 日志标签:定义了日志标签TAG,用于在日志输出中标识此示例。

  4. 定时器回调函数:定义了timer_group0_handler函数,该函数在定时器触发时被调用。使用IRAM_ATTR属性确保该函数位于IRAM中,因为中断服务例程需要快速响应。

  5. app_main函数:这是ESP32应用的主入口函数。

    • 定时器初始化:使用timer_config_t结构体配置定时器,包括是否启用闹钟、是否自动重载、计数器时钟分频系数、计数方向、中断类型和是否启用中断。

    • 配置定时器:调用timer_init函数来根据配置初始化定时器。

    • 设置定时器超时时间:使用timer_set_counter_value设置计数器的初始值,使用timer_set_alarm_value设置闹钟值(即定时器触发的时间)。

    • 安装定时器中断服务例程:使用timer_isr_register函数将中断服务例程与定时器关联起来。

    • 启动定时器:调用timer_start函数启动定时器。

    • 主循环:使用FreeRTOS的vTaskDelay函数保持主循环运行,并可以添加其他任务。

ESP32-IDF定时器使用介绍

ESP32-IDF提供了硬件定时器的API,允许配置和使用ESP32的定时器硬件。每个定时器组包含多个定时器,可以配置定时器的各种参数,如分频系数、计数方向、中断类型等。

使用ESP32-IDF的定时器,需要:

  1. 配置定时器:使用timer_config_t结构体配置定时器的参数。

  2. 初始化定时器:调用timer_init函数初始化定时器。

  3. 设置定时器超时时间:使用`timer_set_counter_value

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/17355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统思考—战略沙盘推演咨询服务

今日与JSTO团队一起学习了《战略沙盘推演咨询服务》。通过沙盘体验,我深刻感受到组织与战略就像一张皮的正反两面。在转型过程中,即使战略非常明确,团队成员由于恐惧和顾虑,往往不愿意挑战新的业务,从而难以实现战略目…

VasDolly图形工具-Android多渠道打包福利

简介 基于腾讯VasDolly最新版本3.0.6的图形界面衍生版本,旨在更好的帮助开发者构建多渠道包 使用 下载并解压工具包,找到Startup脚本并双击启动图形界面(注意:本地需安装java环境) 渠道格式说明 txt文件&#xff…

音频链接抓取技术在Lua中的实现

前言 随着数字音乐的普及,越来越多的用户选择在线音乐平台来享受音乐。网易云音乐作为国内领先的音乐服务平台,不仅提供了丰富的音乐资源,还拥有独特的社交属性,吸引了大量的用户。在众多的音乐服务中,音频链接的抓取…

Qt | QTabBar 类(选项卡栏)

01、上节回顾 Qt | QStackedLayout 类(分组布局或栈布局)、QStackedWidget02、简介 1、QTabBar类直接继承自 QWidget。该类提供了一个选项卡栏,该类仅提供了一个选项卡, 并没有为每个选项卡提供相应的页面,因此要使选项卡栏实际可用,需要自行为每个选项卡设置需要显示的页…

【面试题】JavaScript基础高频面试(上)

1、简述JavaScript中map和foreach的区别? map和forEach都是JavaScript数组的迭代方法,但它们之间存在一些关键区别。 1. 返回值:map方法会返回一个新的数组,这个新数组是由原数组通过某个函数处理后的结果组成的。而forEach方法…

Ubuntu18.04 重装/升级 eigen 教程

目录 一、Eigen 1.1 ubuntu 查看 eigen 版本 1.2 卸载 老版本 eigen 二、安装 eigen 3.4.0 2.1 配置安装 2.2 查看版本 一、Eigen 1.1 ubuntu 查看 eigen 版本 $ dpkg -l | grep eigen1.2 卸载 老版本 eigen sudo updatedb locate eigen3会获得一堆输出,其…

springboot整合Kafka的快速使用教程

目录 一、引入Kafka的依赖 二、配置Kafka 三、创建主题 1、自动创建(不推荐) 2、手动动创建 四、生产者代码 五、消费者代码 六、常用的KafKa的命令 Kafka是一个高性能、分布式的消息发布-订阅系统,被广泛应用于大数据处理、实时日志分析等场景。Spring B…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十一)- 微服务(1)

微服务 1.认识微服务 SpringCloud底层是依赖于SpringBoot的,并且有版本的兼容关系,如下: 2. 服务拆分 需求 : 把订单信息和用户信息一起返回 从订单模块向用户模块发起远程调用 , 把查到的结果一起返回 步骤 &…

多态(难的起飞)

注意 virtual关键字: 1、可以修饰原函数,为了完成虚函数的重写,满足多态的条件之一 2、可以菱形继承中,去完成虚继承,解决数据冗余和二义性 两个地方使用了同一个关键字,但是它们互相一点关系都没有 虚函…

JAVASE总结一

1、 2、引用也可以是成员变量(实例变量),也可以是局部变量;引用数据类型,引用, 我们是通过引用去访问JVM堆内存当中的java对象,引用保存了java对象的内存地址,指向了JVM堆内存当中…

ESP32 - Micropython ESP-IDF 双线教程 脉宽调制(PWM)(1)

ESP32 - Micropython ESP-IDF 双线教程 脉宽调制(PWM) PWM 的基本原理PWM 的应用PWM 的优点PWM 的实现方式ESP32-micropython 中的 PWM 功能使用 micropython 控制 PWM 的代码示例代码介绍 ESP32-IDF 中的 PWM 功能1. 初始化配置函数2. 引脚绑定函数3. 占…

常见算法200个(5):快速排序(快排)

JS实现快速排序 1.快速排序思路: 选择数组中的一个值作为基准,将数组中小于该值的数置于该数之前,大于该值的数置于该数之后,接着对该数前后的两个数组进行重复操作直至排序完成。 2.代码实现: function quick(arr)…

使用 Snort 进行入侵检测

使用 Snort 进行入侵检测 Snort 是一种流行的开源入侵检测系统。您可以在http://www.snort.org/上获取它。Snort 分析流量并尝试检测和记录可疑活动。Snort 还能够根据其所做的分析发送警报。 Snort 安装 在本课中,我们将从源代码安装。此外,我们不会安…

2024 前端面试每日1小时

三日 1. 如何理解Vue的模板编译原理 Vue的模板编译实际就是将模板字符串通过解析、优化和代码生成等步骤转换为渲染函数的过程。这个过程中,AST扮演了非常重要的角色,它用树形结构描述了模板的内容和结构,是编译过程的核心数据结构&#xff…

MySQL——适合不适合创建索引的情况

那些情况适合创建索引 1、字段的数值具有唯一性的限制 索引本身可以起到约束的作用,比如唯一索引、主键索引都是可以起到唯一性约束的,因此在我们的数据表中,如果某个字段是唯一性的,就可以直接创建唯一性索引,或者主…

Nodejs 爬虫 案例

1.安装: npm install cheerio npm install axios2.介绍: 2.1 cheerio 特点和用途描述: HTML解析和操作:Cheerio 可以将 HTML 字符串加载到内存中,并将其转换为一个可操作的 DOM 树结构,从而可以方便地对…

AURIX TC3xx单片机介绍-启动过程介绍1

从各个域控制器硬件解决方案来看,MPU可能来自多个供应商,有瑞萨,有NXP等,但对于MCU来说,基本都采用英飞凌TC3xx。 今天我们就来看一下TC3xx的启动过程,主要包含如下内容: uC上电过程中,会经过一个上电时序,从复位状态“脱离”出来;Boot Firmware是复位后第一个执行的…

使用 Effect 同步-09

有些组件需要与外部系统同步。例如,你可能希望根据 React state 控制非 React 组件、设置服务器连接或在组件出现在屏幕上时发送分析日志。Effects 会在渲染后运行一些代码,以便可以将组件与 React 之外的某些系统同步。 简单理解,就是需要操…

Python实现对Word文档内容出现“重复标题”进行自动去重(4)

前言 本文是该专栏的第4篇,后面会持续分享Python办公自动化干货知识,记得关注。 在本专栏上一篇文章《Python实现对Word文档内容出现“重复标题”进行自动去重(3)》中,笔者有详细介绍使用python对word文档内容的目标文本进行自动去重。只不过本文要介绍的“去重方法”与上…

计算机专业必考之计算机指令设计格式

计算机指令设计格式 例题: 1.设相对寻址的转移指令占3个字节,第一字节为操作码,第二,第三字节为相对偏移量, 数据在存储器以低地址为字地址的存放方式。 每当CPU从存储器取出一个字节时候,自动完成&…