您好!
我的目标是能够强制所有 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 强制所有输出为低电平?
谢谢!