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.

[参考译文] TMS320F28379D:计时器时序问题和未调用 PWM 中断

Guru**** 2540720 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1419302/tms320f28379d-timer-timing-issue-and-pwm-interrupt-not-being-called

器件型号:TMS320F28379D
Thread 中讨论的其他器件:C2000WARE

工具与软件:

尊敬的专家:

我正在尝试初始化计时器和 PWM。 第一个问题是正在调用计时器中断、但我看到存在计时问题。

以下是1秒计时器的计算结果:

SYSCLK:200MHz

   CpuTimer0Regs.PRD.bit.LSW = 0x2D00;
   CpuTimer0Regs.PRD.bit.MSW = 0x0131;
   CpuTimer0Regs.TPR.bit.tddr= 10;

其次、在 CTR = 0时启用的 PWM 中断并非全部被调用。

代码如下

#include "F28x_Project.h"

extern void InitSysCtrl(void);
extern void InitPieCtrl(void);
extern void InitPieVectTable(void);

interrupt void TimerOvf(void);
interrupt void PWM_Int(void);

void Initialize_GPIO(void);
void Initialize_PWM1(void);
void Custom_Init(void);
void timer0_init(void);
int pwm,b=0;
void main(void)
{

   InitSysCtrl();
   Custom_Init();
   DINT;
   Initialize_GPIO();
   Initialize_PWM1();
   InitPieCtrl();

   IER = 0x0000;
   IFR = 0x0000;
   InitPieCtrl();
   InitPieVectTable();

   EALLOW;
   PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
   PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

   PieVectTable.TIMER0_INT = &TimerOvf;
   PieVectTable.EPWM1_INT = &PWM_Int;
   PieCtrlRegs.PIECTRL.bit.ENPIE= 1;
   EDIS;

   IER |= 3;
   EINT;  // Enable Global interrupt INTM
   ERTM;  // Enable Global realtime interrupt DBGM
   timer0_init();
   CpuTimer0Regs.TCR.bit.TSS=0;
   while(1)
       {


        }
}
void Initialize_GPIO(void)
{
    EALLOW;
    GpioCtrlRegs.GPBDIR.bit.GPIO62 = 1;
    GpioCtrlRegs.GPCDIR.bit.GPIO73= 1;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; //EPwm1
    EDIS;

}
void Custom_Init(void)
{
    EALLOW;
    ClkCfgRegs.AUXPLLMULT.bit.IMULT=20;
    ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV=0;
    ClkCfgRegs.SYSPLLCTL1.bit.PLLCLKEN = 1;
    ClkCfgRegs.LOSPCP.bit.LSPCLKDIV = 2;
    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;   ///source initsysctrl
    CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;
    DevCfgRegs.CPUSEL0.bit.EPWM1 = 0;
    EDIS;
}

void Initialize_PWM1(void)
{
      EPwm1Regs.TBCTL.bit.CTRMODE = 0;             // Count up
      EPwm1Regs.TBPRD = 10000;                    // Set timer period
      EPwm1Regs.TBCTL.bit.PHSEN = 0;               // Disable phase loading
      EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;          // Phase is 0
      EPwm1Regs.TBCTR = 0x0000;                    // Clear counter
      EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;           // Clock ratio to SYSCLKOUT
      EPwm1Regs.TBCTL.bit.CLKDIV = 0;
      EPwm1Regs.TBCTL.bit.SYNCOSEL = 1;            // SYNC output on CTR = 0
      // Setup shadow register load on ZERO
      EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0;
      EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0;
      EPwm1Regs.CMPCTL.bit.LOADAMODE = 0;
      EPwm1Regs.CMPCTL.bit.LOADBMODE = 0;
      // Set Compare values
      EPwm1Regs.CMPA.bit.CMPA = 10000/2;      // Set compare A value
      // Set actions
      EPwm1Regs.AQCTLA.bit.ZRO = 2;                // Set PWM1A on Zero
      EPwm1Regs.AQCTLA.bit.CAU = 1;                // Clear PWM1A on event A, up count
      //interrput enable
      EPwm1Regs.ETSEL.bit.INTSEL = 1; //@ CTR = 0
      EPwm1Regs.ETSEL.bit.INTEN = 1;

}
void timer0_init(void)
{
    EALLOW;
    CpuTimer0Regs.PRD.bit.LSW = 0x2D00;
    CpuTimer0Regs.PRD.bit.MSW = 0x0131;
    CpuTimer0Regs.TPR.bit.TDDR= 10;

    CpuTimer0Regs.TCR.bit.TIE= 1;
    CpuTimer0Regs.TCR.bit.TSS=1;
    CpuTimer0Regs.TCR.bit.FREE=0;
    CpuTimer0Regs.TCR.bit.TRB=0;
    EDIS;
}
void TimerOvf(void)
{
    b= b+1;
    if(b>10)
    {
        b=0;
    }
    GpioDataRegs.GPBTOGGLE.bit.GPIO62=1;
    CpuTimer0Regs.TCR.bit.TIF = 1;

    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

void PWM_Int(void)
{
    pwm = pwm+1;
    if(pwm>10)
    {pwm =0;}
    GpioDataRegs.GPCTOGGLE.bit.GPIO73 = 1;
 //   EPwm1Regs.ETCLR.bit.INT = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}

提前感谢!

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

    您好!

    澄清一下、如果您在 PWM 中断中设置了一个断点、该断点根本就没有被命中、对吗? 程序是在代码中的另一个点暂停还是根本卡在计时器 ISR 中? 当您运行它时会发生什么情况?

    我还想先问一下您是否已经参考了我们的 C2000Ware 示例? 软件示例(在以下两个位置目录中)展示了如何设置中断(提供了 ePWM 示例、计时器示例和中断示例)。 这些内容有助于验证外设配置和中断设置。 如果 PWM 中断根本没有命中、那么 CPU 会卡在其他地方、或者中断配置或 PWM 配置可能不正确。

    • {C2000Ware}\driverlib\f2837xd\examples\cpu1\
    • {C2000Ware}\device_support\f2837xd\examples\cpu1

    此致、

    Allison

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

    我在启用几位后自行解决了它。 谢谢!