TI中文支持网
TI专业的中文技术问题搜集分享网站

28377D 中AD采样的奇怪问题

我在调试28377D的过程中遇到了奇怪的问题,描述如下:

1。ADC正常配置,使用了ABCD四路AD,在自制控制板(未接底板)时正常采样,且调试时刷新正常;但接上底板后,采样不正常,A通道有两个数值闪烁,其他通道多数值不变(已经测量控制板上AD的参考电压,各通道输入电压正常)。

2。上述情况中,A通道的采样结果仍然对不上。以上均由CPU1完成;CPU2基本无内容,仅初始化。但问题来了,偶然间发现,CPU1正常运行中,将CPU2编译烧写程序后载入,虽然会有Error setting the GSxMSEL register for Flash operations的错误,但是此时CPU1暂停并继续后,AD采样的数值就都正常了!!但另外一个问题,此时跑马灯闪烁的频率明显比原来小了十几倍。

求救啊,能否明示一下哪里有问题。

下面是CPU1的main

#include "F28x_Project.h"
#include "math.h"
#include "F2837xD_Ipc_drivers.h"
#include "Global_declaration.h"
#include "SR_struct.h"
#include "SR_MASTER_CPU1.h"
#include "control.h"

#pragma CODE_SECTION(TIMER2_ISR,"ramfuncs");
#pragma CODE_SECTION(SCID_RX_ISR,"ramfuncs");

void MemCopy(uint16_t *SourceAddr, uint16_t* SourceEndAddr, uint16_t* DestAddr)
{
while(SourceAddr < SourceEndAddr)
{
*DestAddr++ = *SourceAddr++;
}
return;
}

extern struct SR_MASTER_CPU2 *ptr_m_2;
Uint16 test = 0;
Uint16 test1 = 0;
Uint16 test2[5] = {0,0,0,0,0};

