ESP32 定时器和消息队列

简介

本章涉及知识点:ESP32通用定时器、日志输出,FreeRTOS消息队列。

实现功能:使用ESP32通用定时器实现每1S打印输出日志以及每1Min打印输出日志。

ESP-IDF版本:V5.1.2

源码

DesktopScreen 6 Timer&消息队列小智学长的源码:DesktopScreen 6 Timer&消息队列

 程序实现

首先,初始化通用定时器,这里注意,在设置警报动作的结构体中要开启重加载功能,否则定时器只能完成1次警报,不能重复。

代码实现如下,主要步骤为:

1.创建定时器

2.注册回调函数

3.定时器使能

4.设置警报动作

5.启动定时器

static void gptimer_init(void)
{
    //创建定时器
    gptimer_handle_t gptimer = NULL;
    gptimer_config_t timer_config = {
        .clk_src = GPTIMER_CLK_SRC_DEFAULT,
        .direction = GPTIMER_COUNT_UP,
        .resolution_hz = 1000000, // 1MHz, 1 tick=1us
    };
    ESP_ERROR_CHECK(gptimer_new_timer(&timer_config, &gptimer));

    //注册回调函数
    gptimer_event_callbacks_t cbs = {
        .on_alarm = example_timer_on_alarm_cb_v1,
    };
    //指定定时器句柄,要引起的回调函数,要向回调函数传递的值
    ESP_ERROR_CHECK(gptimer_register_event_callbacks(gptimer, &cbs, timer_queue));

    //定时器使能
    ESP_ERROR_CHECK(gptimer_enable(gptimer));

    //设置警报动作
    gptimer_alarm_config_t alarm_config1 = {
        .alarm_count = 10000, // period = 10ms
        .flags.auto_reload_on_alarm = true, //重加载
    };
    ESP_ERROR_CHECK(gptimer_set_alarm_action(gptimer, &alarm_config1));

    //启动定时器
    ESP_ERROR_CHECK(gptimer_start(gptimer));
}

定义中断回调事件,通过中断回调函数向timer_queue队列中传值

//中断回调事件
static bool IRAM_ATTR example_timer_on_alarm_cb_v1(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data)
{
    BaseType_t high_task_awoken = pdFALSE;
    //定义结构体事件变量
    timer_event_t evt={};
    //向timer_queue队列传参,参数类型为timer_event_t结构体
    xQueueSendFromISR(timer_queue, &evt, &high_task_awoken);
    return (high_task_awoken == pdTRUE);
}

定义中断函数处理任务,从队列中接收数据。

static void timer_example_evt_task(void)
{
    while (1) {
        timer_event_t evt;
        xQueueReceive(timer_queue, &evt, portMAX_DELAY);
        g_timer_event.timer_minute_count ++;
        //60s 计算一次 刷新时间
        if(g_timer_event.timer_minute_count >= 6000){
            g_timer_event.timer_minute_count = 0;
            ESP_LOGI(TAG,"1Min is run");
        }
        g_timer_event.timer_second_count ++;
        //1s计算一次 
        if(g_timer_event.timer_second_count >= 100){
            g_timer_event.timer_second_count = 0;
            ESP_LOGI(TAG,"1S is run");
        }
    }
}

最后,创建任务实现功能。

void ds_timer_init(void)
{
    g_timer_event.timer_minute_count = 0;   //分钟计数
    g_timer_event.timer_second_count = 0;   //秒钟计数
    timer_queue = xQueueCreate(10, sizeof(timer_event_t));  
    gptimer_init();
    xTaskCreate(timer_example_evt_task, "timer_evt_task", 2048, NULL, 1, NULL);
    ESP_LOGI(TAG,"TASK创建成功");
}

 项目代码

基于5.1.2的定时器和队列项目源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值