使用Stellar E1 BDAC輸出500Hz正弦波

Stellar E1 MCU內部擁有5個DAC接口,12bit採樣精度,每個接口有兩個輸出通道;DAC輸出的模擬波形能力在OBC及DCDC應用中可作為電流或者電壓信號做算法驗證;本篇文章基於SR5E1-EVBE7000P評估板及SDK1.3.0,使用BDAC外設輸出500Hz正弦波至GPIO口,並通過示波器採樣正弦波形。


MCU內部資源分配:使用TIM7的update event觸發DAC DMA從內存搬運至DHR12R1寄存器,DAC ch1輸出正弦波;
  1. 初始化TIM7外設,配置TIM7時鐘頻率為100k,設置TIM7 update event作為輸出觸發,計數值為4000,update event觸發輸出頻率50kHZ;

    tim_init(&DRV_TIM7);

    (void)tim_set_presc(&DRV_TIM7, TIM_DIVIDE_BY(CLOCK_TIMCLK1 / 100000U));

    (void)tim_set_trgo(&DRV_TIM7, TIM_TRGO_UPDATE);

    tim_start(&DRV_TIM7);

    tim_set_interval(&DRV_TIM7, 4000U);       /* 100kHz/4000 = 25Hz. */

    tim_set_comparator(&DRV_TIM7, 1U, 2000U); /* Duty cycle 50%.     */

    tim_enable(&DRV_TIM7);

  2. 定義dac_dma_conf結構體,選擇DMA1 stream0作為通道流,使能BDAC DMA功能,DMA觸發源選擇DAC_CHx_TRIG2對應TIM7的update event;

    dac_dma_conf_t dac_dma_conf;

    dac_dma_conf.dma_stream_tx_id = DMA1_STREAM0_ID;

    dac_dma_conf.dma_stream_bus_prio = DMA_PRIORITY_MAX;

    dac_dma_conf.dma_stream_irq_prio = IRQ_PRIORITY_10;

    dac_init(&BDACD);

    (void)dac_set_dma_conf(&BDACD, &dac_dma_conf);

    (void)dac_set_mode(&BDACD, DAC_DVR_MODE_SINGLE);

    (void)dac_set_highfreq_mode(&BDACD, DAC_HF_MODE_OVER_160MHZ);

    (void)dac_set_dma_mode(&BDACD, DAC_CHANNEL_1, DAC_DMA_ON);

    (void)dac_set_format(&BDACD, DAC_CHANNEL_1, DAC_DATA_12BIT_RIGHT_ALIGN);

    (void)dac_set_trigger_src(&BDACD, DAC_CHANNEL_1, DAC_CHx_TRIG2);

    (void)dac_enable_trigger(&BDACD, DAC_CHANNEL_1, true);

    (void)dac_set_wave(&BDACD, DAC_CHANNEL_1, DAC_WAVE_MODE_DISABLE);

    (void)dac_set_rst_trigger_src(&BDACD, DAC_CHANNEL_1, DAC_RST_CHx_TRIG2);

    (void)dac_set_output_connection(&BDACD, DAC_CHANNEL_1, DAC_OUT_CON_MODE_NORM_PIN_BUF_EN);

    (void)dac_enable_channel(&BDACD, DAC_CHANNEL_1, true);

    dac_start(&BDACD, (uint32_t *)&DAC_wave, 100);

  3. BDAC_CH1輸出數據集;

    uint32_t DAC_wave[100] = {0x0800, 0x0881, 0x0901, 0x0980, 0x09FD, 0x0A79, 0x0AF2, 0x0B68, 0x0BDA, 0x0C49,

                                                   0x0CB3, 0x0D19, 0x0D79, 0x0DD4, 0x0E29, 0x0E78, 0x0EC0, 0x0F02, 0x0F3C, 0x0F6F,

                                                  0x0F9B, 0x0FBF, 0x0FDB, 0x0FEF, 0x0FFB, 0x0FFF, 0x0FFB, 0x0FEF, 0x0FDB, 0x0FBF,

                                                  0x0F9B, 0x0F6F, 0x0F3C, 0x0F02, 0x0EC0, 0x0E78, 0x0E29, 0x0DD4, 0x0D79, 0x0D19,

                                                  0x0CB3, 0x0C49, 0x0BDA, 0x0B68, 0x0AF2, 0x0A79, 0x09FD, 0x0980, 0x0901, 0x0881,

                                                  0x0800, 0x077F, 0x06FF, 0x0680, 0x0603, 0x0587, 0x050E, 0x0498, 0x0426, 0x03B7,

                                                  0x034D, 0x02E7, 0x0287, 0x022C, 0x01D7, 0x0188, 0x0140, 0x00FE, 0x00C4, 0x0091,

                                                  0x0065, 0x0041, 0x0025, 0x0011, 0x0005, 0x0001, 0x0005, 0x0011, 0x0025, 0x0041,

                                                  0x0065, 0x0091, 0x00C4, 0x00FE, 0x0140, 0x0188, 0x01D7, 0x022C, 0x0287, 0x02E7,

                                                  0x034D, 0x03B7, 0x0426, 0x0498, 0x050E, 0x0587, 0x0603, 0x0680, 0x06FF, 0x077F};

  4. 在dac_start配置DMA相關參數,觸發源需選擇DMAMUX1_BDAC1_CH1;

    if (ddp->dma_mode[DAC_CHANNEL_1] == DAC_DMA_ON) {

    ddp->dac->CR |= ((uint32_t)ddp->dma_mode[DAC_CHANNEL_1]) << DAC_CR_DMAEN1_Pos;

    ddp->dac->CR |= DAC_CR_DMAUDRIE1;

    /* TODO: Configure DMA descriptor for ch1.*/

    ddp->dma_tx_descriptor = dma_stream_take(ddp->dma_conf->dma_stream_tx_id,

                     ddp->dma_conf->dma_stream_irq_prio,

                     dac_serve_dma_tx_interrupt,

                     (void *)ddp);

      /* Configure DMA stream peripheral addresses.*/

     dma_stream_set_peripheral(ddp->dma_tx_descriptor, (uint32_t)(&ddp->dac->DHR12R1));

    dma_stream_set_memory(ddp->dma_tx_descriptor,(uint32_t)addr);

    /* Configure DMA TX/RX triggers.*/

    dma_stream_set_trigger(ddp->dma_tx_descriptor, DMAMUX1_BDAC1_CH1);

    dma_stream_set_count(ddp->dma_tx_descriptor,cnt);

    dma_tx_mode = DMA_CCR_PL_VALUE(ddp->dma_conf->dma_stream_bus_prio) |

                          DMA_CCR_DIR_M2P | DMA_CCR_TCIE;

     

            /* Configure DMA memory increment mode.*/

    dma_tx_mode |= DMA_CCR_MINC;

    dma_tx_mode |= DMA_CCR_CIRC;

     /* Configure DMA frame size.*/

    dma_tx_mode |= DMA_CCR_PSIZE_WORD | DMA_CCR_MSIZE_WORD;

     /* Set up calculated DMA modes.*/

    dma_stream_set_transfer_mode(ddp->dma_tx_descriptor, dma_tx_mode);

    dma_stream_enable(ddp->dma_tx_descriptor);

            /* Enable DMA transmitter.*/

        }

  5. 編譯並下載代碼;使用示波器測量GPIO輸出的正弦波形;


        Ⅵ.TIM7_cnt及DHR12R1寄存器;

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論