mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-10-31 21:14:37 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			101 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* esp_timer (high resolution timer) example
 | |
| 
 | |
|    This example code is in the Public Domain (or CC0 licensed, at your option.)
 | |
| 
 | |
|    Unless required by applicable law or agreed to in writing, this
 | |
|    software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
 | |
|    CONDITIONS OF ANY KIND, either express or implied.
 | |
| */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <string.h>
 | |
| #include <unistd.h>
 | |
| #include "esp_timer.h"
 | |
| #include "esp_log.h"
 | |
| #include "esp_sleep.h"
 | |
| #include "sdkconfig.h"
 | |
| 
 | |
| static void periodic_timer_callback(void* arg);
 | |
| static void oneshot_timer_callback(void* arg);
 | |
| 
 | |
| static const char* TAG = "example";
 | |
| 
 | |
| void app_main(void)
 | |
| {
 | |
|     /* Create two timers:
 | |
|      * 1. a periodic timer which will run every 0.5s, and print a message
 | |
|      * 2. a one-shot timer which will fire after 5s, and re-start periodic
 | |
|      *    timer with period of 1s.
 | |
|      */
 | |
| 
 | |
|     const esp_timer_create_args_t periodic_timer_args = {
 | |
|             .callback = &periodic_timer_callback,
 | |
|             /* name is optional, but may help identify the timer when debugging */
 | |
|             .name = "periodic"
 | |
|     };
 | |
| 
 | |
|     esp_timer_handle_t periodic_timer;
 | |
|     ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer));
 | |
|     /* The timer has been created but is not running yet */
 | |
| 
 | |
|     const esp_timer_create_args_t oneshot_timer_args = {
 | |
|             .callback = &oneshot_timer_callback,
 | |
|             /* argument specified here will be passed to timer callback function */
 | |
|             .arg = (void*) periodic_timer,
 | |
|             .name = "one-shot"
 | |
|     };
 | |
|     esp_timer_handle_t oneshot_timer;
 | |
|     ESP_ERROR_CHECK(esp_timer_create(&oneshot_timer_args, &oneshot_timer));
 | |
| 
 | |
|     /* Start the timers */
 | |
|     ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, 500000));
 | |
|     ESP_ERROR_CHECK(esp_timer_start_once(oneshot_timer, 5000000));
 | |
|     ESP_LOGI(TAG, "Started timers, time since boot: %lld us", esp_timer_get_time());
 | |
| 
 | |
|     /* Print debugging information about timers to console every 2 seconds */
 | |
|     for (int i = 0; i < 5; ++i) {
 | |
|         ESP_ERROR_CHECK(esp_timer_dump(stdout));
 | |
|         usleep(2000000);
 | |
|     }
 | |
| 
 | |
|     /* Timekeeping continues in light sleep, and timers are scheduled
 | |
|      * correctly after light sleep.
 | |
|      */
 | |
|     ESP_LOGI(TAG, "Entering light sleep for 0.5s, time since boot: %lld us",
 | |
|             esp_timer_get_time());
 | |
| 
 | |
|     ESP_ERROR_CHECK(esp_sleep_enable_timer_wakeup(500000));
 | |
|     esp_light_sleep_start();
 | |
| 
 | |
|     ESP_LOGI(TAG, "Woke up from light sleep, time since boot: %lld us",
 | |
|                 esp_timer_get_time());
 | |
| 
 | |
|     /* Let the timer run for a little bit more */
 | |
|     usleep(2000000);
 | |
| 
 | |
|     /* Clean up and finish the example */
 | |
|     ESP_ERROR_CHECK(esp_timer_stop(periodic_timer));
 | |
|     ESP_ERROR_CHECK(esp_timer_delete(periodic_timer));
 | |
|     ESP_ERROR_CHECK(esp_timer_delete(oneshot_timer));
 | |
|     ESP_LOGI(TAG, "Stopped and deleted timers");
 | |
| }
 | |
| 
 | |
| static void periodic_timer_callback(void* arg)
 | |
| {
 | |
|     int64_t time_since_boot = esp_timer_get_time();
 | |
|     ESP_LOGI(TAG, "Periodic timer called, time since boot: %lld us", time_since_boot);
 | |
| }
 | |
| 
 | |
| static void oneshot_timer_callback(void* arg)
 | |
| {
 | |
|     int64_t time_since_boot = esp_timer_get_time();
 | |
|     ESP_LOGI(TAG, "One-shot timer called, time since boot: %lld us", time_since_boot);
 | |
|     esp_timer_handle_t periodic_timer_handle = (esp_timer_handle_t) arg;
 | |
|     /* To start the timer which is running, need to stop it first */
 | |
|     ESP_ERROR_CHECK(esp_timer_stop(periodic_timer_handle));
 | |
|     ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer_handle, 1000000));
 | |
|     time_since_boot = esp_timer_get_time();
 | |
|     ESP_LOGI(TAG, "Restarted periodic timer with 1s period, time since boot: %lld us",
 | |
|             time_since_boot);
 | |
| }
 | 
