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: TDA4VM: use MCU_timer0 to generate PWM, and it takes 20 seconds since power up

Part Number:

Experts:

    We use MCU_TIMER0 to generate PWM.

The program is on the SD card, and run on MCU2_0.

It takes 20 seconds at least to see the PWM wave.

   What are the reasons and how to improve?

My SDK is ti-processer-sdk-rtos-j721e-evm-08_00_00_12.

code:


int32_t TIMEROutput(uint32_t baseAddr)
{
int32_t regVal;
TIMERReset(baseAddr);

HW_WR_REG32(baseAddr + TIMER_TIOCP_CFG, 0xAUL);

/* Select autoreload mode.TIMER_TCLR[1] AR 0x1 */
regVal = 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 0x2 */
regVal = 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 = 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 = 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 = 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 = 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);
}
/* 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-250UL);
/* Load timer compare value. TIMER_TMAR 0x- */
HW_WR_REG32(baseAddr + TIMER_TMAR, 0xFFFFFFFFUL-125UL);
/* Enable compare. TIMER_TCLR[6] CE 0x1 */
regVal = 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 = 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);
}
return regVal;
}