void main(void)
{
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitSysCtrl();
InitFlash();

// IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
InitGpio();

DINT;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

while( !MemCfgRegs.GSxMSEL.bit.MSEL_GS3)
{
EALLOW;
MemCfgRegs.GSxMSEL.bit.MSEL_GS3 = 1;
EDIS;
}

EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TIMER2_INT = &TIMER2_ISR;
// PieVectTable.SCID_RX_INT = &SCID_RX_ISR;
PieVectTable.EPWM1_INT = &EPWM1_ISR;
EDIS; // This is needed to disable write to EALLOW protected registers

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

// InitSci();
InitCpuTimers();
InitAdc();

InitEpwm();
Epwm1ONorOFF(0);
Epwm2ONorOFF(0);
Epwm7ONorOFF(0);
Epwm8ONorOFF(0);

EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; //sync the epwm counter
EDIS;

// EALLOW;
// DevCfgRegs.CPUSEL0.bit.EPWM1 = 1;//connect to CPU2
// DevCfgRegs.CPUSEL0.bit.EPWM2 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM3 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM4 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM5 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM6 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM7 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM8 = 1;
// DevCfgRegs.CPUSEL5.bit.SCI_A = 1;
// DevCfgRegs.CPUSEL11.bit.ADC_A = 1;//connect to CPU2
// DevCfgRegs.CPUSEL11.bit.ADC_B = 1;
// DevCfgRegs.CPUSEL11.bit.ADC_C = 1;
// DevCfgRegs.CPUSEL11.bit.ADC_D = 1;
// EDIS;

ConfigCpuTimer(&CpuTimer2, 200, 100);
CpuTimer2Regs.TCR.all = 0x4000;

IER |= M_INT14; //timer2
IER |= M_INT3; //EPWM1
//IER |= M_INT8;

//PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
//PieCtrlRegs.PIEIER8.bit.INTx7 = 1;

// SR_M_1_Init();

asm(" NOP"); //

EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM

for(;;)
{

DELAY_US(1000000);
test = test + 1;
test1 = test – test/5*5;
if(test1 == 0){
test2[0] = 1 – test2[0];
GPIO_WritePin(bLED5, test2[0]);
}
else if(test1 == 1){
test2[1] = 1 – test2[1];
GPIO_WritePin(bLED6, test2[1]);
}
else if(test1 == 2){
test2[2] = 1 – test2[2];
GPIO_WritePin(bLED7, test2[2]);
}
else if(test1 == 3){
test2[3] = 1 – test2[3];
GPIO_WritePin(bLED8, test2[3]);
}
else{
test2[4] = 1 – test2[4];
GPIO_WritePin(bLED9, test2[4]);
}

AdcaRegs.ADCSOCFRC1.all = 0x003F; //SOC0-SOC5
AdcbRegs.ADCSOCFRC1.all = 0x003F; //SOC0-SOC5
AdccRegs.ADCSOCFRC1.all = 0x003C; //SOC2-SOC5
AdcdRegs.ADCSOCFRC1.all = 0x003F; //SOC0-SOC5

while(AdcaRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
while(AdcbRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
while(AdccRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdccRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
while(AdcdRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

// DELAY_US(10);
sample();

}
}

下面是CPU2的MAIN

#include "F28x_Project.h"
#include "Global_declaration.h"
#include "math.h"
#include "stdio.h"
#include "control.h"
#include "SR_struct.h"
#include "SR_MASTER_CPU1.h"

//#pragma CODE_SECTION(epwm1_Isr,"ramfuncs");

void MemCopy(uint16_t *SourceAddr, uint16_t* SourceEndAddr, uint16_t* DestAddr)
{
while(SourceAddr < SourceEndAddr)
{
*DestAddr++ = *SourceAddr++;
}
return;
}

extern struct SR_MASTER_CPU1 *ptr_m_1;

//Main
void main(void)
{

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitSysCtrl();
InitFlash();
// SR_M_2_Init();

// CpuTimer0Regs.TCR.all = 0x4000;

DINT;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

while(!MemCfgRegs.GSxMSEL.bit.MSEL_GS3)
{
}
// while(!MemCfgRegs.GSxMSEL.bit.MSEL_GS0)
// {
// }

// EALLOW; // This is needed to write to EALLOW protected registers
//// PieVectTable.TIMER0_INT = &cpu_timer0_isr;
//// PieVectTable.SPIA_RX_INT = &spiaRxFifoIsr;
//// PieVectTable.*** = &***;
//// PieVectTable.EPWM1_INT = &epwm1_Isr;
// EDIS; // This is needed to disable write to EALLOW protected registers
//Power up the PWM and ADC
// EALLOW;
// CpuSysRegs.PCLKCR2.bit.EPWM1=1;
// CpuSysRegs.PCLKCR2.bit.EPWM2=1;
// CpuSysRegs.PCLKCR2.bit.EPWM3=1;
// CpuSysRegs.PCLKCR2.bit.EPWM4=1;
// CpuSysRegs.PCLKCR2.bit.EPWM5=1;
// CpuSysRegs.PCLKCR2.bit.EPWM6=1;
// CpuSysRegs.PCLKCR2.bit.EPWM7=1;
// CpuSysRegs.PCLKCR2.bit.EPWM8=1;
// CpuSysRegs.PCLKCR7.bit.SCI_A=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;

// GPIO_WritePin(58, 1);
// GPIO_WritePin(168, 0);
// EALLOW;
// CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;
// EDIS;
//
//// InitAdc();
//// InitEpwm();
//// InitSci();
//// InitCpuTimers();
//// ConfigCpuTimer(&CpuTimer0, 200, 10);
//// CpuTimer0Regs.TCR.all = 0x4000;
// EALLOW;
// CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
// EDIS;
// IER |= M_INT3;
// PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM

for(;;)
{

// GPIO_WritePin(14, 0);
}
}

Susan Yang:

请问您所说的 “ 自制控制板(未接底板)”具体是什么底板?您现在是两个核都用了?

我在调试28377D的过程中遇到了奇怪的问题,描述如下:

1。ADC正常配置,使用了ABCD四路AD,在自制控制板(未接底板)时正常采样,且调试时刷新正常;但接上底板后,采样不正常,A通道有两个数值闪烁,其他通道多数值不变(已经测量控制板上AD的参考电压,各通道输入电压正常)。

2。上述情况中,A通道的采样结果仍然对不上。以上均由CPU1完成;CPU2基本无内容,仅初始化。但问题来了,偶然间发现,CPU1正常运行中,将CPU2编译烧写程序后载入,虽然会有Error setting the GSxMSEL register for Flash operations的错误,但是此时CPU1暂停并继续后,AD采样的数值就都正常了!!但另外一个问题,此时跑马灯闪烁的频率明显比原来小了十几倍。

求救啊,能否明示一下哪里有问题。

下面是CPU1的main

#include "F28x_Project.h"
#include "math.h"
#include "F2837xD_Ipc_drivers.h"
#include "Global_declaration.h"
#include "SR_struct.h"
#include "SR_MASTER_CPU1.h"
#include "control.h"

#pragma CODE_SECTION(TIMER2_ISR,"ramfuncs");
#pragma CODE_SECTION(SCID_RX_ISR,"ramfuncs");

void MemCopy(uint16_t *SourceAddr, uint16_t* SourceEndAddr, uint16_t* DestAddr)
{
while(SourceAddr < SourceEndAddr)
{
*DestAddr++ = *SourceAddr++;
}
return;
}

extern struct SR_MASTER_CPU2 *ptr_m_2;
Uint16 test = 0;
Uint16 test1 = 0;
Uint16 test2[5] = {0,0,0,0,0};

void main(void)
{
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitSysCtrl();
InitFlash();

// IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
InitGpio();

DINT;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

while( !MemCfgRegs.GSxMSEL.bit.MSEL_GS3)
{
EALLOW;
MemCfgRegs.GSxMSEL.bit.MSEL_GS3 = 1;
EDIS;
}

EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TIMER2_INT = &TIMER2_ISR;
// PieVectTable.SCID_RX_INT = &SCID_RX_ISR;
PieVectTable.EPWM1_INT = &EPWM1_ISR;
EDIS; // This is needed to disable write to EALLOW protected registers

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

// InitSci();
InitCpuTimers();
InitAdc();

InitEpwm();
Epwm1ONorOFF(0);
Epwm2ONorOFF(0);
Epwm7ONorOFF(0);
Epwm8ONorOFF(0);

EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; //sync the epwm counter
EDIS;

// EALLOW;
// DevCfgRegs.CPUSEL0.bit.EPWM1 = 1;//connect to CPU2
// DevCfgRegs.CPUSEL0.bit.EPWM2 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM3 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM4 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM5 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM6 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM7 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM8 = 1;
// DevCfgRegs.CPUSEL5.bit.SCI_A = 1;
// DevCfgRegs.CPUSEL11.bit.ADC_A = 1;//connect to CPU2
// DevCfgRegs.CPUSEL11.bit.ADC_B = 1;
// DevCfgRegs.CPUSEL11.bit.ADC_C = 1;
// DevCfgRegs.CPUSEL11.bit.ADC_D = 1;
// EDIS;

ConfigCpuTimer(&CpuTimer2, 200, 100);
CpuTimer2Regs.TCR.all = 0x4000;

IER |= M_INT14; //timer2
IER |= M_INT3; //EPWM1
//IER |= M_INT8;

//PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
//PieCtrlRegs.PIEIER8.bit.INTx7 = 1;

// SR_M_1_Init();

asm(" NOP"); //

EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM

for(;;)
{

DELAY_US(1000000);
test = test + 1;
test1 = test – test/5*5;
if(test1 == 0){
test2[0] = 1 – test2[0];
GPIO_WritePin(bLED5, test2[0]);
}
else if(test1 == 1){
test2[1] = 1 – test2[1];
GPIO_WritePin(bLED6, test2[1]);
}
else if(test1 == 2){
test2[2] = 1 – test2[2];
GPIO_WritePin(bLED7, test2[2]);
}
else if(test1 == 3){
test2[3] = 1 – test2[3];
GPIO_WritePin(bLED8, test2[3]);
}
else{
test2[4] = 1 – test2[4];
GPIO_WritePin(bLED9, test2[4]);
}

AdcaRegs.ADCSOCFRC1.all = 0x003F; //SOC0-SOC5
AdcbRegs.ADCSOCFRC1.all = 0x003F; //SOC0-SOC5
AdccRegs.ADCSOCFRC1.all = 0x003C; //SOC2-SOC5
AdcdRegs.ADCSOCFRC1.all = 0x003F; //SOC0-SOC5

while(AdcaRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
while(AdcbRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
while(AdccRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdccRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
while(AdcdRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

// DELAY_US(10);
sample();

}
}

下面是CPU2的MAIN

#include "F28x_Project.h"
#include "Global_declaration.h"
#include "math.h"
#include "stdio.h"
#include "control.h"
#include "SR_struct.h"
#include "SR_MASTER_CPU1.h"

//#pragma CODE_SECTION(epwm1_Isr,"ramfuncs");

void MemCopy(uint16_t *SourceAddr, uint16_t* SourceEndAddr, uint16_t* DestAddr)
{
while(SourceAddr < SourceEndAddr)
{
*DestAddr++ = *SourceAddr++;
}
return;
}

extern struct SR_MASTER_CPU1 *ptr_m_1;

//Main
void main(void)
{

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitSysCtrl();
InitFlash();
// SR_M_2_Init();

// CpuTimer0Regs.TCR.all = 0x4000;

DINT;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

while(!MemCfgRegs.GSxMSEL.bit.MSEL_GS3)
{
}
// while(!MemCfgRegs.GSxMSEL.bit.MSEL_GS0)
// {
// }

// EALLOW; // This is needed to write to EALLOW protected registers
//// PieVectTable.TIMER0_INT = &cpu_timer0_isr;
//// PieVectTable.SPIA_RX_INT = &spiaRxFifoIsr;
//// PieVectTable.*** = &***;
//// PieVectTable.EPWM1_INT = &epwm1_Isr;
// EDIS; // This is needed to disable write to EALLOW protected registers
//Power up the PWM and ADC
// EALLOW;
// CpuSysRegs.PCLKCR2.bit.EPWM1=1;
// CpuSysRegs.PCLKCR2.bit.EPWM2=1;
// CpuSysRegs.PCLKCR2.bit.EPWM3=1;
// CpuSysRegs.PCLKCR2.bit.EPWM4=1;
// CpuSysRegs.PCLKCR2.bit.EPWM5=1;
// CpuSysRegs.PCLKCR2.bit.EPWM6=1;
// CpuSysRegs.PCLKCR2.bit.EPWM7=1;
// CpuSysRegs.PCLKCR2.bit.EPWM8=1;
// CpuSysRegs.PCLKCR7.bit.SCI_A=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;

// GPIO_WritePin(58, 1);
// GPIO_WritePin(168, 0);
// EALLOW;
// CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;
// EDIS;
//
//// InitAdc();
//// InitEpwm();
//// InitSci();
//// InitCpuTimers();
//// ConfigCpuTimer(&CpuTimer0, 200, 10);
//// CpuTimer0Regs.TCR.all = 0x4000;
// EALLOW;
// CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
// EDIS;
// IER |= M_INT3;
// PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM

for(;;)
{

// GPIO_WritePin(14, 0);
}
}

Qiang Chen:

回复 Susan Yang:

HDSP-CORE28377D原理图.pdf

如附件,一个是核心板原理图,一个是底板缩图,就是一些电压电流采样,DIO之类的

我在调试28377D的过程中遇到了奇怪的问题,描述如下:

1。ADC正常配置,使用了ABCD四路AD,在自制控制板(未接底板)时正常采样,且调试时刷新正常;但接上底板后,采样不正常,A通道有两个数值闪烁,其他通道多数值不变(已经测量控制板上AD的参考电压,各通道输入电压正常)。

2。上述情况中,A通道的采样结果仍然对不上。以上均由CPU1完成;CPU2基本无内容,仅初始化。但问题来了,偶然间发现,CPU1正常运行中,将CPU2编译烧写程序后载入,虽然会有Error setting the GSxMSEL register for Flash operations的错误,但是此时CPU1暂停并继续后,AD采样的数值就都正常了!!但另外一个问题,此时跑马灯闪烁的频率明显比原来小了十几倍。

求救啊,能否明示一下哪里有问题。

下面是CPU1的main

#include "F28x_Project.h"
#include "math.h"
#include "F2837xD_Ipc_drivers.h"
#include "Global_declaration.h"
#include "SR_struct.h"
#include "SR_MASTER_CPU1.h"
#include "control.h"

#pragma CODE_SECTION(TIMER2_ISR,"ramfuncs");
#pragma CODE_SECTION(SCID_RX_ISR,"ramfuncs");

void MemCopy(uint16_t *SourceAddr, uint16_t* SourceEndAddr, uint16_t* DestAddr)
{
while(SourceAddr < SourceEndAddr)
{
*DestAddr++ = *SourceAddr++;
}
return;
}

extern struct SR_MASTER_CPU2 *ptr_m_2;
Uint16 test = 0;
Uint16 test1 = 0;
Uint16 test2[5] = {0,0,0,0,0};

void main(void)
{
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitSysCtrl();
InitFlash();

// IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
InitGpio();

DINT;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

while( !MemCfgRegs.GSxMSEL.bit.MSEL_GS3)
{
EALLOW;
MemCfgRegs.GSxMSEL.bit.MSEL_GS3 = 1;
EDIS;
}

EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TIMER2_INT = &TIMER2_ISR;
// PieVectTable.SCID_RX_INT = &SCID_RX_ISR;
PieVectTable.EPWM1_INT = &EPWM1_ISR;
EDIS; // This is needed to disable write to EALLOW protected registers

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

// InitSci();
InitCpuTimers();
InitAdc();

InitEpwm();
Epwm1ONorOFF(0);
Epwm2ONorOFF(0);
Epwm7ONorOFF(0);
Epwm8ONorOFF(0);

EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; //sync the epwm counter
EDIS;

// EALLOW;
// DevCfgRegs.CPUSEL0.bit.EPWM1 = 1;//connect to CPU2
// DevCfgRegs.CPUSEL0.bit.EPWM2 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM3 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM4 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM5 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM6 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM7 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM8 = 1;
// DevCfgRegs.CPUSEL5.bit.SCI_A = 1;
// DevCfgRegs.CPUSEL11.bit.ADC_A = 1;//connect to CPU2
// DevCfgRegs.CPUSEL11.bit.ADC_B = 1;
// DevCfgRegs.CPUSEL11.bit.ADC_C = 1;
// DevCfgRegs.CPUSEL11.bit.ADC_D = 1;
// EDIS;

ConfigCpuTimer(&CpuTimer2, 200, 100);
CpuTimer2Regs.TCR.all = 0x4000;

IER |= M_INT14; //timer2
IER |= M_INT3; //EPWM1
//IER |= M_INT8;

//PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
//PieCtrlRegs.PIEIER8.bit.INTx7 = 1;

// SR_M_1_Init();

asm(" NOP"); //

EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM

for(;;)
{

DELAY_US(1000000);
test = test + 1;
test1 = test – test/5*5;
if(test1 == 0){
test2[0] = 1 – test2[0];
GPIO_WritePin(bLED5, test2[0]);
}
else if(test1 == 1){
test2[1] = 1 – test2[1];
GPIO_WritePin(bLED6, test2[1]);
}
else if(test1 == 2){
test2[2] = 1 – test2[2];
GPIO_WritePin(bLED7, test2[2]);
}
else if(test1 == 3){
test2[3] = 1 – test2[3];
GPIO_WritePin(bLED8, test2[3]);
}
else{
test2[4] = 1 – test2[4];
GPIO_WritePin(bLED9, test2[4]);
}

AdcaRegs.ADCSOCFRC1.all = 0x003F; //SOC0-SOC5
AdcbRegs.ADCSOCFRC1.all = 0x003F; //SOC0-SOC5
AdccRegs.ADCSOCFRC1.all = 0x003C; //SOC2-SOC5
AdcdRegs.ADCSOCFRC1.all = 0x003F; //SOC0-SOC5

while(AdcaRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
while(AdcbRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
while(AdccRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdccRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
while(AdcdRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

// DELAY_US(10);
sample();

}
}

下面是CPU2的MAIN

#include "F28x_Project.h"
#include "Global_declaration.h"
#include "math.h"
#include "stdio.h"
#include "control.h"
#include "SR_struct.h"
#include "SR_MASTER_CPU1.h"

//#pragma CODE_SECTION(epwm1_Isr,"ramfuncs");

void MemCopy(uint16_t *SourceAddr, uint16_t* SourceEndAddr, uint16_t* DestAddr)
{
while(SourceAddr < SourceEndAddr)
{
*DestAddr++ = *SourceAddr++;
}
return;
}

extern struct SR_MASTER_CPU1 *ptr_m_1;

//Main
void main(void)
{

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitSysCtrl();
InitFlash();
// SR_M_2_Init();

// CpuTimer0Regs.TCR.all = 0x4000;

DINT;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

while(!MemCfgRegs.GSxMSEL.bit.MSEL_GS3)
{
}
// while(!MemCfgRegs.GSxMSEL.bit.MSEL_GS0)
// {
// }

// EALLOW; // This is needed to write to EALLOW protected registers
//// PieVectTable.TIMER0_INT = &cpu_timer0_isr;
//// PieVectTable.SPIA_RX_INT = &spiaRxFifoIsr;
//// PieVectTable.*** = &***;
//// PieVectTable.EPWM1_INT = &epwm1_Isr;
// EDIS; // This is needed to disable write to EALLOW protected registers
//Power up the PWM and ADC
// EALLOW;
// CpuSysRegs.PCLKCR2.bit.EPWM1=1;
// CpuSysRegs.PCLKCR2.bit.EPWM2=1;
// CpuSysRegs.PCLKCR2.bit.EPWM3=1;
// CpuSysRegs.PCLKCR2.bit.EPWM4=1;
// CpuSysRegs.PCLKCR2.bit.EPWM5=1;
// CpuSysRegs.PCLKCR2.bit.EPWM6=1;
// CpuSysRegs.PCLKCR2.bit.EPWM7=1;
// CpuSysRegs.PCLKCR2.bit.EPWM8=1;
// CpuSysRegs.PCLKCR7.bit.SCI_A=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;

// GPIO_WritePin(58, 1);
// GPIO_WritePin(168, 0);
// EALLOW;
// CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;
// EDIS;
//
//// InitAdc();
//// InitEpwm();
//// InitSci();
//// InitCpuTimers();
//// ConfigCpuTimer(&CpuTimer0, 200, 10);
//// CpuTimer0Regs.TCR.all = 0x4000;
// EALLOW;
// CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
// EDIS;
// IER |= M_INT3;
// PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM

for(;;)
{

// GPIO_WritePin(14, 0);
}
}

Qiang Chen:

回复 Qiang Chen:

这是底板缩略图

我在调试28377D的过程中遇到了奇怪的问题,描述如下:

1。ADC正常配置,使用了ABCD四路AD,在自制控制板(未接底板)时正常采样,且调试时刷新正常;但接上底板后,采样不正常,A通道有两个数值闪烁,其他通道多数值不变(已经测量控制板上AD的参考电压,各通道输入电压正常)。

2。上述情况中,A通道的采样结果仍然对不上。以上均由CPU1完成;CPU2基本无内容,仅初始化。但问题来了,偶然间发现,CPU1正常运行中,将CPU2编译烧写程序后载入,虽然会有Error setting the GSxMSEL register for Flash operations的错误,但是此时CPU1暂停并继续后,AD采样的数值就都正常了!!但另外一个问题,此时跑马灯闪烁的频率明显比原来小了十几倍。

求救啊,能否明示一下哪里有问题。

下面是CPU1的main

#include "F28x_Project.h"
#include "math.h"
#include "F2837xD_Ipc_drivers.h"
#include "Global_declaration.h"
#include "SR_struct.h"
#include "SR_MASTER_CPU1.h"
#include "control.h"

#pragma CODE_SECTION(TIMER2_ISR,"ramfuncs");
#pragma CODE_SECTION(SCID_RX_ISR,"ramfuncs");

void MemCopy(uint16_t *SourceAddr, uint16_t* SourceEndAddr, uint16_t* DestAddr)
{
while(SourceAddr < SourceEndAddr)
{
*DestAddr++ = *SourceAddr++;
}
return;
}

extern struct SR_MASTER_CPU2 *ptr_m_2;
Uint16 test = 0;
Uint16 test1 = 0;
Uint16 test2[5] = {0,0,0,0,0};

void main(void)
{
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitSysCtrl();
InitFlash();

// IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
InitGpio();

DINT;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

while( !MemCfgRegs.GSxMSEL.bit.MSEL_GS3)
{
EALLOW;
MemCfgRegs.GSxMSEL.bit.MSEL_GS3 = 1;
EDIS;
}

EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TIMER2_INT = &TIMER2_ISR;
// PieVectTable.SCID_RX_INT = &SCID_RX_ISR;
PieVectTable.EPWM1_INT = &EPWM1_ISR;
EDIS; // This is needed to disable write to EALLOW protected registers

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

// InitSci();
InitCpuTimers();
InitAdc();

InitEpwm();
Epwm1ONorOFF(0);
Epwm2ONorOFF(0);
Epwm7ONorOFF(0);
Epwm8ONorOFF(0);

EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; //sync the epwm counter
EDIS;

// EALLOW;
// DevCfgRegs.CPUSEL0.bit.EPWM1 = 1;//connect to CPU2
// DevCfgRegs.CPUSEL0.bit.EPWM2 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM3 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM4 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM5 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM6 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM7 = 1;
// DevCfgRegs.CPUSEL0.bit.EPWM8 = 1;
// DevCfgRegs.CPUSEL5.bit.SCI_A = 1;
// DevCfgRegs.CPUSEL11.bit.ADC_A = 1;//connect to CPU2
// DevCfgRegs.CPUSEL11.bit.ADC_B = 1;
// DevCfgRegs.CPUSEL11.bit.ADC_C = 1;
// DevCfgRegs.CPUSEL11.bit.ADC_D = 1;
// EDIS;

ConfigCpuTimer(&CpuTimer2, 200, 100);
CpuTimer2Regs.TCR.all = 0x4000;

IER |= M_INT14; //timer2
IER |= M_INT3; //EPWM1
//IER |= M_INT8;

//PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
//PieCtrlRegs.PIEIER8.bit.INTx7 = 1;

// SR_M_1_Init();

asm(" NOP"); //

EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM

for(;;)
{

DELAY_US(1000000);
test = test + 1;
test1 = test – test/5*5;
if(test1 == 0){
test2[0] = 1 – test2[0];
GPIO_WritePin(bLED5, test2[0]);
}
else if(test1 == 1){
test2[1] = 1 – test2[1];
GPIO_WritePin(bLED6, test2[1]);
}
else if(test1 == 2){
test2[2] = 1 – test2[2];
GPIO_WritePin(bLED7, test2[2]);
}
else if(test1 == 3){
test2[3] = 1 – test2[3];
GPIO_WritePin(bLED8, test2[3]);
}
else{
test2[4] = 1 – test2[4];
GPIO_WritePin(bLED9, test2[4]);
}

AdcaRegs.ADCSOCFRC1.all = 0x003F; //SOC0-SOC5
AdcbRegs.ADCSOCFRC1.all = 0x003F; //SOC0-SOC5
AdccRegs.ADCSOCFRC1.all = 0x003C; //SOC2-SOC5
AdcdRegs.ADCSOCFRC1.all = 0x003F; //SOC0-SOC5

while(AdcaRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
while(AdcbRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
while(AdccRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdccRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
while(AdcdRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

// DELAY_US(10);
sample();

}
}

下面是CPU2的MAIN

#include "F28x_Project.h"
#include "Global_declaration.h"
#include "math.h"
#include "stdio.h"
#include "control.h"
#include "SR_struct.h"
#include "SR_MASTER_CPU1.h"

//#pragma CODE_SECTION(epwm1_Isr,"ramfuncs");

void MemCopy(uint16_t *SourceAddr, uint16_t* SourceEndAddr, uint16_t* DestAddr)
{
while(SourceAddr < SourceEndAddr)
{
*DestAddr++ = *SourceAddr++;
}
return;
}

extern struct SR_MASTER_CPU1 *ptr_m_1;

//Main
void main(void)
{

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitSysCtrl();
InitFlash();
// SR_M_2_Init();

// CpuTimer0Regs.TCR.all = 0x4000;

DINT;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

while(!MemCfgRegs.GSxMSEL.bit.MSEL_GS3)
{
}
// while(!MemCfgRegs.GSxMSEL.bit.MSEL_GS0)
// {
// }

// EALLOW; // This is needed to write to EALLOW protected registers
//// PieVectTable.TIMER0_INT = &cpu_timer0_isr;
//// PieVectTable.SPIA_RX_INT = &spiaRxFifoIsr;
//// PieVectTable.*** = &***;
//// PieVectTable.EPWM1_INT = &epwm1_Isr;
// EDIS; // This is needed to disable write to EALLOW protected registers
//Power up the PWM and ADC
// EALLOW;
// CpuSysRegs.PCLKCR2.bit.EPWM1=1;
// CpuSysRegs.PCLKCR2.bit.EPWM2=1;
// CpuSysRegs.PCLKCR2.bit.EPWM3=1;
// CpuSysRegs.PCLKCR2.bit.EPWM4=1;
// CpuSysRegs.PCLKCR2.bit.EPWM5=1;
// CpuSysRegs.PCLKCR2.bit.EPWM6=1;
// CpuSysRegs.PCLKCR2.bit.EPWM7=1;
// CpuSysRegs.PCLKCR2.bit.EPWM8=1;
// CpuSysRegs.PCLKCR7.bit.SCI_A=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;

// GPIO_WritePin(58, 1);
// GPIO_WritePin(168, 0);
// EALLOW;
// CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;
// EDIS;
//
//// InitAdc();
//// InitEpwm();
//// InitSci();
//// InitCpuTimers();
//// ConfigCpuTimer(&CpuTimer0, 200, 10);
//// CpuTimer0Regs.TCR.all = 0x4000;
// EALLOW;
// CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
// EDIS;
// IER |= M_INT3;
// PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM

for(;;)
{

// GPIO_WritePin(14, 0);
}
}

Qiang Chen:

回复 Susan Yang:

准备使用两个核,但目前由于采样原因,CPU2的程序基本上屏蔽了。因此不知道为什么CPU2下载会影响CPU1

赞(0)
未经允许不得转载:TI中文支持网 » 28377D 中AD采样的奇怪问题
分享到: 更多 (0)