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.

[参考译文] TDA2EVM5777:IPU2 Core0中的 Timer-9无法正常工作、而 Timer-4在相同配置下正常工作

Guru**** 2551110 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/604160/tda2evm5777-timer-9-in-ipu2-core0-not-working-properly-while-timer-4-working-properly-for-same-configuration

器件型号:TDA2EVM5777

PROB:IPU2 Core0中的定时器9-11:TCRR 寄存器未加载 TLDR 寄存器值,方法是向 TTGR 寄存器写入除零以外的值或向 TCCR 寄存器分配直接值

对于相同的配置、计时器3-4已正确更新、但计时器9-11无法正常工作

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void App_StartTimer9 (uint32 TimeinM)

/*匹配挂起中断清除*/
OS_TIMER9_PER1_IRQSTATUS.MAT_IT_FLAG = 1;

/*溢出挂起中断清除*/
OS_TIMER9_PER1_IRQSTATUS.OVF IT_FLAG = 1;

/*捕捉挂起中断清除*/
OS_TIMER9_PER1_IRQSTATUS.TCAR_IT_FLAG = 1;

OS_TIMER9_IRQENABLE_CLR.OVF EN_FLAG = 1;

/*溢出后自动重新加载*/
OS_TIMER9_PER1_L4_TCLR.AR = 1;

/*预分频器启用*/
OS_TIMER9_PER1_L4_TCLR.PRE = 1;

/*预分频器将频率20MHz 除以4 */
OS_TIMER9_PER1_L4_TCLR.PTV = 1;

20MHz 时的//加载值,延迟为1ms */
OS_TIMER9_PER1_L4_TLDR =计时器;

/*触发从 TLDR 重新加载 TCRR */
OS_TIMER9_PER1_L4_TTGR = 1;

/*启动计时器*/
OS_TIMER9_PER1_L4_TCLR.ST = 1;

/*该位设置1以启用溢出中断*/
OS_TIMER9_IRQENABLE_Set.OVF EN_FLAG = 1;

//.................................................................................................. //

void App_StartTimer4 (uint32 TimeinM)

/*匹配挂起中断清除*/
OS_TIMER4_PER1_IRQSTATUS.MAT_IT_FLAG = 1;

/*溢出挂起中断清除*/
OS_TIMER4_PER1_IRQSTATUS.OVF IT_FLAG = 1;

/*捕捉挂起中断清除*/
OS_TIMER4_PER1_IRQSTATUS.TCAR_IT_FLAG = 1;

/*溢出后自动重新加载*/
OS_TIMER4_PER1_L4_TCLR.AR = 1;

/*预分频器启用*/
OS_TIMER4_PER1_L4_TCLR.PRE = 1;

/*预分频器将频率20MHz 除以4 */
OS_TIMER4_PER1_L4_TCLR.PTV = 1;

20MHz 时的//加载值,延迟为1ms */
OS_TIMER4_PER1_L4_TLDR =计时器;

/*触发从 TLDR 重新加载 TCRR */
OS_TIMER4_PER1_L4_TTGR = 1;

/*启动计时器*/
OS_TIMER4_PER1_L4_TCLR.ST = 1;

/*该位设置1以启用溢出中断*/
OS_TIMER4_IRQENABLE_Set.OVF EN_FLAG = 1;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/* NVIC 中断清除启用寄存器*/
typedef 结构 stag_os_timer_IRQSTATUS_control

uint32 mat_IT_FLAG:1;//匹配时中断*/
uint32 OVF 它的标志:1;//溢出时中断*/
uint32 TCAR_IT_FLAG:1;//捕捉时中断*/
uint32:29;/*保留*/
} OS_IRQSTATUS;

#define OS_TIMER3_PER1_IRQSTATUS (*(volatile OS_IRQSTATUS*) 0x48034028UL)
#define OS_TIMER4_PER1_IRQSTATUS (*(volatile OS_IRQSTATUS*) 0x48036028UL)
#define OS_TIMER9_PER1_IRQSTATUS (*(volatile OS_IRQSTATUS*) 0x4803E028UL)
#define OS_TIMER11_PER1_IRQSTATUS (*(volatile OS_IRQSTATUS*) 0x48088028UL)

/*写入1以设置(启用中断)*/
typedef 结构体 stag_os_timer_IRQENABLE_Set_control

uint32 MAT_EN_FLAG:1;//匹配时中断*/
uint32 OVF EN_FLAG:1;//溢出时中断*/
uint32 TCAR_EN_FLAG:1;//捕捉时中断*/
uint32:29;/*保留*/
} OS_IRQENABLE;

#define OS_TIMER3_IRQENABLE_SET (*(volatile OS_IRQENABLE*) 0x4803402CUL)
#define OS_TIMER4_IRQENABLE_SET (*(volatile OS_IRQENABLE*) 0x4803602CUL)
#define OS_TIMER9_IRQENABLE_SET (*(volatile OS_IRQENABLE*) 0x4803E02CUL)
#define OS_TIMER11_IRQENABLE_SET (*(volatile OS_IRQENABLE*) 0x4808802CUL)

/*写入1以清除(清除中断)*/
#define OS_TIMER3_IRQENABLE_CLR (*(volatile OS_IRQENABLE*) 0x48034030UL)
#define OS_TIMER4_IRQENABLE_CLR (*(volatile OS_IRQENABLE*) 0x48036030UL)
#define OS_TIMER9_IRQENABLE_CLR (*(volatile OS_IRQENABLE*) 0x4803E030UL)
#define OS_TIMER11_IRQENABLE_CLR (*(volatile OS_IRQENABLE*) 0x48088030UL)

