From 93f4b9c13f714908313edc60896235442cfcf004 Mon Sep 17 00:00:00 2001 From: gaoxu Date: Mon, 24 Nov 2025 11:16:07 +0800 Subject: [PATCH] fix(adc): fix ESP32/S2 panic when use continuous ADC --- components/esp_adc/esp32/adc_dma.c | 9 +++++++-- components/esp_adc/esp32s2/adc_dma.c | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/components/esp_adc/esp32/adc_dma.c b/components/esp_adc/esp32/adc_dma.c index 892d5efc15..50251d59df 100644 --- a/components/esp_adc/esp32/adc_dma.c +++ b/components/esp_adc/esp32/adc_dma.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -43,7 +43,12 @@ static IRAM_ATTR void adc_dma_intr_handler(void *arg) esp_err_t adc_dma_intr_event_init(adc_continuous_ctx_t *adc_ctx) { - return (esp_intr_alloc(i2s_periph_signal[ADC_DMA_I2S_HOST].irq, ESP_INTR_FLAG_IRAM, adc_dma_intr_handler, + int intr_flags = ESP_INTR_FLAG_LOWMED | ESP_INTR_FLAG_SHARED; +#if CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE + intr_flags |= ESP_INTR_FLAG_IRAM; +#endif + + return (esp_intr_alloc(i2s_periph_signal[ADC_DMA_I2S_HOST].irq, intr_flags, adc_dma_intr_handler, (void *)adc_ctx, &adc_ctx->adc_dma.dma_intr_hdl)); } diff --git a/components/esp_adc/esp32s2/adc_dma.c b/components/esp_adc/esp32s2/adc_dma.c index 1b6be919f5..07afab8946 100644 --- a/components/esp_adc/esp32s2/adc_dma.c +++ b/components/esp_adc/esp32s2/adc_dma.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -40,7 +40,12 @@ static IRAM_ATTR void adc_dma_intr_handler(void *arg) esp_err_t adc_dma_intr_event_init(adc_continuous_ctx_t *adc_ctx) { - return (esp_intr_alloc(spicommon_irqdma_source_for_host(ADC_DMA_SPI_HOST), ESP_INTR_FLAG_IRAM, adc_dma_intr_handler, + int intr_flags = ESP_INTR_FLAG_LOWMED | ESP_INTR_FLAG_SHARED; +#if CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE + intr_flags |= ESP_INTR_FLAG_IRAM; +#endif + + return (esp_intr_alloc(spicommon_irqdma_source_for_host(ADC_DMA_SPI_HOST), intr_flags, adc_dma_intr_handler, (void *)adc_ctx, &adc_ctx->adc_dma.dma_intr_hdl)); }