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.

[参考译文] LAUNCHXL-F28379D:双核 PWM 跳闸

Guru**** 2524550 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/797857/launchxl-f28379d-dual-core-pwm-trip

器件型号:LAUNCHXL-F28379D

您好!

我的目标是能够强制所有 PWM 的输出从任一内核进入低电平状态。  对于一个内核、这涉及使用通过 XBAR 输入1连接到 PWM 的单触发区的 GPIO 引脚。  这很好、可以在跳闸区域示例代码中找到。  但是、我不确定能够通过哪一个内核触发 PWM 的方法。

我当前使用的不成功的方法是在 CPU1上初始化 XBAR 和 PWM 触发器。  CPU2可控制 GPIO 引脚。  如果 CPU2需要使 PWM 跳闸、它将直接控制连接 XBAR 的 GPIO。  如果 CPU1需要使 PWM 跳闸、则会将其配置为发出 IPC 标志、从而导致 CPU2中断并直接控制 XBAR 连接的 GPIO。

下面是 CPU1用于初始化 PWM、XBAR 和触发器的 main()代码:

EALLOW;

GPIO_setPadConfig (32、GPIO_PIN_TYPE_STD);
GPIO_setDirectionMode (32、GPIO_DIR_MODE_OUT);
GPIO_setMasterCore (32、GPIO_CORE_CPU2);

InputXbarRegs.INPUT1SELECT = 32;

EPwm1Regs.TZSEL.bit.OSHT1 = 1;
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm2Regs.TZSEL.bit.OSHT1 = 1;
EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm3Regs.TZSEL.bit.OSHT1 = 1;
EPwm3Regs.TZCTL.bit.TZA = TZ_FORCE_LO;

EDIS;

CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;
CpuSysRegs.PCLKCR2.bit.EPWM2 = 1;
CpuSysRegs.PCLKCR2.bit.EPWM3 = 1;
InitEPwmGpio();

EALLOW;
EPwm1Regs.TZCLR.bit.OST = 1;
EPwm1Regs.TZCLR.bit.INT = 1;
EPwm2Regs.TZCLR.bit.OST = 1;
EPwm2Regs.TZCLR.bit.INT = 1;
EPwm3Regs.TZCLR.bit.OST = 1;
EPwm3Regs.TZCLR.bit.INT = 1;
EDIS; 

该代码位于 CPU1上的8kHz 计时器中断中、用于在4秒后从 CPU2请求触发:

静态 int debugCount = 0;
debugCount++;
if (debugCount >= 32000)
{
HWREG (IPC_BASE + IPC_O_SET)= 1UL << IPC_TRIGGER_FAULT;
} 

以下内容位于 CPU2上的 main()中,用于初始化 IPC 中断:

EALLOW;
PieVectTable.IPC0_INT =&FaultTrigger;
EDIS;

//启用连接到 Upper PIE IPC INT0-3的 CPU INT1:
IER |= M_INT1;

//在 PIE:组11中断中启用 CPU01到 CPU02 INTn
PieCtrlRegs.PIEIER1.bit.INTx13 = 1;// CPU1至 CPU2 INT0 

最后、这是 IPC ISR:

_interrupt void FaultTrigger (void)
{
EALLOW;
GpioDataRegs.GPBCLEAR.bit.GPIO32 = 1;//用于触发触发
GpioDataRegs.GPBSET.BIO32 = 1;
EDIS;

//清除 IPC 标志
HWREG (IPC_BASE + IPC_O_CLR)= 1UL << IPC_TRIGGER_FAULT;

//确认 IPC INT0标志和 PIE 以接收更多中断
IpcRegs.IPCACKbit.IPC0 = 1;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
} 

是否有一种更简单的方法可以使两个内核直接导致 CPU1上设置的 PWM 强制所有输出为低电平?

谢谢!

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

    您是否能够分别使用 CPU1和 CPU2控制的2个不同 IOS/XBAR 输入?
    这两个 PWM 都可以配置为所有 PWM 中的跳闸源-这样一来、任一 CPU 都可以通过控制相应 CPU 所拥有的 IO 来跳闸所有 PWM。
    您还可以避免 IPC 和中断延迟。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、这是一个可能的选择!  但是、我很难初始化 TZ 子模块。  当我设置 TZ 时、似乎 OSHT 标志被设置、我似乎无法清除它。  导致寄存器不清零的原因是什么?  

    下面是我的更新初始化:

    EALLOW;
    (* ePWM[索引]).TZSEL.bit.OSHT1 = 1;
    (* ePWM[索引]).TZCTL.bit.TZA = TZ_FORCE_LO;
    (* ePWM[索引]).TZCTL.bit.TSB = TZ_FORCE_LO;
    (* ePWM[索引]).TZEINT.bit.OST = 1;
    (* ePWM[索引]).TZSEL.bit.OSHT2=1;
    (* ePWM[索引]).TZCLR.bit.OST = 1;
    (* ePWM[索引]).TZOSTCLR.bit.OST1 = 1; //这应清除 OST1标志
    (* ePWM[索引]).TZOSTCLR.bit.OST2 = 1; //这应清除 OST2标志
    (* ePWM[索引]).TZCLR.bit.INT = 1; //这应清除 TZ 中断 

    运行此代码后、ePWM 寄存器立即包含以下内容:

    下面是所有 TZ 寄存器的概述:

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

    我已使您的解决方案正常工作! 谢谢!  我的第一个问题是、当我将 GPIO 的控制权传递给 CPU2时、该引脚的数据寄存器将被清除、即使我在将控制权传递给 CPU2之前设置了该引脚也是如此。  解决此问题的方法是使用 IPC 标志让 CPU2知道何时需要设置 GPIO 引脚。  在两个 GPIO 都被置位后、跳闸区域子模块可在不跳闸的情况下被初始化。  我还确保在进行任何配置后启用 TZ 中断。  此外、该引脚必须为低电平、以便3*TBCLK 足以进行跳闸。

    TL;DR: 确保在配置跳闸区域模块之前设置了两个引脚、并且引脚变为低电平的时间足够长、可以触发跳闸。

    再次感谢!

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

    太棒了!

    是-跳闸输入 必须至少为3个 TBCLK 宽。
    此外、我同意您对 数据寄存器被清除的看法、即使数据寄存器是在将控制权传递给 CPU2之前设置的。  
    在传递 IO 控制之前、我还可以考虑从 CPU2向 GPDAT 寄存器写入1。
    这将在切换 CPU 所有权期间保持 IO 的状态为高电平。

    您可以将其作为 CPU2初始化代码的一部分来执行、并避开 IPC。