目前想要用cpu1用epwm3,同时adca到dacd的channel0采集信号(由epwm3SOCA触发,ADCINT1发送中断),作比较后根据情况触发cpu2的采样(adca到adcb的1通道,由epwm2SOCA触发,ADCINT2发送中断)和epwm2。
目前运行,每个pwm都是给定50%定值输出,给定的采样值也是让cpu2恒定触发采样和epwm2。cpu1的epwm3没有输出,但是由它触发的adca到adcd的零通道是有采集数据的。cpu2的epwm2没有输出,相应的adc1也没有采集。求助
cpu1的初始化配置的代码:
////////////////////////////////////////////////////////////
ConfigureADC();
EALLOW;
DevCfgRegs.CPUSEL0.bit.EPWM3 = 0;
EDIS;
SetupADCEpwm(0); //Setup the ADC for ePWM triggered conversions on channel 0
ledkeyInit(); //初始化led,注意,若使用pwm不能配置为led
EALLOW;
PieVectTable.ADCA1_INT = &adc_isr;
EDIS;
EALLOW;
CpuSysRegs.PCLKCR2.bit.EPWM3 = 1; //外围时钟门控寄存器
CpuSysRegs.PCLKCR13.bit.ADC_A = 1;//外围时钟门控寄存器
CpuSysRegs.PCLKCR13.bit.ADC_B = 1;//外围时钟门控寄存器
CpuSysRegs.PCLKCR13.bit.ADC_C = 1;//外围时钟门控寄存器
CpuSysRegs.PCLKCR13.bit.ADC_D = 1;//外围时钟门控寄存器
EDIS;
EALLOW;
CpuSysRegs.PCLKCR0.bit.GTBCLKSYNC = 0;
EDIS;
ConfigureEPWM3(); //驱动cpu1的
ConfigureEPWM2(); //驱动cpu2的
EALLOW;
DevCfgRegs.CPUSEL0.bit.EPWM2 = 1;
EDIS;
IPCLtoRFlagSet(IPC_FLAG17);
while(IPCLtoRFlagBusy(IPC_FLAG17));
EALLOW;
CpuSysRegs.PCLKCR0.bit.GTBCLKSYNC = 1;//全核心pwm时钟同步
EDIS;
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
IER |= M_INT1;
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
////////////////////////////////////////////////////////////
cpu2的初始化代码:
////////////////////////////////////////////////////////////
PieVectTable.IPC0_INT = &CPU01toCPU02IPC0_ISR;
// PieVectTable.EPWM1_INT = &epwm1_isr;
PieVectTable.ADCA2_INT = &adc_isr;
EDIS; // ISR functions found within this file.
ConfigureADC();
EALLOW;
CpuSysRegs.PCLKCR0.bit.GTBCLKSYNC = 0;//外围时钟门控寄存器 EPWM1时基时钟同步
EDIS;
SetupADCEpwmSC(1); //没设置触发源,IPC来之后设置
while(!IPCRtoLFlagBusy(IPC_FLAG17));
CpuSysRegs.PCLKCR2.bit.EPWM2 = 1;
IPCRtoLFlagAcknowledge(IPC_FLAG17);
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
//PieCtrlRegs.PIEIER1.bit.INTx1 = 1; //使能第一组中断中第一个小中断
PieCtrlRegs.PIEIER10.bit.INTx2 = 1; //使能第一组中断中第一个小中断
PieCtrlRegs.PIEIER1.bit.INTx13 = 1; // CPU1 to CPU2 INT0,两者都用INT0寄存器一样
IER |= M_INT1;
IER |=M_INT10;
EINT;
ERTM;
while(1)
{
//if(IPCRtoLFlagBusy(IPC_FLAG10) == 1)
if(dischargeflag == 1) //dischargeflag是通过cpu1通过shared ram发给cpu2(借助ipc0)的,确实是发过去的,也就是再测试时dischargeflag=0恒成立
{
//IPCRtoLFlagAcknowledge (IPC_FLAG10);
/*************************************启动adc******************************
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 7; //trigger on ePWM2 SOCA
AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 7; //trigger on ePWM2 SOCA
/*********** 是否需要等待adc中断执行后再下一步?********************/
while(AdcbRegs.ADCINTFLG.bit.ADCINT2==0);//////////////////////////////////////////////////////此时cpu2一直停在这里,adc配置失败????
while(AdcbRegs.ADCINTFLG.bit.ADCINT2==1);
////////////////////////////////////////////////////////////