【已解决】esp32 余弦发生器的使用问题

janvier
Posts: 4
Joined: Mon Dec 23, 2024 4:12 am

【已解决】esp32 余弦发生器的使用问题

Postby janvier » Mon Dec 23, 2024 9:37 am

我打算用 rust + embassy 使用 esp32 dac 的余弦发生器(cw)。查阅了 rust 的 esp-hal 库,里面并没有提供 cw 的抽象与实现,dac 的 hal 也没有相关的函数,于是打算自己实现。

参考了 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);


Who is online

Users browsing this forum: No registered users and 78 guests