IDF 定时器
1.1 概述
esp32的定时器有两组四个(每组两个),每个定时器都具有一个16bit的预分频器和一个32bit的向上/向下计数器
1.1.1 时钟
时钟来源是APB时钟,默认是80MHZ
1.1.2 预分频器
范围是0-65535,定义为0的时候是65536分频,定义为1和2的时候都是2分频
#include "driver/timer.h"
#include "esp_timer.h"// 定时器相关定义
#define TIMER_DIVIDER 800 // 80 MHz / 80 = 1 MHz, 1 tick = 1us
#define TIMER_SCALE (TIMER_BASE_CLK / TIMER_DIVIDER) // 转换为秒
#define TIMER_INTERVAL_US 100000 // 100ms = 100000us
// 定时器组和定时器选择
#define TIMER_GROUP TIMER_GROUP_0
#define TIMER_IDX TIMER_0
uint8_t i_zh=0;
// 定时器中断处理函数 - 在中断中计算速度
static bool IRAM_ATTR timer_isr(void *args)
{// 清除中断状态timer_group_clr_intr_status_in_isr(TIMER_GROUP, TIMER_IDX);// 重新使能警报timer_group_enable_alarm_in_isr(TIMER_GROUP, TIMER_IDX);i_zh=1-i_zh;gpio_set_level(GPIO_NUM_12,i_zh);//led翻转return true; // 返回true表示需要上下文切换
}// 初始化定时器
void timer_init_zh(void)
{timer_config_t config = {.divider = TIMER_DIVIDER,.counter_dir = TIMER_COUNT_UP,.counter_en = TIMER_PAUSE,.alarm_en = TIMER_ALARM_EN,.auto_reload = TIMER_AUTORELOAD_EN,};// 初始化定时器timer_init(TIMER_GROUP, TIMER_IDX, &config);// 设置定时器初始值timer_set_counter_value(TIMER_GROUP, TIMER_IDX, 0);// 设置警报值timer_set_alarm_value(TIMER_GROUP, TIMER_IDX, TIMER_INTERVAL_US);// 启用中断timer_enable_intr(TIMER_GROUP, TIMER_IDX);// 注册中断处理函数//timer_isr_register(TIMER_GROUP, TIMER_IDX, timer_isr, NULL, ESP_INTR_FLAG_IRAM, NULL);timer_isr_callback_add(TIMER_GROUP, TIMER_IDX, timer_isr, 0, 1);//注册中断服务函数// 启动定时器timer_start(TIMER_GROUP, TIMER_IDX);ESP_LOGI(TAG, "Timer initialized with interval: %d us", TIMER_INTERVAL_US);
}