ESP32高分辨率计时器笔记
2025-09-10 来源:cnblogs
尽管FreeRTOS提供了软件计时器,但这些计时器有一些限制:
最大分辨率等于RTOS滴答周期
计时器回调从低优先级任务分派
硬件计时器不受这两个限制,但是通常它们使用起来不太方便。例如,应用组件可能需要定时器事件在将来的特定时间触发,但是硬件定时器仅包含一个用于中断产生的“比较”值。这意味着需要在硬件计时器之上构建一些功能来管理挂起事件列表,以便在发生相应的硬件中断时可以调度这些事件的回调。
esp_timer 一组API提供了一次性的计时器和定期的计时器,微秒级的时间分辨率以及64位范围。
基于ESP-IDF4.1
1 #include 2 #include 3 #include 4 #include 'esp_timer.h' 5 #include 'esp_log.h' 6 #include 'esp_sleep.h' 7 #include 'sdkconfig.h' 8 9 static void periodic_timer_callback(void* arg); 10 static void oneshot_timer_callback(void* arg); 11 12 static const char* TAG = 'example'; 13 14 void app_main(void) 15 { 16 /* 17 * 创建两个计时器: 18 * 1.每0.5秒运行的一个周期性计时器,并且打印消息 19 * 2.五秒后执行的一次性计时器,并且每1秒重启计时器 20 */ 21 22 //创建周期性计时器 23 const esp_timer_create_args_t periodic_timer_args = { 24 .callback = &periodic_timer_callback, 25 //自定义名称 26 .name = 'periodic' 27 }; 28 29 esp_timer_handle_t periodic_timer; 30 ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer)); 31 32 //创建一次性计时器 33 const esp_timer_create_args_t oneshot_timer_args = { 34 .callback = &oneshot_timer_callback, 35 //指定的参数将会传给计时器回调函数 36 .arg = (void*) periodic_timer, 37 .name = 'one-shot' 38 }; 39 esp_timer_handle_t oneshot_timer; 40 ESP_ERROR_CHECK(esp_timer_create(&oneshot_timer_args, &oneshot_timer)); 41 42 //启动计时器 43 ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, 500000)); 44 ESP_ERROR_CHECK(esp_timer_start_once(oneshot_timer, 5000000)); 45 ESP_LOGI(TAG, 'Started timers, time since boot: %lld us', esp_timer_get_time()); 46 47 // 每2秒打印计时器调试信息到控制台 48 for (int i = 0; i < 5; ++i) { 49 ESP_ERROR_CHECK(esp_timer_dump(stdout)); 50 usleep(2000000); 51 } 52 53 54 //轻度睡眠中,时间继续保持。轻度睡眠后计时器正确执行 55 ESP_LOGI(TAG, 'Entering light sleep for 0.5s, time since boot: %lld us',esp_timer_get_time()); 56 ESP_ERROR_CHECK(esp_sleep_enable_timer_wakeup(500000)); 57 esp_light_sleep_start(); 58 ESP_LOGI(TAG, 'Woke up from light sleep, time since boot: %lld us', esp_timer_get_time()); 59 60 //让计时器再运行一会 61 usleep(2000000); 62 63 //停止和清除计时器 64 ESP_ERROR_CHECK(esp_timer_stop(periodic_timer)); 65 ESP_ERROR_CHECK(esp_timer_delete(periodic_timer)); 66 ESP_ERROR_CHECK(esp_timer_delete(oneshot_timer)); 67 ESP_LOGI(TAG, 'Stopped and deleted timers'); 68 } 69 70 //周期性计时器回调函数 71 static void periodic_timer_callback(void* arg) 72 { 73 int64_t time_since_boot = esp_timer_get_time(); 74 ESP_LOGI(TAG, 'Periodic timer called, time since boot: %lld us', time_since_boot); 75 } 76 77 //一次性计时器回调函数 78 static void oneshot_timer_callback(void* arg) 79 { 80 int64_t time_since_boot = esp_timer_get_time(); 81 ESP_LOGI(TAG, 'One-shot timer called, time since boot: %lld us', time_since_boot); 82 esp_timer_handle_t periodic_timer_handle = (esp_timer_handle_t) arg; 83 //启动运行的计时器,首先需要先停止它 84 ESP_ERROR_CHECK(esp_timer_stop(periodic_timer_handle)); 85 ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer_handle, 1000000)); 86 time_since_boot = esp_timer_get_time(); 87 ESP_LOGI(TAG, 'Restarted periodic timer with 1s period, time since boot: %lld us',time_since_boot); 88 }
上一篇:ESP32-性能监控笔记
下一篇:ESP32低功耗模式
- ESP32/8266固件备份方法
- upyOS:基于 MicroPython 的模块化操作系统,兼容 ESP32、RP2040 等微控制器
- ESP32与STM32哪个更适合初学者?问题解析与对比
- STM32与ESP32核心应用场景解析及PCB设计实践(深度探讨)
- ESP32与STM32:比较并非明智之举
- ESP32与STM32:性能对比分析及选型指南
- STM32与ESP32:核心差异详解
- 串口、并口、USB、UART及RS232/RS485接口与ESP32、STM32的应用解析
- ESP32音频输入-MAX4466,MAX9814,SPH0645LM4H,INMP441
- ESP32 ADF windows开发环境搭建 适配ADF到ESP32A1S
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析
- 蓝牙信道探测技术原理与开发套件实践
- 意法半导体中国本地造STM32微控制器启动规模量产




