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.

[参考译文] TDA4VP-Q1:了解计时器中断的值

Guru**** 2463330 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1477379/tda4vp-q1-understanding-the-values-for-timer-interrupt

器件型号:TDA4VP-Q1

工具与软件:

下面是另一个线程的代码片段

#define GPTIMER_MAX_RESOLUTION          (0xFFFFFFFFU)
#define TIMER_INITIAL_COUNT             (0x3C0U)
#define TIMER_RLD_COUNT                 (0x3C0U)

#define TIMER16_IRQ_NUM                 172


void TimerMode_Init(uint32_t baseAddr)
{

    TIMERReset(baseAddr);
    TIMEREmuModeConfigure(baseAddr, TIMER_TIOCP_CFG_EMUFREE_TIMER_FREE);//GPTIMER_FREE);
    TIMERIdleModeConfigure(baseAddr, TIMER_TIOCP_CFG_IDLEMODE_IDLE_MODE_0X1);//GPTIMER_NO_IDLE);
    TIMERPostedModeConfig(baseAddr, TIMER_TSICR_POSTED_POSTED_VALUE_0);//GPTIMER_NONPOSTED);
    TIMERCounterSet(baseAddr, (GPTIMER_MAX_RESOLUTION - TIMER_INITIAL_COUNT));
    TIMERReloadSet(baseAddr, (GPTIMER_MAX_RESOLUTION - TIMER_RLD_COUNT));
    TIMERModeConfigure(baseAddr, TIMER_TCLR_AR_MASK); //GPTIMER_AUTORLD_NOCMP_ENABLE);
    TIMERWakeEnable(baseAddr, TIMER_IRQWAKEEN_OVF_WUP_ENA_MASK);
    TIMERIntEnable(baseAddr, TIMER_INT_OVF_EN_FLAG);
    TIMERDisable(baseAddr);
}

Timer_PeriodConfig(uint32_t baseAddr, uint32_t wTime)
{
    HW_WR_REG32(baseAddr + TIMER_TCLR, 0x0002);
    HW_WR_REG32(baseAddr + TIMER_TCRR, (GPTIMER_MAX_RESOLUTION - wTime));
    HW_WR_REG32(baseAddr + TIMER_TLDR, (GPTIMER_MAX_RESOLUTION - wTime));
    HW_WR_REG32(baseAddr + TIMER_TCLR, 0x0003);     /* start timer */
}

void Timer_IntCfg(void)
{
    uint32_t baseAddr;

    HwiP_Handle hwiHandle;
    OsalInterruptRetCode_e      osalRetVal = 0;
    OsalRegisterIntrParams_t    intrPrms;

    /*Timer18*/
    baseAddr = TIMER16_ADDRESS;
    Osal_RegisterInterrupt_initParams(&intrPrms);
    intrPrms.corepacConfig.arg          = (uintptr_t)baseAddr;
    intrPrms.corepacConfig.name         = NULL;
    intrPrms.corepacConfig.isrRoutine   = Timer16_InterruptIsr;
    intrPrms.corepacConfig.priority     = 0x01U;
    intrPrms.corepacConfig.corepacEventNum = 0U; /* NOT USED ? */
    intrPrms.corepacConfig.triggerSensitivity = OSAL_ARM_GIC_TRIG_TYPE_HIGH_LEVEL;
    intrPrms.corepacConfig.intVecNum    = TIMER16_IRQ_NUM;

    osalRetVal = Osal_RegisterInterrupt(&intrPrms, &hwiHandle);

    if(osalRetVal == 0)
    {
        printf("Timer16_IntCfg success!\n");
    }
    else
    {
        printf("Timer16_IntCfg is fail!\n");
    }

}

我有以下问题。   

- TIMERIdleModeConfigure (baseAddr、TIMER_TIOCP_CFG_IDLEMODE_IDLE_MODE_0x1);//GPTIMER_NO_IDLE);  为什么需要这样做
- TIMERPostedModeConfig (baseAddr、TIMER_TSICR_POSTD_POSTD_VALUE_0);//GPTIMER_NONPOSTED); 我不明白什么是发布模式和未发布模式。

- TIMEREmuModeConfigure 什么是 EMU 模式?

- 为什么在第20行中禁用计时器?

-您能解释一下 Timer_Period_ 函数中的幻数吗? 0x000002和0x00003是什么意思?