简介
本章涉及知识点: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的定时器和队列项目源码