Beispiel #1
0
/*
 * This function is not exposed as an API at this point,
 * because FreeRTOS doesn't yet support dynamic changing of
 * CPU frequency. Also we need to implement hooks for
 * components which want to be notified of CPU frequency
 * changes.
 */
void esp_clk_init(void)
{
    rtc_config_t cfg = RTC_CONFIG_DEFAULT();
    rtc_init(cfg);
    rtc_clk_fast_freq_set(RTC_FAST_FREQ_8M);

#ifdef CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL
    select_rtc_slow_clk(RTC_SLOW_FREQ_32K_XTAL);
#else
    select_rtc_slow_clk(RTC_SLOW_FREQ_RTC);
#endif

    uint32_t freq_mhz = CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ;
    rtc_cpu_freq_t freq = RTC_CPU_FREQ_80M;
    switch(freq_mhz) {
        case 240:
            freq = RTC_CPU_FREQ_240M;
            break;
        case 160:
            freq = RTC_CPU_FREQ_160M;
            break;
        default:
            freq_mhz = 80;
            /* no break */
        case 80:
            freq = RTC_CPU_FREQ_80M;
            break;
    }

    // Wait for UART TX to finish, otherwise some UART output will be lost
    // when switching APB frequency
    uart_tx_wait_idle(CONFIG_CONSOLE_UART_NUM);
    rtc_clk_cpu_freq_set(freq);
}
Beispiel #2
0
Datei: pm.c Projekt: A-Paul/RIOT
void IRAM_ATTR pm_off(void)
{
    DEBUG ("%s\n", __func__);

    /* suspend UARTs */
    for (int i = 0; i < 3; ++i) {
        REG_SET_BIT(UART_FLOW_CONF_REG(i), UART_FORCE_XOFF);
        uart_tx_wait_idle(i);
    }

    /* set all power down flags */
    uint32_t pd_flags = RTC_SLEEP_PD_DIG |
                        RTC_SLEEP_PD_RTC_PERIPH |
                        RTC_SLEEP_PD_RTC_SLOW_MEM |
                        RTC_SLEEP_PD_RTC_FAST_MEM |
                        RTC_SLEEP_PD_RTC_MEM_FOLLOW_CPU |
                        RTC_SLEEP_PD_VDDSDIO;

    rtc_sleep_config_t config = RTC_SLEEP_CONFIG_DEFAULT(pd_flags);
    config.wifi_pd_en = 1;
    config.rom_mem_pd_en = 1;
    config.lslp_meminf_pd = 1;

    /* Save current frequency and switch to XTAL */
    rtc_cpu_freq_t cpu_freq = rtc_clk_cpu_freq_get();
    rtc_clk_cpu_freq_set(RTC_CPU_FREQ_XTAL);

    /* set deep sleep duration to forever */
    rtc_sleep_set_wakeup_time(rtc_time_get() + ~0x0UL);

    /* configure deep sleep */
    rtc_sleep_init(config);
    rtc_sleep_start(RTC_TIMER_TRIG_EN, 0);

    /* Restore CPU frequency */
    rtc_clk_cpu_freq_set(cpu_freq);

    /* resume UARTs */
    for (int i = 0; i < 3; ++i) {
        REG_CLR_BIT(UART_FLOW_CONF_REG(i), UART_FORCE_XOFF);
        REG_SET_BIT(UART_FLOW_CONF_REG(i), UART_FORCE_XON);
        REG_CLR_BIT(UART_FLOW_CONF_REG(i), UART_FORCE_XON);
    }
}