diff --git a/components/esp32/test/test_pm.c b/components/esp32/test/test_pm.c index 2214cec59..7033238a0 100644 --- a/components/esp32/test/test_pm.c +++ b/components/esp32/test/test_pm.c @@ -4,9 +4,48 @@ #include #include "unity.h" #include "esp_pm.h" - +#include "esp_clk.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" TEST_CASE("Can dump power management lock stats", "[pm]") { esp_pm_dump_locks(stdout); } + +#ifdef CONFIG_PM_ENABLE + +static void switch_freq(int mhz) +{ + rtc_cpu_freq_t max_freq; + assert(rtc_clk_cpu_freq_from_mhz(mhz, &max_freq)); + esp_pm_config_esp32_t pm_config = { + .max_cpu_freq = max_freq, + .min_cpu_freq = RTC_CPU_FREQ_XTAL, + }; + ESP_ERROR_CHECK( esp_pm_configure(&pm_config) ); + printf("Waiting for frequency to be set to %d (%d MHz)...\n", max_freq, mhz); + while (esp_clk_cpu_freq() / 1000000 != mhz) { + vTaskDelay(pdMS_TO_TICKS(1000)); + printf("Frequency is %d MHz\n", esp_clk_cpu_freq()); + } + printf("Frequency is set to %d MHz\n", mhz); +} + +TEST_CASE("Can switch frequency using esp_pm_configure", "[pm]") +{ + int orig_freq_mhz = esp_clk_cpu_freq() / 1000000; + switch_freq(240); + switch_freq(40); + switch_freq(160); + switch_freq(240); + switch_freq(80); + switch_freq(40); + switch_freq(240); + switch_freq(40); + switch_freq(80); + switch_freq(orig_freq_mhz); +} + +#endif // CONFIG_PM_ENABLE