@@ -146,7 +146,9 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
146146 */
147147 int retry_32k_xtal = 3 ;
148148
149+ soc_rtc_slow_clk_src_t old_rtc_slow_clk_src = rtc_clk_slow_src_get ();
149150 do {
151+ bool revoke_32k_enable = false;
150152 if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K || rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW ) {
151153 /* 32k XTAL oscillator needs to be enabled and running before it can
152154 * be used. Hardware doesn't have a direct way of checking if the
@@ -173,6 +175,7 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
173175 }
174176 ESP_EARLY_LOGW (TAG , "32 kHz clock not found, switching to internal 150 kHz oscillator" );
175177 rtc_slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC_SLOW ;
178+ revoke_32k_enable = true;
176179 }
177180 }
178181 } else if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_RC32K ) {
@@ -181,7 +184,9 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
181184 rtc_clk_slow_src_set (rtc_slow_clk_src );
182185 // Disable unused clock sources after clock source switching is complete.
183186 // Regardless of the clock source selection, the internal 136K clock source will always keep on.
184- if ((rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K ) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW )) {
187+ if (revoke_32k_enable || \
188+ (((old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K ) || (old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW )) && \
189+ ((rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K ) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW )))) {
185190 rtc_clk_32k_enable (false);
186191 rtc_clk_32k_disable_external ();
187192 }
0 commit comments