This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TDA4VM: use MCU_timer0 to generate PWM, and it take 20 seconds since power up

Part Number: TDA4VM

Experts:

    We use MCU_TIMER0 to generate PWM, output by the pad E22.

The program is on the SD card, and run on MCU1_0. We start the core via SBL.

It takes 20 seconds more to see the PWM wave.

   What are the reasons and how to improve?

code:


    TIMERReset(baseAddr);

    HW_WR_REG32(0x40F08100UL, 0x1UL);

    HW_WR_REG32(baseAddr + TIMER_TIOCP_CFG, 0xAUL);

    /* Select autoreload mode.                  TIMER_TCLR[1] AR 0x-          */
    regVal = IcuE_timerWaitForWrite(TIMER_WRITE_POST_TCLR, baseAddr);
    if(CSL_PASS == regVal)
    {
        regVal = HW_RD_REG32(baseAddr + TIMER_TCLR);
        regVal &= (~(TIMER_TCLR_AR_MASK));
        regVal |= ((TIMER_TCLR_AR_AR_VALUE_1) << (TIMER_TCLR_AR_SHIFT));
        HW_WR_REG32(baseAddr + TIMER_TCLR, regVal);
    }
    /* Set prescale timer value.                    TIMER_TCLR[4-2] PTV 0x-   */
    regVal = IcuE_timerWaitForWrite(TIMER_WRITE_POST_TCLR, baseAddr);
    if(CSL_PASS == regVal)
    {
        regVal = HW_RD_REG32(baseAddr + TIMER_TCLR);
        regVal &= (~(TIMER_TCLR_PTV_MASK));
        regVal |= (2uL << (TIMER_TCLR_PTV_SHIFT));
        HW_WR_REG32(baseAddr + TIMER_TCLR, regVal);
    }
    /* Enable prescaler.                            TIMER_TCLR[5] PRE 0x1     */
    regVal = IcuE_timerWaitForWrite(TIMER_WRITE_POST_TCLR, baseAddr);
    if(CSL_PASS == regVal)
    {
        regVal = HW_RD_REG32(baseAddr + TIMER_TCLR);
        regVal &= (~(TIMER_TSICR_POSTED_MASK));
        regVal |= (1uL << (TIMER_TSICR_POSTED_SHIFT));
        HW_WR_REG32(baseAddr + TIMER_TCLR, regVal);
    }
    /* Select trigger output mode.              TIMER_TCLR[11-10] TRG 0x-     */
    regVal = IcuE_timerWaitForWrite(TIMER_WRITE_POST_TCLR, baseAddr);
    if(CSL_PASS == regVal)
    {
        regVal = HW_RD_REG32(baseAddr + TIMER_TCLR);
        regVal &= (~(TIMER_TCLR_TRG_MASK));
        regVal |= ((TIMER_TCLR_TRG_TRG_VALUE_0X2)<<(TIMER_TCLR_TRG_SHIFT));
        HW_WR_REG32(baseAddr + TIMER_TCLR, regVal);
    }
    /* Select pulse or toggle modulation PWM mode. TIMER_TCLR[12] PT 0x-      */
    regVal = IcuE_timerWaitForWrite(TIMER_WRITE_POST_TCLR, baseAddr);
    if(CSL_PASS == regVal)
    {
        regVal = HW_RD_REG32(baseAddr + TIMER_TCLR);
        regVal |= (TIMER_TCLR_PT_MASK);
        HW_WR_REG32(baseAddr + TIMER_TCLR, regVal);
    }
    /* Select TIMER[19-0] or MCU_TIMER[9-0]     TIMER_TCLR[14] GPO_CFG 0x0    */
    /* PWM output at device pins                                              */
    /* TIMER_IO[7-0] for TIMER[19-0] or at pins                               */
    /* MCU_TIMER_IO[9-0] for MCU_TIMER[9-0].                                  */
    regVal = IcuE_timerWaitForWrite(TIMER_WRITE_POST_TCLR, baseAddr);
    if(CSL_PASS == regVal)
    {
        regVal = HW_RD_REG32(baseAddr + TIMER_TCLR);
        regVal &= (~(TIMER_TCLR_GPO_CFG_MASK));
        HW_WR_REG32(baseAddr + TIMER_TCLR, regVal);
    }
     HW_WR_REG32(0x40F04280UL, 0UL);
    /* Configure PWM output pin default value.  TIMER_TCLR[7] SCPWM 0x-       */
    
    /* Load timer load value.                       TIMER_TLDR 0x-            */
    HW_WR_REG32(baseAddr + TIMER_TLDR, 0xFFFFFFFFUL-10000UL);
    /* Load timer compare value.                    TIMER_TMAR 0x-            */
    HW_WR_REG32(baseAddr + TIMER_TMAR, 0xFFFFFFFFUL-3000UL);
    /* Enable compare.                          TIMER_TCLR[6] CE 0x1          */
    regVal = IcuE_timerWaitForWrite(TIMER_WRITE_POST_TCLR, baseAddr);
    if(CSL_PASS == regVal)
    {
        regVal = HW_RD_REG32(baseAddr + TIMER_TCLR);
        regVal |= (TIMER_TCLR_CE_MASK);
        HW_WR_REG32(baseAddr + TIMER_TCLR, regVal);
    }
    /* Start the timer.                             TIMER_TCLR[0] ST 0x1      */
    regVal = IcuE_timerWaitForWrite(TIMER_WRITE_POST_TCLR, baseAddr);
    if(CSL_PASS == regVal)
    {
        regVal = HW_RD_REG32(baseAddr + TIMER_TCLR);
        regVal |= (TIMER_TCLR_ST_MASK);
        HW_WR_REG32(baseAddr + TIMER_TCLR, regVal);
    }