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.

[参考译文] CCS/TMS320F2.8379万D:ePWM时基时钟全局同步

Guru**** 2560390 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/635867/ccs-tms320f28379d-epwm-time-base-clock-global-sync

部件号:TMS320F2.8379万D

工具/软件:Code Composer Studio

您好!

我正在开发一个双核项目。 ePWM控制由不同的内核分隔。 EPWM1-3由CPU1控制, EPWM1-3由CPU2控制。 我需要在 不同内核之间同步时基时钟。

对于单核项目,我使用 TBCLKSYNC寄存器,所有工作正常:

void pwmSetupSingleCore(void){

EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0;
EDIS;

setupPwm1();setupPwm2();

setupPwm3();
setupPwm4();
setupPwm5();
setupPwm6();

EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS
;} 

但对于双核固件 ,需要另一种解决方案。 在"表2-173. PCLKCR0寄存器字段描述"(SPRUHM8F)有有关 GTBCLKSYNC字段的信息。 但没有任何关于使用此功能的示例或任何其他信息。

我需要有关GTBCLKSYNC进给的信息。 如何在 不同内核之间同步ePWM时基时钟?

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

    GTBCLKSYNC正是您所需的。 这是"Global TBCLKSYNC",它的工作方式与TBCLKSYNC完全相同,但在CPU上运行。

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

    您好,Kris,

    我尝试将TBCLKSYNC更改为GTBCLKSYNC,但它不起作用。

    如果我在每个内核上使用GTBCLKSYNC,一切正常(不是在不同内核之间):

    CPU1来源 CPU2源
    void pwmSetup(void)
    {
    	EALLOW;
    	CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0;
    
    	DevCfgRegs.CPUSEL0.bit.EPWM1 =1;
    	DevCfgRegs.CPUSEL0.bit.EPWM2 =1;
    	DevCfgRegs.CPUSEPWM3 =位
    	DevCfgRegs.CPUSEL0.bit.EPWM6 = 1;
    	DevCfgRegs.CPUSEL0.bit.EPWM7 = 1;
    	DevCfgRegs.CPUSEL0.bit.EPWM8 = 1;
    	EDIS;
    
    	pwm9setup();
    	pwm10setup();
    	pwm11setup();
    
    	EALLOW;
    	CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    	EDIS
    ;} 

    void pwmSetup(void)
    {
    	EALLOW;
    	CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0;
    	EDIS;
    
    	pwm1setup();
    	pwm2setup();
    	pwm3setup();
    	pwm6setup();
    	pwm7setup();
    	pwm8setup();
    
    	EALLOW;
    	CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    	EDIS
    ;} 

    同步正常:

    但如果我只将TBCLKSYNC更改为 GTBCLKSYNC:

    CPU1来源 CPU2源
    void pwmSetup(void)
    {
    	EALLOW;
    	/*CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0;*/
    	CpuSysRegs.PCLKCR0.bit.GTBCLKSYNC =0;
    
    	DevCfgRegs.CPUSPPT.CPEPWM1 =1;DevCfEL1.REG1.CEPf= 0
    	
    	
    	;DEPT.1= 0位= 0
    	DevCfgRegs.CPUSEL0.bit.EPWM7 = 1;
    	DevCfgRegs.CPUSEL0.bit.EPWM8 = 1;
    	EDIS;
    
    	pwm9setup();
    	pwm10setup();
    	pwm11setup();
    
    	EALLOW;
    	/*CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =1;*/
    	CpuSysRegs.PCLKCR0.bit.GTBCLKSYNC =1;
    	EDIS
    ;} 

    void pwmSetup(void)
    {/*
    	
    	EALLOW;
    	CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0;
    	EDIS;
    	*/
    
    	pwm1setup();
    	pwm2setup();
    	pwm3setup();
    	pwm6setup();
    	pwm7setup();
    	pwm8setup();
    
    	/*
    	EALLOW;
    	CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    	EDIS;
    	*/
    } 

    它不起作用:

    使用TBCLKSYNC和 GTBCLKSYNC可能有一些区别?

    注:ePWM1,ePWM2和ePWM3 - CPU2 ePWM。

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

    您好,Sasha,

    我相信您会希望有一个稍微修改的流程。 关键在于确保CPU1在CPU2完成其PWM配置(通常您会在此处释放TBCLKSYNC)之前不会释放GTBCLKSYNC。

    因此,您在CPU1上的流程将类似于:

    GTBCLKSYNC = 0;

    在CPU1上配置PWM

    waitForCpu2ReadySignal();//如果您不想挂起代码等待CPU2的IPC消息,也可以在IPC ISR中执行此步骤和以下步骤

    GTBCLKSYNC = 1;'

    在CPU2上,它只是:

    在CPU2上配置PWM

    sendReadySignalToCPU1 ();// IPC消息发送至CPU1

    此致,

    克里斯