/*当前定时器寄存器 TCLR 值和运行模式以及停止定时器*/
typedef 结构体 stag_os_timer_TCLR_control

uint32 ST:1;/*停止计时器*/
uint32 AR:1;
uint32 PTV:3;
uint32 pre:1;
uint32 CE:1;
uint32 SCPWM:1;
uint32 TCM:2;
uint32 TRG:2;
uint32 PT:1;
uint32 capt_mode:1;
uint32 GPO_CFG:1;
uint32:17;/*保留*/
} OS_TIMER_TCLR;

#define OS_TIMER3_PER1_L4_TCLR (*(volatile OS_TIMER_TCLR*) 0x48034038UL)
#define OS_TIMER4_PER1_L4_TCLR (*(volatile OS_TIMER_TCLR*) 0x48036038UL)
#define OS_TIMER9_PER1_L4_TCLR (*(volatile OS_TIMER_TCLR*) 0x4803E038UL)
#define OS_TIMER11_PER1_L4_TCLR (*(volatile OS_TIMER_TCLR*) 0x48088038UL)

/*当前定时器寄存器 TCRR 值*/
#define OS_TIMER3_PER1_L4_TCRR (*(volatile UINT32*) 0x4803403CUL)
#define OS_TIMER4_PER1_L4_TCRR (*(volatile UINT32*) 0x4803603CUL)
#define OS_TIMER9_PER1_L4_TCRR (*(volatile UINT32*) 0x4803E03CUL)
#define OS_TIMER11_PER1_L4_TCRR (*(volatile UINT32*) 0x4808803CUL)

/*当前定时器寄存器 TLDR 值*/
#define OS_TIMER3_PER1_L4_TLDR (*(volatile UINT32*) 0x48034040UL)
#define OS_TIMER4_PER1_L4_TLDR (*(volatile UINT32*) 0x48036040UL)
#define OS_TIMER9_PER1_L4_TLDR (*(volatile UINT32*) 0x4803E040UL)
#define OS_TIMER11_PER1_L4_TLDR (*(volatile UINT32*) 0x48088040UL)

/*当前计时器寄存器 TTGR 值*/
#define OS_TIMER3_PER1_L4_TTGR (*(volatile UINT32*) 0x48034044UL)
#define OS_TIMER4_PER1_L4_TTGR (*(volatile UINT32*) 0x48036044UL)
#define OS_TIMER9_PER1_L4_TTGR (*(volatile UINT32*) 0x4803E044UL)
#define OS_TIMER11_PER1_L4_TTGR (*(volatile UINT32*) 0x48088044UL)

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


    APP_StartTimer3 (0xFE000005);
    APP_StartTimer4 (0xFE000006);
    APP_StartTimer9 (0xFE000005);
    APP_StartTimer11 (0xFE000005);

    while (1)

    if (OS_TIMER3_PER1_IRQSTATUS.OVF IT_FLAG = 1)

    /*溢出挂起中断清除*/
    OS_TIMER3_PER1_IRQSTATUS.OVF IT_FLAG = 1;
    OS_TIMER3_IRQENABLE_CLR.OVF EN_FLAG = 1;
    OS_TIMER3_IRQENABLE_Set.OVF EN_FLAG = 1;


    if (OS_TIMER4_PER1_IRQSTATUS.OVF IT_FLAG = 1)

    /*溢出挂起中断清除*/
    OS_TIMER4_PER1_IRQSTATUS.OVF IT_FLAG = 1;
    OS_TIMER4_IRQENABLE_CLR.OVF EN_FLAG = 1;
    OS_TIMER4_IRQENABLE_Set.OVF EN_FLAG = 1;


    if (OS_TIMER9_PER1_IRQSTATUS.OVF IT_FLAG = 1)

    /*溢出挂起中断清除*/
    OS_TIMER9_PER1_IRQSTATUS.OVF IT_FLAG = 1;
    OS_TIMER9_IRQENABLE_CLR.OVF EN_FLAG = 1;
    OS_TIMER9_IRQENABLE_Set.OVF EN_FLAG = 1;


    if (OS_TIMER11_PER1_IRQSTATUS.OVF IT_FLAG = 1)

    /*溢出挂起中断清除*/
    OS_TIMER11_PER1_IRQSTATUS.OVF IT_FLAG = 1;
    OS_TIMER11_IRQENABLE_CLR.OVF EN_FLAG = 1;
    OS_TIMER11_IRQENABLE_Set.OVF EN_FLAG = 1;



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

    您的问题已转交给专家。

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

    您能否描述一下如何在 PRCM 中启用 TIMER9时钟? 您发布的代码不涵盖此内容。

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

    您好 Stan、

    感谢您的回复。

    我正在使用 CCS V-7.1.0来调试代码。 启用 PRCM 模块的步骤如下所述。

    1>选择 cortex A-15目标  

    在工具栏中选择:  

    2>脚本-> TDA2EX PRCM 模块配置-> TDA2EX_PRCM_Module_AllEnable_Config

    3>脚本-> TDA2EX 多核初始化->  TDA2EX_multicore_EnableAllCores

    执行上述步骤后,在物理地址0x4A00 9750处的 CM_L4PER_TIMER9_CLKCTRL 寄存器中显示的值为0x00000002

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、您正在使用 SYS_CLK1 @ 20MHz 来进行计时器计时。

    我对计时器没有太多经验、但我查看了用户指南。 我认为这个问题必须与寄存器访问模式(已发布/未发布)相关。 这是由于时钟域之间的内部同步(接口功能)。 请熟悉:
    22.2.4.13.1.1写过帐同步模式
    和连续部分。

    我想您应该为寄存器访问启用布置模式、并按照 TRM 中的说明进行操作。

    此致、
    STAN