乐鑫技术交流
直播中

爱与友人

9年用户 985经验值
擅长:可编程逻辑 模拟技术 存储技术
私信 关注
[问答]

求助,关于ESP32C3自动light sleep模式下RMT,LEDC, ADC配置问题求解

开发环境:
开发板:ESP32-C3-DEVKITM-1
IDE: Vscode esp-idf
操作系统:win10
IDF 版本:5.1.1

使用自动light sleep模式时,RMT,ledc外设工作都不正常。开启电源管理,这些外设是受动态调频影响的。手册说可以选择RMT的时钟源为RC_FAST_CLK 或 XTAL_CLK,LEDC的时钟源为LEDC_USE_RC_FAST_CLK和LEDC_USE_XTAL_CLK。

然而在LEDC使用LEDC_USE_RC_FAST_CLK和LEDC_USE_XTAL_CLK工作时会直接复位,APB时钟是正常的。

是不是要使用light sleep模式,RMT和LEDC外设必须使用手动配置唤醒源和手动进入light sleep。自动light sleep能极大降低产品功耗,有没有相关配置能在自动light sleep下能够正常使用RMT和LEDC外设?

LEDC的配置代码如下:
ledc_timer_config_t ledc_timer = {
      .duty_resolution = LEDC_TIMER_13_BIT,
      .freq_hz = 5000,
      .speed_mode = LEDC_LS_MODE,
      .timer_num = LEDC_TIMER_0,
      .clk_cfg = LEDC_AUTO_CLK
    };
    ledc_timer_config( ledc_timer);

    ledc_channel_config_t ledc_channel_io = {
      .channel = 1,
      .duty = 0,
      .gpio_num = BLINK_GPIO,
      .speed_mode = LEDC_LS_MODE,
      .hpoint = 0,
      .timer_sel = LEDC_TIMER_0
    };

    ledc_channel_config( ledc_channel_io);
    ledc_fade_func_install(0);

RMT我是通过api来配置的:
rmt_set_source_clk(rmt_tx.channel,SOC_MOD_CLK_XTAL); //设置rmt的时钟源为XTAL,40kMz


回帖(1)

王鑫

2024-7-19 14:38:03
在ESP32-C3中,使用自动light sleep模式时,确实需要特别注意RMT、LEDC和ADC等外设的配置。以下是一些建议和解决方案,希望对您有所帮助:

1. **RMT时钟源选择**:
   - 在自动light sleep模式下,可以选择RMT的时钟源为RC_FAST_CLK或XTAL_CLK。为了确保RMT在light sleep模式下正常工作,建议在初始化RMT之前,先设置RMT时钟源。

   ```c
   rmt_config_t rmt_config = RMT_DEFAULT_CONFIG_TX(RMT_CHANNEL_0, RMT_MODE_MEM);
   rmt_config.clk_src = RMT_BASECLK_DEFAULT;
   rmt_config.resolution_hz = 1000000;
   rmt_config.mem_block_num = 1;
   rmt_config.tx_config.carrier_freq_hz = 36000;
   rmt_config.tx_config.carrier_level = RMT_CARRIER_LEVEL_HIGH;
   rmt_config.tx_config.carrier_duty_cycle = RMT_CARRIER_DUTY_CYCLE_EVEN;
   rmt_config.tx_config.idle_output_en = true;
   rmt_config.tx_config.idle_output_level = RMT_IDLE_LEVEL_LOW;
   rmt_config.flags = RMT_CHANNEL_FLAGS_DEFAULT;
   rmt_config.clk_src = RMT_BASECLK_RC_FAST;
   ```

2. **LEDC时钟源选择**:
   - 在自动light sleep模式下,LEDC的时钟源可以选择LEDC_USE_RC_FAST_CLK或LEDC_USE_XTAL_CLK。为了避免复位问题,建议在初始化LEDC之前,先设置LEDC时钟源。

   ```c
   ledc_timer_config_t ledc_timer = {
       .duty_resolution = LEDC_TIMER_10_BIT,
       .freq_hz = 5000,
       .clk_cfg = LEDC_USE_RC_FAST_CLK,
       .speed_mode = LEDC_HIGH_SPEED_MODE,
       .timer_num = LEDC_TIMER_0,
   };
   ledc_timer_config(&ledc_timer);
   ```

3. **手动配置唤醒源**:
   - 在自动light sleep模式下,确实需要手动配置唤醒源。您可以根据需要选择GPIO、RMT、LEDC等作为唤醒源。

   ```c
   // 配置GPIO唤醒源
   gpio_config_t io_conf = {
       .pin_bit_mask = (1ULL<        .mode = GPIO_MODE_INPUT,
       .pull_up_en = 1,
       .pull_down_en = 0,
       .intr_type = GPIO_INTR_NEGEDGE
   };
   gpio_config(&io_conf);
   gpio_wakeup_enable(GPIO_NUM_0, GPIO_INTR_NEGEDGE);

   // 配置RMT唤醒源
   rmt_sleep_mode_t rmt_sleep_mode = {
       .rmt_clk_src = RMT_BASECLK_DEFAULT,
       .rmt_sleep_mode = RMT_SLEEP_MODE_WAKEUP,
       .rmt_sleep_duration = 0
   };
   rmt_sleep_mode_set(&rmt_sleep_mode);

   // 配置LEDC唤醒源
   ledc_sleep_mode_t ledc_sleep_mode = {
       .ledc_clk_src = LEDC_USE_RC_FAST_CLK,
       .ledc_sleep_mode = LEDC_SLEEP_MODE_WAKEUP,
       .ledc_sleep_duration = 0
   };
   ledc_sleep_mode_set(&ledc_sleep_mode);
   ```

4. **手动进入light sleep**:
   - 在自动light sleep模式下,您可以选择手动进入light sleep,以确保系统在需要时进入低功耗状态。

   ```c
   // 进入light sleep
   asm("waiti 0");
   ```

5. **调试和优化**:
   - 在开发过程中,建议使用ESP-IDF的调试工具来监控系统状态,以便及时发现和解决问题。同时,根据实际需求对系统进行优化,以实现最佳的功耗性能。

总之,在使用ESP32-C3的自动light sleep模式时,需要特别注意RMT、LEDC和ADC等外设的配置。通过合理选择时钟源、手动配置唤醒源和手动进入light sleep,可以确保系统在低功耗状态下正常工作。希望这些建议对您有所帮助。
举报

更多回帖

×
20
完善资料,
赚取积分