@@ -152,7 +152,9 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
152152 */
153153 int retry_32k_xtal = 3 ;
154154
155+ soc_rtc_slow_clk_src_t old_rtc_slow_clk_src = rtc_clk_slow_src_get ();
155156 do {
157+ bool revoke_32k_enable = false;
156158 if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K || rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW ) {
157159 /* 32k XTAL oscillator needs to be enabled and running before it can
158160 * be used. Hardware doesn't have a direct way of checking if the
@@ -179,6 +181,7 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
179181 }
180182 ESP_EARLY_LOGW (TAG , "32 kHz clock not found, switching to internal 150 kHz oscillator" );
181183 rtc_slow_clk_src = SOC_RTC_SLOW_CLK_SRC_RC_SLOW ;
184+ revoke_32k_enable = true;
182185 }
183186 }
184187 } else if (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_RC32K ) {
@@ -187,7 +190,9 @@ static void select_rtc_slow_clk(soc_rtc_slow_clk_src_t rtc_slow_clk_src)
187190 rtc_clk_slow_src_set (rtc_slow_clk_src );
188191 // Disable unused clock sources after clock source switching is complete.
189192 // Regardless of the clock source selection, the internal 136K clock source will always keep on.
190- if ((rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K ) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW )) {
193+ if (revoke_32k_enable || \
194+ (((old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K ) || (old_rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW )) && \
195+ ((rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_XTAL32K ) && (rtc_slow_clk_src != SOC_RTC_SLOW_CLK_SRC_OSC_SLOW )))) {
191196 rtc_clk_32k_enable (false);
192197 rtc_clk_32k_disable_external ();
193198 }
0 commit comments