mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
Merge branch 'feature/wdt_c3' into 'master'
wdt: Fix RTC_SLOW_CLK for chips, corrects WDT timeout. Closes IDF-2118 and IDF-2332 See merge request espressif/esp-idf!12796
This commit is contained in:
commit
54edd4fc58
@ -233,8 +233,9 @@ static void wdt_reset_cpu0_info_enable(void)
|
|||||||
|
|
||||||
static void wdt_reset_info_dump(int cpu)
|
static void wdt_reset_info_dump(int cpu)
|
||||||
{
|
{
|
||||||
// TODO ESP32-C3 IDF-2118
|
(void) cpu;
|
||||||
ESP_LOGE(TAG, "WDT reset info dump is not supported yet");
|
// saved PC was already printed by the ROM bootloader.
|
||||||
|
// nothing to do here.
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bootloader_check_wdt_reset(void)
|
static void bootloader_check_wdt_reset(void)
|
||||||
|
@ -331,10 +331,10 @@ menu "MODEM SLEEP Options"
|
|||||||
modem sleep to be used with both DFS and light sleep.
|
modem sleep to be used with both DFS and light sleep.
|
||||||
|
|
||||||
config BT_CTRL_LPCLK_SEL_RTC_SLOW
|
config BT_CTRL_LPCLK_SEL_RTC_SLOW
|
||||||
bool "Internal 90kHz RC oscillator"
|
bool "Internal 150kHz RC oscillator"
|
||||||
depends on ESP32C3_RTC_CLK_SRC_INT_RC
|
depends on ESP32C3_RTC_CLK_SRC_INT_RC
|
||||||
help
|
help
|
||||||
Internal 90kHz RC oscillator.
|
Internal 150kHz RC oscillator.
|
||||||
|
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
@ -1045,7 +1045,7 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg)
|
|||||||
if (rtc_clk_slow_freq_get() == RTC_SLOW_FREQ_RTC) {
|
if (rtc_clk_slow_freq_get() == RTC_SLOW_FREQ_RTC) {
|
||||||
s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_RTC_SLOW; // set default value
|
s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_RTC_SLOW; // set default value
|
||||||
} else {
|
} else {
|
||||||
ESP_LOGW(BTDM_LOG_TAG, "Internal 90kHz RC oscillator not detected, fall back to main XTAL as Bluetooth sleep clock\n"
|
ESP_LOGW(BTDM_LOG_TAG, "Internal 150kHz RC oscillator not detected, fall back to main XTAL as Bluetooth sleep clock\n"
|
||||||
"light sleep mode will not be able to apply when bluetooth is enabled");
|
"light sleep mode will not be able to apply when bluetooth is enabled");
|
||||||
s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_XTAL; // set default value
|
s_lp_cntl.lpclk_sel = BTDM_LPCLK_SEL_XTAL; // set default value
|
||||||
}
|
}
|
||||||
|
@ -73,7 +73,7 @@ typedef enum {
|
|||||||
ESP_BT_SLEEP_CLOCK_NONE = 0, /*!< Sleep clock not configured */
|
ESP_BT_SLEEP_CLOCK_NONE = 0, /*!< Sleep clock not configured */
|
||||||
ESP_BT_SLEEP_CLOCK_MAIN_XTAL = 1, /*!< SoC main crystal */
|
ESP_BT_SLEEP_CLOCK_MAIN_XTAL = 1, /*!< SoC main crystal */
|
||||||
ESP_BT_SLEEP_CLOCK_EXT_32K_XTAL = 2, /*!< External 32.768kHz crystal */
|
ESP_BT_SLEEP_CLOCK_EXT_32K_XTAL = 2, /*!< External 32.768kHz crystal */
|
||||||
ESP_BT_SLEEP_CLOCK_RTC_SLOW = 3, /*!< Internal 90kHz RC oscillator */
|
ESP_BT_SLEEP_CLOCK_RTC_SLOW = 3, /*!< Internal 150kHz RC oscillator */
|
||||||
ESP_BT_SLEEP_CLOCK_FPGA_32K = 4, /*!< Hardwired 32KHz clock temporarily used for FPGA */
|
ESP_BT_SLEEP_CLOCK_FPGA_32K = 4, /*!< Hardwired 32KHz clock temporarily used for FPGA */
|
||||||
} esp_bt_sleep_clock_t;
|
} esp_bt_sleep_clock_t;
|
||||||
|
|
||||||
|
@ -162,7 +162,7 @@ menu "ESP32C3-Specific"
|
|||||||
Choose which clock is used as RTC clock source.
|
Choose which clock is used as RTC clock source.
|
||||||
|
|
||||||
config ESP32C3_RTC_CLK_SRC_INT_RC
|
config ESP32C3_RTC_CLK_SRC_INT_RC
|
||||||
bool "Internal 90kHz RC oscillator"
|
bool "Internal 150kHz RC oscillator"
|
||||||
config ESP32C3_RTC_CLK_SRC_EXT_CRYS
|
config ESP32C3_RTC_CLK_SRC_EXT_CRYS
|
||||||
bool "External 32kHz crystal"
|
bool "External 32kHz crystal"
|
||||||
select ESP_SYSTEM_RTC_EXT_XTAL
|
select ESP_SYSTEM_RTC_EXT_XTAL
|
||||||
@ -188,7 +188,7 @@ menu "ESP32C3-Specific"
|
|||||||
When this option is set to 0, clock calibration will not be performed at
|
When this option is set to 0, clock calibration will not be performed at
|
||||||
startup, and approximate clock frequencies will be assumed:
|
startup, and approximate clock frequencies will be assumed:
|
||||||
|
|
||||||
- 90000 Hz if internal RC oscillator is used as clock source. For this use value 1024.
|
- 150000 Hz if internal RC oscillator is used as clock source. For this use value 1024.
|
||||||
- 32768 Hz if the 32k crystal oscillator is used. For this use value 3000 or more.
|
- 32768 Hz if the 32k crystal oscillator is used. For this use value 3000 or more.
|
||||||
In case more value will help improve the definition of the launch of the crystal.
|
In case more value will help improve the definition of the launch of the crystal.
|
||||||
If the crystal could not start, it will be switched to internal RC.
|
If the crystal could not start, it will be switched to internal RC.
|
||||||
|
@ -58,6 +58,10 @@ static void IRAM_ATTR esp_crosscore_isr(void *arg)
|
|||||||
* to allow DFS features without the extra latency of the ISR hook.
|
* to allow DFS features without the extra latency of the ISR hook.
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
// TODO: ESP32-C3 IDF-2986
|
||||||
|
// if (my_reason_val & REASON_PRINT_BACKTRACE) {
|
||||||
|
// esp_backtrace_print(100);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize the crosscore interrupt on this core.
|
// Initialize the crosscore interrupt on this core.
|
||||||
|
@ -448,7 +448,7 @@ menu "ESP32S3-Specific"
|
|||||||
Choose which clock is used as RTC clock source.
|
Choose which clock is used as RTC clock source.
|
||||||
|
|
||||||
config ESP32S3_RTC_CLK_SRC_INT_RC
|
config ESP32S3_RTC_CLK_SRC_INT_RC
|
||||||
bool "Internal 90kHz RC oscillator"
|
bool "Internal 150kHz RC oscillator"
|
||||||
config ESP32S3_RTC_CLK_SRC_EXT_CRYS
|
config ESP32S3_RTC_CLK_SRC_EXT_CRYS
|
||||||
bool "External 32kHz crystal"
|
bool "External 32kHz crystal"
|
||||||
select ESP_SYSTEM_RTC_EXT_XTAL
|
select ESP_SYSTEM_RTC_EXT_XTAL
|
||||||
@ -474,7 +474,7 @@ menu "ESP32S3-Specific"
|
|||||||
When this option is set to 0, clock calibration will not be performed at
|
When this option is set to 0, clock calibration will not be performed at
|
||||||
startup, and approximate clock frequencies will be assumed:
|
startup, and approximate clock frequencies will be assumed:
|
||||||
|
|
||||||
- 90000 Hz if internal RC oscillator is used as clock source. For this use value 1024.
|
- 150000 Hz if internal RC oscillator is used as clock source. For this use value 1024.
|
||||||
- 32768 Hz if the 32k crystal oscillator is used. For this use value 3000 or more.
|
- 32768 Hz if the 32k crystal oscillator is used. For this use value 3000 or more.
|
||||||
In case more value will help improve the definition of the launch of the crystal.
|
In case more value will help improve the definition of the launch of the crystal.
|
||||||
If the crystal could not start, it will be switched to internal RC.
|
If the crystal could not start, it will be switched to internal RC.
|
||||||
|
@ -180,7 +180,7 @@ rtc_slow_freq_t rtc_clk_slow_freq_get(void)
|
|||||||
uint32_t rtc_clk_slow_freq_get_hz(void)
|
uint32_t rtc_clk_slow_freq_get_hz(void)
|
||||||
{
|
{
|
||||||
switch (rtc_clk_slow_freq_get()) {
|
switch (rtc_clk_slow_freq_get()) {
|
||||||
case RTC_SLOW_FREQ_RTC: return RTC_SLOW_CLK_FREQ_90K;
|
case RTC_SLOW_FREQ_RTC: return RTC_SLOW_CLK_FREQ_150K;
|
||||||
case RTC_SLOW_FREQ_32K_XTAL: return RTC_SLOW_CLK_FREQ_32K;
|
case RTC_SLOW_FREQ_32K_XTAL: return RTC_SLOW_CLK_FREQ_32K;
|
||||||
case RTC_SLOW_FREQ_8MD256: return RTC_SLOW_CLK_FREQ_8MD256;
|
case RTC_SLOW_FREQ_8MD256: return RTC_SLOW_CLK_FREQ_8MD256;
|
||||||
}
|
}
|
||||||
|
@ -36,10 +36,10 @@ void rtc_clk_init(rtc_clk_config_t cfg)
|
|||||||
{
|
{
|
||||||
rtc_cpu_freq_config_t old_config, new_config;
|
rtc_cpu_freq_config_t old_config, new_config;
|
||||||
|
|
||||||
/* Set tuning parameters for 8M and 90k clocks.
|
/* Set tuning parameters for 8M and 150k clocks.
|
||||||
* Note: this doesn't attempt to set the clocks to precise frequencies.
|
* Note: this doesn't attempt to set the clocks to precise frequencies.
|
||||||
* Instead, we calibrate these clocks against XTAL frequency later, when necessary.
|
* Instead, we calibrate these clocks against XTAL frequency later, when necessary.
|
||||||
* - SCK_DCAP value controls tuning of 90k clock.
|
* - SCK_DCAP value controls tuning of 150k clock.
|
||||||
* The higher the value of DCAP is, the lower is the frequency.
|
* The higher the value of DCAP is, the lower is the frequency.
|
||||||
* - CK8M_DFREQ value controls tuning of 8M clock.
|
* - CK8M_DFREQ value controls tuning of 8M clock.
|
||||||
* CLK_8M_DFREQ constant gives the best temperature characteristics.
|
* CLK_8M_DFREQ constant gives the best temperature characteristics.
|
||||||
@ -47,7 +47,7 @@ void rtc_clk_init(rtc_clk_config_t cfg)
|
|||||||
REG_SET_FIELD(RTC_CNTL_REG, RTC_CNTL_SCK_DCAP, cfg.slow_clk_dcap);
|
REG_SET_FIELD(RTC_CNTL_REG, RTC_CNTL_SCK_DCAP, cfg.slow_clk_dcap);
|
||||||
REG_SET_FIELD(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_CK8M_DFREQ, cfg.clk_8m_dfreq);
|
REG_SET_FIELD(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_CK8M_DFREQ, cfg.clk_8m_dfreq);
|
||||||
|
|
||||||
/* Configure 90k clock division */
|
/* Configure 150k clock division */
|
||||||
rtc_clk_divider_set(cfg.clk_rtc_clk_div);
|
rtc_clk_divider_set(cfg.clk_rtc_clk_div);
|
||||||
|
|
||||||
/* Configure 8M clock division */
|
/* Configure 8M clock division */
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cycles)
|
uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cycles)
|
||||||
{
|
{
|
||||||
/* On ESP32C3, choosing RTC_CAL_RTC_MUX results in calibration of
|
/* On ESP32C3, choosing RTC_CAL_RTC_MUX results in calibration of
|
||||||
* the 90k RTC clock regardless of the currenlty selected SLOW_CLK.
|
* the 150k RTC clock regardless of the currenlty selected SLOW_CLK.
|
||||||
* On the ESP32, it used the currently selected SLOW_CLK.
|
* On the ESP32, it used the currently selected SLOW_CLK.
|
||||||
* The following code emulates ESP32 behavior:
|
* The following code emulates ESP32 behavior:
|
||||||
*/
|
*/
|
||||||
@ -52,7 +52,7 @@ uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cycles)
|
|||||||
cal_clk = RTC_CAL_8MD256;
|
cal_clk = RTC_CAL_8MD256;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Enable requested clock (90k clock is always on) */
|
/* Enable requested clock (150k clock is always on) */
|
||||||
int dig_32k_xtal_state = REG_GET_FIELD(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_DIG_XTAL32K_EN);
|
int dig_32k_xtal_state = REG_GET_FIELD(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_DIG_XTAL32K_EN);
|
||||||
if (cal_clk == RTC_CAL_32K_XTAL && !dig_32k_xtal_state) {
|
if (cal_clk == RTC_CAL_32K_XTAL && !dig_32k_xtal_state) {
|
||||||
REG_SET_FIELD(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_DIG_XTAL32K_EN, 1);
|
REG_SET_FIELD(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_DIG_XTAL32K_EN, 1);
|
||||||
@ -84,8 +84,8 @@ uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cycles)
|
|||||||
REG_SET_FIELD(TIMG_RTCCALICFG2_REG(0), TIMG_RTC_CALI_TIMEOUT_THRES, RTC_SLOW_CLK_8MD256_CAL_TIMEOUT_THRES(slowclk_cycles));
|
REG_SET_FIELD(TIMG_RTCCALICFG2_REG(0), TIMG_RTC_CALI_TIMEOUT_THRES, RTC_SLOW_CLK_8MD256_CAL_TIMEOUT_THRES(slowclk_cycles));
|
||||||
expected_freq = RTC_SLOW_CLK_FREQ_8MD256;
|
expected_freq = RTC_SLOW_CLK_FREQ_8MD256;
|
||||||
} else {
|
} else {
|
||||||
REG_SET_FIELD(TIMG_RTCCALICFG2_REG(0), TIMG_RTC_CALI_TIMEOUT_THRES, RTC_SLOW_CLK_90K_CAL_TIMEOUT_THRES(slowclk_cycles));
|
REG_SET_FIELD(TIMG_RTCCALICFG2_REG(0), TIMG_RTC_CALI_TIMEOUT_THRES, RTC_SLOW_CLK_150K_CAL_TIMEOUT_THRES(slowclk_cycles));
|
||||||
expected_freq = RTC_SLOW_CLK_FREQ_90K;
|
expected_freq = RTC_SLOW_CLK_FREQ_150K;
|
||||||
}
|
}
|
||||||
uint32_t us_time_estimate = (uint32_t) (((uint64_t) slowclk_cycles) * MHZ / expected_freq);
|
uint32_t us_time_estimate = (uint32_t) (((uint64_t) slowclk_cycles) * MHZ / expected_freq);
|
||||||
/* Start calibration */
|
/* Start calibration */
|
||||||
|
@ -187,7 +187,7 @@ rtc_slow_freq_t rtc_clk_slow_freq_get(void)
|
|||||||
uint32_t rtc_clk_slow_freq_get_hz(void)
|
uint32_t rtc_clk_slow_freq_get_hz(void)
|
||||||
{
|
{
|
||||||
switch (rtc_clk_slow_freq_get()) {
|
switch (rtc_clk_slow_freq_get()) {
|
||||||
case RTC_SLOW_FREQ_RTC: return RTC_SLOW_CLK_FREQ_90K;
|
case RTC_SLOW_FREQ_RTC: return RTC_SLOW_CLK_FREQ_150K;
|
||||||
case RTC_SLOW_FREQ_32K_XTAL: return RTC_SLOW_CLK_FREQ_32K;
|
case RTC_SLOW_FREQ_32K_XTAL: return RTC_SLOW_CLK_FREQ_32K;
|
||||||
case RTC_SLOW_FREQ_8MD256: return RTC_SLOW_CLK_FREQ_8MD256;
|
case RTC_SLOW_FREQ_8MD256: return RTC_SLOW_CLK_FREQ_8MD256;
|
||||||
}
|
}
|
||||||
|
@ -32,10 +32,10 @@ void rtc_clk_init(rtc_clk_config_t cfg)
|
|||||||
{
|
{
|
||||||
rtc_cpu_freq_config_t old_config, new_config;
|
rtc_cpu_freq_config_t old_config, new_config;
|
||||||
|
|
||||||
/* Set tuning parameters for 8M and 90k clocks.
|
/* Set tuning parameters for 8M and 150k clocks.
|
||||||
* Note: this doesn't attempt to set the clocks to precise frequencies.
|
* Note: this doesn't attempt to set the clocks to precise frequencies.
|
||||||
* Instead, we calibrate these clocks against XTAL frequency later, when necessary.
|
* Instead, we calibrate these clocks against XTAL frequency later, when necessary.
|
||||||
* - SCK_DCAP value controls tuning of 90k clock.
|
* - SCK_DCAP value controls tuning of 150k clock.
|
||||||
* The higher the value of DCAP is, the lower is the frequency.
|
* The higher the value of DCAP is, the lower is the frequency.
|
||||||
* - CK8M_DFREQ value controls tuning of 8M clock.
|
* - CK8M_DFREQ value controls tuning of 8M clock.
|
||||||
* CLK_8M_DFREQ constant gives the best temperature characteristics.
|
* CLK_8M_DFREQ constant gives the best temperature characteristics.
|
||||||
@ -43,7 +43,7 @@ void rtc_clk_init(rtc_clk_config_t cfg)
|
|||||||
REG_SET_FIELD(RTC_CNTL_REG, RTC_CNTL_SCK_DCAP, cfg.slow_clk_dcap);
|
REG_SET_FIELD(RTC_CNTL_REG, RTC_CNTL_SCK_DCAP, cfg.slow_clk_dcap);
|
||||||
REG_SET_FIELD(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_CK8M_DFREQ, cfg.clk_8m_dfreq);
|
REG_SET_FIELD(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_CK8M_DFREQ, cfg.clk_8m_dfreq);
|
||||||
|
|
||||||
/* Configure 90k clock division */
|
/* Configure 150k clock division */
|
||||||
rtc_clk_divider_set(cfg.clk_rtc_clk_div);
|
rtc_clk_divider_set(cfg.clk_rtc_clk_div);
|
||||||
|
|
||||||
/* Configure 8M clock division */
|
/* Configure 8M clock division */
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cycles)
|
uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cycles)
|
||||||
{
|
{
|
||||||
/* On ESP32S3, choosing RTC_CAL_RTC_MUX results in calibration of
|
/* On ESP32S3, choosing RTC_CAL_RTC_MUX results in calibration of
|
||||||
* the 90k RTC clock regardless of the currenlty selected SLOW_CLK.
|
* the 150k RTC clock regardless of the currenlty selected SLOW_CLK.
|
||||||
* On the ESP32, it used the currently selected SLOW_CLK.
|
* On the ESP32, it used the currently selected SLOW_CLK.
|
||||||
* The following code emulates ESP32 behavior:
|
* The following code emulates ESP32 behavior:
|
||||||
*/
|
*/
|
||||||
@ -51,7 +51,7 @@ uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cycles)
|
|||||||
cal_clk = RTC_CAL_8MD256;
|
cal_clk = RTC_CAL_8MD256;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Enable requested clock (90k clock is always on) */
|
/* Enable requested clock (150k clock is always on) */
|
||||||
int dig_32k_xtal_state = REG_GET_FIELD(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_DIG_XTAL32K_EN);
|
int dig_32k_xtal_state = REG_GET_FIELD(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_DIG_XTAL32K_EN);
|
||||||
if (cal_clk == RTC_CAL_32K_XTAL && !dig_32k_xtal_state) {
|
if (cal_clk == RTC_CAL_32K_XTAL && !dig_32k_xtal_state) {
|
||||||
REG_SET_FIELD(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_DIG_XTAL32K_EN, 1);
|
REG_SET_FIELD(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_DIG_XTAL32K_EN, 1);
|
||||||
@ -83,8 +83,8 @@ uint32_t rtc_clk_cal_internal(rtc_cal_sel_t cal_clk, uint32_t slowclk_cycles)
|
|||||||
REG_SET_FIELD(TIMG_RTCCALICFG2_REG(0), TIMG_RTC_CALI_TIMEOUT_THRES, RTC_SLOW_CLK_8MD256_CAL_TIMEOUT_THRES(slowclk_cycles));
|
REG_SET_FIELD(TIMG_RTCCALICFG2_REG(0), TIMG_RTC_CALI_TIMEOUT_THRES, RTC_SLOW_CLK_8MD256_CAL_TIMEOUT_THRES(slowclk_cycles));
|
||||||
expected_freq = RTC_SLOW_CLK_FREQ_8MD256;
|
expected_freq = RTC_SLOW_CLK_FREQ_8MD256;
|
||||||
} else {
|
} else {
|
||||||
REG_SET_FIELD(TIMG_RTCCALICFG2_REG(0), TIMG_RTC_CALI_TIMEOUT_THRES, RTC_SLOW_CLK_90K_CAL_TIMEOUT_THRES(slowclk_cycles));
|
REG_SET_FIELD(TIMG_RTCCALICFG2_REG(0), TIMG_RTC_CALI_TIMEOUT_THRES, RTC_SLOW_CLK_150K_CAL_TIMEOUT_THRES(slowclk_cycles));
|
||||||
expected_freq = RTC_SLOW_CLK_FREQ_90K;
|
expected_freq = RTC_SLOW_CLK_FREQ_150K;
|
||||||
}
|
}
|
||||||
uint32_t us_time_estimate = (uint32_t) (((uint64_t) slowclk_cycles) * MHZ / expected_freq);
|
uint32_t us_time_estimate = (uint32_t) (((uint64_t) slowclk_cycles) * MHZ / expected_freq);
|
||||||
/* Start calibration */
|
/* Start calibration */
|
||||||
|
@ -60,7 +60,7 @@
|
|||||||
* For convenience, lower 2 bits should correspond to rtc_slow_freq_t values.
|
* For convenience, lower 2 bits should correspond to rtc_slow_freq_t values.
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SLOW_CLK_RTC = RTC_SLOW_FREQ_RTC, //!< Internal 90 kHz RC oscillator
|
SLOW_CLK_RTC = RTC_SLOW_FREQ_RTC, //!< Internal 150 kHz RC oscillator
|
||||||
SLOW_CLK_32K_XTAL = RTC_SLOW_FREQ_32K_XTAL, //!< External 32 kHz XTAL
|
SLOW_CLK_32K_XTAL = RTC_SLOW_FREQ_32K_XTAL, //!< External 32 kHz XTAL
|
||||||
SLOW_CLK_8MD256 = RTC_SLOW_FREQ_8MD256, //!< Internal 8 MHz RC oscillator, divided by 256
|
SLOW_CLK_8MD256 = RTC_SLOW_FREQ_8MD256, //!< Internal 8 MHz RC oscillator, divided by 256
|
||||||
SLOW_CLK_32K_EXT_OSC = RTC_SLOW_FREQ_32K_XTAL | EXT_OSC_FLAG //!< External 32k oscillator connected to 32K_XP pin
|
SLOW_CLK_32K_EXT_OSC = RTC_SLOW_FREQ_32K_XTAL | EXT_OSC_FLAG //!< External 32k oscillator connected to 32K_XP pin
|
||||||
@ -89,10 +89,10 @@ static const char *TAG = "clk";
|
|||||||
|
|
||||||
#ifdef CONFIG_BOOTLOADER_WDT_ENABLE
|
#ifdef CONFIG_BOOTLOADER_WDT_ENABLE
|
||||||
// WDT uses a SLOW_CLK clock source. After a function select_rtc_slow_clk a frequency of this source can changed.
|
// WDT uses a SLOW_CLK clock source. After a function select_rtc_slow_clk a frequency of this source can changed.
|
||||||
// If the frequency changes from 90kHz to 32kHz, then the timeout set for the WDT will increase 2.8 times.
|
// If the frequency changes from 150kHz to 32kHz, then the timeout set for the WDT will increase 4.6 times.
|
||||||
// Therefore, for the time of frequency change, set a new lower timeout value (1.6 sec).
|
// Therefore, for the time of frequency change, set a new lower timeout value (1.6 sec).
|
||||||
// This prevents excessive delay before resetting in case the supply voltage is drawdown.
|
// This prevents excessive delay before resetting in case the supply voltage is drawdown.
|
||||||
// (If frequency is changed from 90kHz to 32kHz then WDT timeout will increased to 1.6sec * 90/32 = 4.5 sec).
|
// (If frequency is changed from 150kHz to 32kHz then WDT timeout will increased to 1.6sec * 150/32 = 7.5 sec).
|
||||||
wdt_hal_context_t rtc_wdt_ctx = {.inst = WDT_RWDT, .rwdt_dev = &RTCCNTL};
|
wdt_hal_context_t rtc_wdt_ctx = {.inst = WDT_RWDT, .rwdt_dev = &RTCCNTL};
|
||||||
uint32_t stage_timeout_ticks = (uint32_t)(1600ULL * rtc_clk_slow_freq_get_hz() / 1000ULL);
|
uint32_t stage_timeout_ticks = (uint32_t)(1600ULL * rtc_clk_slow_freq_get_hz() / 1000ULL);
|
||||||
wdt_hal_write_protect_disable(&rtc_wdt_ctx);
|
wdt_hal_write_protect_disable(&rtc_wdt_ctx);
|
||||||
@ -172,7 +172,7 @@ static void select_rtc_slow_clk(slow_clk_sel_t slow_clk)
|
|||||||
if (retry_32k_xtal-- > 0) {
|
if (retry_32k_xtal-- > 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ESP_EARLY_LOGW(TAG, "32 kHz XTAL not found, switching to internal 90 kHz oscillator");
|
ESP_EARLY_LOGW(TAG, "32 kHz XTAL not found, switching to internal 150 kHz oscillator");
|
||||||
rtc_slow_freq = RTC_SLOW_FREQ_RTC;
|
rtc_slow_freq = RTC_SLOW_FREQ_RTC;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ static const char *TAG = "clk";
|
|||||||
* For convenience, lower 2 bits should correspond to rtc_slow_freq_t values.
|
* For convenience, lower 2 bits should correspond to rtc_slow_freq_t values.
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SLOW_CLK_RTC = RTC_SLOW_FREQ_RTC, //!< Internal 90 kHz RC oscillator
|
SLOW_CLK_RTC = RTC_SLOW_FREQ_RTC, //!< Internal 150 kHz RC oscillator
|
||||||
SLOW_CLK_32K_XTAL = RTC_SLOW_FREQ_32K_XTAL, //!< External 32 kHz XTAL
|
SLOW_CLK_32K_XTAL = RTC_SLOW_FREQ_32K_XTAL, //!< External 32 kHz XTAL
|
||||||
SLOW_CLK_8MD256 = RTC_SLOW_FREQ_8MD256, //!< Internal 8 MHz RC oscillator, divided by 256
|
SLOW_CLK_8MD256 = RTC_SLOW_FREQ_8MD256, //!< Internal 8 MHz RC oscillator, divided by 256
|
||||||
SLOW_CLK_32K_EXT_OSC = RTC_SLOW_FREQ_32K_XTAL | EXT_OSC_FLAG //!< External 32k oscillator connected to 32K_XP pin
|
SLOW_CLK_32K_EXT_OSC = RTC_SLOW_FREQ_32K_XTAL | EXT_OSC_FLAG //!< External 32k oscillator connected to 32K_XP pin
|
||||||
@ -85,10 +85,10 @@ static void select_rtc_slow_clk(slow_clk_sel_t slow_clk);
|
|||||||
|
|
||||||
#ifdef CONFIG_BOOTLOADER_WDT_ENABLE
|
#ifdef CONFIG_BOOTLOADER_WDT_ENABLE
|
||||||
// WDT uses a SLOW_CLK clock source. After a function select_rtc_slow_clk a frequency of this source can changed.
|
// WDT uses a SLOW_CLK clock source. After a function select_rtc_slow_clk a frequency of this source can changed.
|
||||||
// If the frequency changes from 90kHz to 32kHz, then the timeout set for the WDT will increase 2.8 times.
|
// If the frequency changes from 150kHz to 32kHz, then the timeout set for the WDT will increase 4.6 times.
|
||||||
// Therefore, for the time of frequency change, set a new lower timeout value (1.6 sec).
|
// Therefore, for the time of frequency change, set a new lower timeout value (1.6 sec).
|
||||||
// This prevents excessive delay before resetting in case the supply voltage is drawdown.
|
// This prevents excessive delay before resetting in case the supply voltage is drawdown.
|
||||||
// (If frequency is changed from 90kHz to 32kHz then WDT timeout will increased to 1.6sec * 90/32 = 4.5 sec).
|
// (If frequency is changed from 150kHz to 32kHz then WDT timeout will increased to 1.6sec * 150/32 = 7.5 sec).
|
||||||
wdt_hal_context_t rtc_wdt_ctx = {.inst = WDT_RWDT, .rwdt_dev = &RTCCNTL};
|
wdt_hal_context_t rtc_wdt_ctx = {.inst = WDT_RWDT, .rwdt_dev = &RTCCNTL};
|
||||||
uint32_t stage_timeout_ticks = (uint32_t)(1600ULL * rtc_clk_slow_freq_get_hz() / 1000ULL);
|
uint32_t stage_timeout_ticks = (uint32_t)(1600ULL * rtc_clk_slow_freq_get_hz() / 1000ULL);
|
||||||
wdt_hal_write_protect_disable(&rtc_wdt_ctx);
|
wdt_hal_write_protect_disable(&rtc_wdt_ctx);
|
||||||
@ -170,7 +170,7 @@ static void select_rtc_slow_clk(slow_clk_sel_t slow_clk)
|
|||||||
if (retry_32k_xtal-- > 0) {
|
if (retry_32k_xtal-- > 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ESP_EARLY_LOGW(TAG, "32 kHz XTAL not found, switching to internal 90 kHz oscillator");
|
ESP_EARLY_LOGW(TAG, "32 kHz XTAL not found, switching to internal 150 kHz oscillator");
|
||||||
rtc_slow_freq = RTC_SLOW_FREQ_RTC;
|
rtc_slow_freq = RTC_SLOW_FREQ_RTC;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -184,7 +184,7 @@ static void task_wdt_isr(void *arg)
|
|||||||
abort();
|
abort();
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
#if !CONFIG_IDF_TARGET_ESP32C3 // TODO ESP32-C3 add backtrace printing support IDF-2285
|
#if !CONFIG_IDF_TARGET_ESP32C3 // TODO: ESP32-C3 IDF-2986
|
||||||
int current_core = xPortGetCoreID();
|
int current_core = xPortGetCoreID();
|
||||||
//Print backtrace of current core
|
//Print backtrace of current core
|
||||||
ESP_EARLY_LOGE(TAG, "Print CPU %d (current core) backtrace", current_core);
|
ESP_EARLY_LOGE(TAG, "Print CPU %d (current core) backtrace", current_core);
|
||||||
|
@ -72,7 +72,7 @@ static inline void touch_ll_get_measure_times(uint16_t *meas_time)
|
|||||||
*/
|
*/
|
||||||
static inline void touch_ll_set_sleep_time(uint16_t sleep_time)
|
static inline void touch_ll_set_sleep_time(uint16_t sleep_time)
|
||||||
{
|
{
|
||||||
// touch sensor sleep cycle Time = sleep_cycle / RTC_SLOW_CLK(90k)
|
// touch sensor sleep cycle Time = sleep_cycle / RTC_SLOW_CLK(150k)
|
||||||
RTCCNTL.touch_ctrl1.touch_sleep_cycles = sleep_time;
|
RTCCNTL.touch_ctrl1.touch_sleep_cycles = sleep_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,9 +55,9 @@ extern "C" {
|
|||||||
|
|
||||||
#define RTC_SLOW_CLK_X32K_CAL_TIMEOUT_THRES(cycles) (cycles << 12)
|
#define RTC_SLOW_CLK_X32K_CAL_TIMEOUT_THRES(cycles) (cycles << 12)
|
||||||
#define RTC_SLOW_CLK_8MD256_CAL_TIMEOUT_THRES(cycles) (cycles << 12)
|
#define RTC_SLOW_CLK_8MD256_CAL_TIMEOUT_THRES(cycles) (cycles << 12)
|
||||||
#define RTC_SLOW_CLK_90K_CAL_TIMEOUT_THRES(cycles) (cycles << 10)
|
#define RTC_SLOW_CLK_150K_CAL_TIMEOUT_THRES(cycles) (cycles << 10)
|
||||||
|
|
||||||
#define RTC_SLOW_CLK_FREQ_90K 90000
|
#define RTC_SLOW_CLK_FREQ_150K 150000
|
||||||
#define RTC_SLOW_CLK_FREQ_8MD256 (RTC_FAST_CLK_FREQ_APPROX / 256)
|
#define RTC_SLOW_CLK_FREQ_8MD256 (RTC_FAST_CLK_FREQ_APPROX / 256)
|
||||||
#define RTC_SLOW_CLK_FREQ_32K 32768
|
#define RTC_SLOW_CLK_FREQ_32K 32768
|
||||||
|
|
||||||
@ -210,7 +210,7 @@ typedef struct {
|
|||||||
rtc_slow_freq_t slow_freq : 2; //!< RTC_SLOW_CLK frequency to set
|
rtc_slow_freq_t slow_freq : 2; //!< RTC_SLOW_CLK frequency to set
|
||||||
uint32_t clk_rtc_clk_div : 8;
|
uint32_t clk_rtc_clk_div : 8;
|
||||||
uint32_t clk_8m_clk_div : 3; //!< RTC 8M clock divider (division is by clk_8m_div+1, i.e. 0 means 8MHz frequency)
|
uint32_t clk_8m_clk_div : 3; //!< RTC 8M clock divider (division is by clk_8m_div+1, i.e. 0 means 8MHz frequency)
|
||||||
uint32_t slow_clk_dcap : 8; //!< RTC 90k clock adjustment parameter (higher value leads to lower frequency)
|
uint32_t slow_clk_dcap : 8; //!< RTC 150k clock adjustment parameter (higher value leads to lower frequency)
|
||||||
uint32_t clk_8m_dfreq : 8; //!< RTC 8m clock adjustment parameter (higher value leads to higher frequency)
|
uint32_t clk_8m_dfreq : 8; //!< RTC 8m clock adjustment parameter (higher value leads to higher frequency)
|
||||||
} rtc_clk_config_t;
|
} rtc_clk_config_t;
|
||||||
|
|
||||||
|
@ -178,7 +178,7 @@ typedef struct rtc_cpu_freq_config_s {
|
|||||||
* @brief RTC SLOW_CLK frequency values
|
* @brief RTC SLOW_CLK frequency values
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
RTC_SLOW_FREQ_RTC = 0, //!< Internal 150 kHz RC oscillator
|
RTC_SLOW_FREQ_RTC = 0, //!< Internal 90 kHz RC oscillator
|
||||||
RTC_SLOW_FREQ_32K_XTAL = 1, //!< External 32 kHz XTAL
|
RTC_SLOW_FREQ_32K_XTAL = 1, //!< External 32 kHz XTAL
|
||||||
RTC_SLOW_FREQ_8MD256 = 2, //!< Internal 8 MHz RC oscillator, divided by 256
|
RTC_SLOW_FREQ_8MD256 = 2, //!< Internal 8 MHz RC oscillator, divided by 256
|
||||||
} rtc_slow_freq_t;
|
} rtc_slow_freq_t;
|
||||||
@ -426,7 +426,7 @@ rtc_slow_freq_t rtc_clk_slow_freq_get(void);
|
|||||||
/**
|
/**
|
||||||
* @brief Get the approximate frequency of RTC_SLOW_CLK, in Hz
|
* @brief Get the approximate frequency of RTC_SLOW_CLK, in Hz
|
||||||
*
|
*
|
||||||
* - if RTC_SLOW_FREQ_RTC is selected, returns ~150000
|
* - if RTC_SLOW_FREQ_RTC is selected, returns ~90000
|
||||||
* - if RTC_SLOW_FREQ_32K_XTAL is selected, returns 32768
|
* - if RTC_SLOW_FREQ_32K_XTAL is selected, returns 32768
|
||||||
* - if RTC_SLOW_FREQ_8MD256 is selected, returns ~33000
|
* - if RTC_SLOW_FREQ_8MD256 is selected, returns ~33000
|
||||||
*
|
*
|
||||||
|
@ -55,9 +55,9 @@ extern "C" {
|
|||||||
|
|
||||||
#define RTC_SLOW_CLK_X32K_CAL_TIMEOUT_THRES(cycles) (cycles << 12)
|
#define RTC_SLOW_CLK_X32K_CAL_TIMEOUT_THRES(cycles) (cycles << 12)
|
||||||
#define RTC_SLOW_CLK_8MD256_CAL_TIMEOUT_THRES(cycles) (cycles << 12)
|
#define RTC_SLOW_CLK_8MD256_CAL_TIMEOUT_THRES(cycles) (cycles << 12)
|
||||||
#define RTC_SLOW_CLK_90K_CAL_TIMEOUT_THRES(cycles) (cycles << 10)
|
#define RTC_SLOW_CLK_150K_CAL_TIMEOUT_THRES(cycles) (cycles << 10)
|
||||||
|
|
||||||
#define RTC_SLOW_CLK_FREQ_90K 90000
|
#define RTC_SLOW_CLK_FREQ_150K 150000
|
||||||
#define RTC_SLOW_CLK_FREQ_8MD256 (RTC_FAST_CLK_FREQ_APPROX / 256)
|
#define RTC_SLOW_CLK_FREQ_8MD256 (RTC_FAST_CLK_FREQ_APPROX / 256)
|
||||||
#define RTC_SLOW_CLK_FREQ_32K 32768
|
#define RTC_SLOW_CLK_FREQ_32K 32768
|
||||||
|
|
||||||
@ -214,7 +214,7 @@ typedef struct {
|
|||||||
rtc_slow_freq_t slow_freq : 2; //!< RTC_SLOW_CLK frequency to set
|
rtc_slow_freq_t slow_freq : 2; //!< RTC_SLOW_CLK frequency to set
|
||||||
uint32_t clk_rtc_clk_div : 8;
|
uint32_t clk_rtc_clk_div : 8;
|
||||||
uint32_t clk_8m_clk_div : 3; //!< RTC 8M clock divider (division is by clk_8m_div+1, i.e. 0 means 8MHz frequency)
|
uint32_t clk_8m_clk_div : 3; //!< RTC 8M clock divider (division is by clk_8m_div+1, i.e. 0 means 8MHz frequency)
|
||||||
uint32_t slow_clk_dcap : 8; //!< RTC 90k clock adjustment parameter (higher value leads to lower frequency)
|
uint32_t slow_clk_dcap : 8; //!< RTC 150k clock adjustment parameter (higher value leads to lower frequency)
|
||||||
uint32_t clk_8m_dfreq : 8; //!< RTC 8m clock adjustment parameter (higher value leads to higher frequency)
|
uint32_t clk_8m_dfreq : 8; //!< RTC 8m clock adjustment parameter (higher value leads to higher frequency)
|
||||||
} rtc_clk_config_t;
|
} rtc_clk_config_t;
|
||||||
|
|
||||||
|
@ -136,7 +136,9 @@ Once the program is loaded into RTC memory, the application can start it, callin
|
|||||||
ULP-RISC-V Program Flow
|
ULP-RISC-V Program Flow
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
The ULP-RISC-V coprocessor is started by a timer. The timer is started once :cpp:func:`ulp_riscv_run` is called. The timer counts the number of RTC_SLOW_CLK ticks (by default, produced by an internal 90 kHz RC oscillator). The number of ticks is set using ``RTC_CNTL_ULP_CP_TIMER_1_REG`` register. When starting the ULP, ``RTC_CNTL_ULP_CP_TIMER_1_REG`` will be used to set the number of timer ticks.
|
{IDF_TARGET_RTC_CLK_FRE:default="150kHz", esp32s2="90kHz"}
|
||||||
|
|
||||||
|
The ULP-RISC-V coprocessor is started by a timer. The timer is started once :cpp:func:`ulp_riscv_run` is called. The timer counts the number of RTC_SLOW_CLK ticks (by default, produced by an internal {IDF_TARGET_RTC_CLK_FRE} RC oscillator). The number of ticks is set using ``RTC_CNTL_ULP_CP_TIMER_1_REG`` register. When starting the ULP, ``RTC_CNTL_ULP_CP_TIMER_1_REG`` will be used to set the number of timer ticks.
|
||||||
|
|
||||||
The application can set ULP timer period values (RTC_CNTL_ULP_CP_TIMER_1_REG) using the :cpp:func:`ulp_set_wakeup_period` function.
|
The application can set ULP timer period values (RTC_CNTL_ULP_CP_TIMER_1_REG) using the :cpp:func:`ulp_set_wakeup_period` function.
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
System Time
|
System Time
|
||||||
===========
|
===========
|
||||||
|
|
||||||
{IDF_TARGET_RTC_CLK_FRE:default="90kHz", esp32="150kHz"}
|
{IDF_TARGET_RTC_CLK_FRE:default="150kHz", esp32s2="90kHz"}
|
||||||
{IDF_TARGET_HARDWARE_DESIGN_URL:default="`ESP32 Hardware Design Guidelines <https://www.espressif.com/sites/default/files/documentation/esp32_hardware_design_guidelines_en.pdf#page=10>`_", esp32="`ESP32 Hardware Design Guidelines <https://www.espressif.com/sites/default/files/documentation/esp32_hardware_design_guidelines_en.pdf#page=10>`_", esp32s2="`ESP32-S2 Hardware Design Guidelines <https://www.espressif.com/sites/default/files/documentation/esp32-s2_hardware_design_guidelines_en.pdf#page=10>`_"}
|
{IDF_TARGET_HARDWARE_DESIGN_URL:default="`ESP32 Hardware Design Guidelines <https://www.espressif.com/sites/default/files/documentation/esp32_hardware_design_guidelines_en.pdf#page=10>`_", esp32="`ESP32 Hardware Design Guidelines <https://www.espressif.com/sites/default/files/documentation/esp32_hardware_design_guidelines_en.pdf#page=10>`_", esp32s2="`ESP32-S2 Hardware Design Guidelines <https://www.espressif.com/sites/default/files/documentation/esp32-s2_hardware_design_guidelines_en.pdf#page=10>`_"}
|
||||||
|
|
||||||
Overview
|
Overview
|
||||||
|
Loading…
Reference in New Issue
Block a user