我在调试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
TI中文支持网



