You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译ESP32-S3时遇‘I2S_MODE_DAC_BUILT_IN’未声明错误求助

解决ESP32-S3编译时‘I2S_MODE_DAC_BUILT_IN’未声明的问题

问题背景

参考某AM发射机代码,使用Arduino IDE编译ESP32-S3时出现'I2S_MODE_DAC_BUILT_IN'未声明错误,但编译初代ESP32可正常通过,相关setup代码如下:

void setup() 
{
  Serial.begin(115200);
  setCpuFrequencyMhz(240);                              //highest cpu frequency
  i2s_driver_install(i2s_num, &i2s_config, 0, NULL);    //start i2s driver
  i2s_set_pin(i2s_num, NULL);                           //use internal DAC
  i2s_set_sample_rates(i2s_num, 1000000);               //dummy sample rate, since the function fails at high values

  //this is the hack that enables the highest sampling rate possible ~13MHz
  SET_PERI_REG_BITS(I2S_CLKM_CONF_REG(0), I2S_CLKM_DIV_A_V, 1, I2S_CLKM_DIV_A_S);
  SET_PERI_REG_BITS(I2S_CLKM_CONF_REG(0), I2S_CLKM_DIV_B_V, 1, I2S_CLKM_DIV_B_S);
  SET_PERI_REG_BITS(I2S_CLKM_CONF_REG(0), I2S_CLKM_DIV_NUM_V, 2, I2S_CLKM_DIV_NUM_S); 
  SET_PERI_REG_BITS(I2S_SAMPLE_RATE_CONF_REG(0), I2S_TX_BCK_DIV_NUM_V, 2, I2S_TX_BCK_DIV_NUM_S); 
}

问题原因

ESP32-S3基于的ESP-IDF版本对I2S DAC模式的宏定义做了调整,初代ESP32使用的I2S_MODE_DAC_BUILT_IN宏在S3的核心库中已被拆分为通道专属定义,不再直接通用。同时,S3的I2S硬件寄存器地址也与初代ESP32存在差异。

修复步骤

1. 替换I2S模式宏定义

找到代码中i2s_config结构体的定义部分,将I2S_MODE_DAC_BUILT_IN替换为ESP32-S3兼容的宏:

  • 仅使用DAC通道0:I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN_TX0
  • 仅使用DAC通道1:I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN_TX1
  • 同时启用两个DAC通道:I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN_TX0 | I2S_MODE_DAC_BUILT_IN_TX1

示例修改后的i2s_config:

i2s_config_t i2s_config = {
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN_TX0),
    .sample_rate = 1000000,
    .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
    .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
    .communication_format = I2S_COMM_FORMAT_STAND_MSB,
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
    .dma_buf_count = 8,
    .dma_buf_len = 64,
    .use_apll = false
};

2. 适配寄存器操作地址

原代码中直接操作硬件寄存器的部分需要替换为ESP32-S3对应的寄存器名称:

  • 将I2S_CLKM_CONF_REG(0)改为I2S0_CLKM_CONF_REG
  • 将I2S_SAMPLE_RATE_CONF_REG(0)改为I2S0_SAMPLE_RATE_CONF_REG

修改后的寄存器操作代码:

//适配ESP32-S3,启用最高采样率~13MHz
SET_PERI_REG_BITS(I2S0_CLKM_CONF_REG, I2S_CLKM_DIV_A_V, 1, I2S_CLKM_DIV_A_S);
SET_PERI_REG_BITS(I2S0_CLKM_CONF_REG, I2S_CLKM_DIV_B_V, 1, I2S_CLKM_DIV_B_S);
SET_PERI_REG_BITS(I2S0_CLKM_CONF_REG, I2S_CLKM_DIV_NUM_V, 2, I2S_CLKM_DIV_NUM_S); 
SET_PERI_REG_BITS(I2S0_SAMPLE_RATE_CONF_REG, I2S_TX_BCK_DIV_NUM_V, 2, I2S_TX_BCK_DIV_NUM_S); 

3. 更新ESP32 Arduino核心

确保使用的ESP32 Arduino核心版本不低于2.0.5,旧版本对ESP32-S3的硬件支持存在缺失。可通过Arduino IDE的开发板管理器搜索“ESP32”进行更新。

验证

完成以上修改后重新编译,'I2S_MODE_DAC_BUILT_IN'未声明的错误应被解决,代码可正常适配ESP32-S3运行。

内容的提问来源于stack exchange,提问作者John Persuro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:36:15