编译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
相关产品推荐
相关产品推荐

