参考了 https://github.com/krzychb/dac-cosine 的源码,编译、烧录后验证确实产生了波形。分析代码,里面调用了 `dac_rtc_pad_init()` 函数(位于 esp-idf 的 dac_common_legacy.c 中),函数中再调用了 `rtc_gpio_init()` 函数(位于rtc_io.c中),函数里面再调用了 `io_mux_enable_lp_io_clock()` 函数(位于io_mux.c中),里面又调用了 `rtcio_ll_enable_io_clock()` 函数。
这个 rtcio_ll_enable_io_clock() 里面的实现代码在哪?我找不到了,无法弄清楚要启用 cw 前,具体需要初始化 rtc_gpio 所需要的步骤,手册(esp32 技术参考手册版本5.2)里也没写。手册里图 29.9 只描述了启动 cw 的过程,但没有 rtc gpio 的初始化过程。
大家有谁知道初始化 rtc gpio 具体需要完成哪些步骤吗?
== 2025.01.01 更新解决方案 ==
按照《ESP32_技术参考手册_5.2》中,图 29-9 和 29-10 里的顺序,从左到右,一个个寄存器设置好,就能正常启动 cw 了。
核心代码:
Code: Select all
// dac_cosine_enable
set_peri_reg_bit(SENS_SAR_DAC_CTRL1_REG, SENS_SW_TONE_EN_S);
// config the RTC clock.
set_peri_reg_bits(RTC_CNTL_CLK_CONF_REG , RTC_CNTL_CK8M_DIV_SEL_M, 7, RTC_CNTL_CK8M_DIV_SEL_S);
// config the FSTEP as 72 ()
set_peri_reg_bits(SENS_SAR_DAC_CTRL1_REG, SENS_SW_FSTEP_M, 72, SENS_SW_FSTEP_S);
// SENS_SAR_DAC_SCALEn[1:0]
set_peri_reg_bits(SENS_SAR_DAC_CTRL2_REG, SENS_DAC_SCALE1_M, 0, SENS_DAC_SCALE1_S);
// SENS_SAR_DAC_DCn[7:0]
set_peri_reg_bits(SENS_SAR_DAC_CTRL2_REG, SENS_DAC_DC1_M, 0, SENS_DAC_DC1_S);
// SENS_DAC_INVn[1:0]
set_peri_reg_bits(SENS_SAR_DAC_CTRL2_REG, SENS_DAC_INV1_M, 2, SENS_DAC_INV1_S);
// (optional) RTCIO_PAD_PDACn_DAC[7:0] PAD DAC1 输出值。(读/写)
// SENS_DAC_DIG_FORCE 1:DAC1 & DAC2 使用DMA;0:DAC1 & DAC2 不使用DMA 。
clear_peri_reg_bit(SENS_SAR_DAC_CTRL1_REG, SENS_DAC_DIG_FORCE_S);
// RTCIO_PAD_PDACn_DAC_XPD_FORCE 给DACn 上电。
set_peri_reg_bit(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_DAC_XPD_FORCE_S);
// pdacn_dac[7:0] SENS_DAC_CW_EN1
set_peri_reg_bit(SENS_SAR_DAC_CTRL2_REG, SENS_DAC_CW_EN1_S);
// pdacn_xpd_dac
// RTCIO_PAD_PDACn_XPD_DAC 给DACn 上电(CW总开关)
// set_peri_reg_bit(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_XPD_DAC_S);
clear_peri_reg_bit(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_XPD_DAC_S);