개발/ESP32, ESP8266

[ESP32] esp_timer 와 sleep 모드 동시 사용시 발생하는 간섭

어중E 2023. 1. 21. 23:30

[ESP32] esp_timer와 sleep 모드 동시 사용 시 발생하는 간섭

ESP-IDF에는esp_timer 가 있습니다. 해당 timer는 task에서 제어됩니다. sleep 모드도 같이 사용할 경우 task가 제대로 작동되지 않는 문제가 발생합니다.

 

이런 경우에는 하드웨어 타이머를 사용하는 것이 좋습니다. 따라서 esp_timer 보다는 FreeRTOS에서 제공하는 하드웨어 타이머 함수들을 사용하면, 타이머 인터럽트가 제대로 작동하지 않는 문제들을 해결할 수 있습니다.

 

저의 경우에는 esp_timer와 ble 기능과 modem sleep을 활성화하고 나면, esp_timer로 등록된 타이머 인터럽트 함수가 제대로 작동하지 않는 것을 확인했습니다. 

 

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "freertos/timers.h"
...

TimerHandle_t xOneShotTimer, xAutoReloadTimer;

static void opneShotFunc(TimerHandle_t xTimer)
{
	...
}

static void autoReloadFunc(TimerHandle_t xTimer)
{
	...
}

void app_main(void)
{
	...
    
    //5초후 1회만 진행
    xOneShotTimer    = xTimerCreate("OneShot",    pdMS_TO_TICKS(5000UL),  pdFALSE, 0, opneShotFunc);
    
    //60초마다 1회 진행 반복
    xAutoReloadTimer = xTimerCreate("AutoReload", pdMS_TO_TICKS(60000UL), pdTRUE,  0, autoReloadFunc);
    
    //타이머 실행
    xTimerStart(xOneShotTimer,    0);
    xTimerStart(xAutoReloadTimer, 0); 
    
    ...
}

 

https://www.esp32.com/viewtopic.php?t=20374