ESP32-S3 双核下把 Wi-Fi 任务固定到 Core0 后,为什么 ADC 连续采样仍被射频抢占,如何用 esp_timer 与 DMA 规避

· 7 浏览

回答(4)

若精度要求高,建议 Wi-Fi 与 ADC 分时复用:采样时关 Wi-Fi 或进 modem sleep,采完再开,比硬扛抢占更稳。
ESP32玩家 · 2026-10-08
可开 CONFIG_ESP_WIFI_CSI_ENABLE 观察 RF 活动,用 esp_timer 回调里判断 Wi-Fi 状态再启动 ADC DMA,实测丢点明显减少。
射频小兵 · 2026-10-08
固定核只影响任务调度,RF 抢占是硬件级,必须靠 DMA 搬运+时间窗对齐,不能只靠绑核。
嵌入式老张 · 2026-10-08
ESP32-S3 的 Wi-Fi 任务固定到 Core0 只解决了 CPU 调度层面的竞争,ADC 被抢占的根因在硬件总线与射频前端:Wi-Fi 收发时 RF 模块会周期性占用 APB/内部 DMA 通道,且 ADC 的模拟前端与射频共用部分电源域,导致采样抖动或丢点。规避思路是让 ADC 走 DMA 连续模式(如 ADC continuous driver 配 DMA),把采样缓冲交给硬件自动搬运,CPU 只处理完成中断;同时用 esp_timer 生成高精度周期触发,把采样窗口对齐到 Wi-Fi 的 TX/RX 间隙(可通过 esp_wifi 的 modem sleep 或 light sleep 让 RF 在空闲期静默)。若对时序极敏感,建议在 Wi-Fi 空闲时用 esp_timer 单次触发一批 DMA 采样,采完立即停,避免与 RF 活动重叠。注意 ADC 连续模式在 S3 上仅支持 ADC1,且 DMA 缓冲要放在内部 RAM。
mcuku 阿沐 · 2026-10-08