本文主要是介绍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.")
代码介绍
-
导入必要的模块:从
machine
模块中导入Timer
类,并导入time
模块以便使用time.sleep()
函数。 -
定义回调函数:创建一个名为
timer_callback
的函数,该函数将在定时器触发时被调用。在这个示例中,回调函数只是简单地打印一条消息,但你可以在这里添加任何你想要在定时器触发时执行的代码。 -
创建和配置定时器:使用
Timer
类创建一个定时器对象(在这个例子中,我们假设使用定时器0)。然后,使用init()
方法配置定时器的参数。这些参数包括定时器的触发周期(以毫秒为单位)、定时器模式(在这个例子中,我们使用Timer.PERIODIC
来设置定时器周期性触发)以及回调函数。 -
等待定时器触发:为了观察定时器的触发情况,我们在主程序中添加了一个简单的等待循环,使用
time.sleep(5)
让程序暂停5秒钟。在这段时间内,你应该能够看到定时器每隔1秒触发一次,并打印出"Timer triggered!"的消息。 -
停止和删除定时器:在等待结束后,我们调用
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秒,保持主循环运行}
}
代码解释
-
头文件引入:引入了FreeRTOS和ESP-IDF中用于定时器的头文件。
-
宏定义:定义了定时器组(
TIMER_GROUP
)、定时器索引(TIMER_IDX
)和定时器间隔(TIMER_INTERVAL_MS
)。 -
日志标签:定义了日志标签
TAG
,用于在日志输出中标识此示例。 -
定时器回调函数:定义了
timer_group0_handler
函数,该函数在定时器触发时被调用。使用IRAM_ATTR
属性确保该函数位于IRAM中,因为中断服务例程需要快速响应。 -
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的定时器,需要:
-
配置定时器:使用
timer_config_t
结构体配置定时器的参数。 -
初始化定时器:调用
timer_init
函数初始化定时器。 -
设置定时器超时时间:使用`timer_set_counter_value
这篇关于ESP32 - Micropython ESP-IDF 双线教程 中断和定时器 (1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!