工具与软件:
尊敬的专家:
我正在尝试将 RAM 中的 ADC_ISR 代码从闪存中复制、以获得更高的速度。 为了执行此操作,我 在 main ()中添加了"#define _flash",以将 InitFlash ()包含在 InitSysCtrl ()中。
然后、在 ADC_ISR 之前添加"#pragma CODE_SECTION (ADC_EOC、"ramfuncs")"。 在调试过程中、我只是根据链接器文件检查 ADC_ISR 是否已加载到指定地址中、并且是否在预期中找到该地址、您可以在第一个映像中看到它! 它从0x8000开始、这是 LS0RAM 的 strat 地址。 一旦运行被按下、一切看起来都很完美-根据模拟信号采集模拟信号和角蛋白并由 ePWM1触发 ADC。
#include "F28x_Project.h"
#include <math.h>
#include <stdio.h>
#define _FLASH
extern void InitSysCtrl(void);
extern void InitPieCtrl(void);
extern void InitPieVectTable(void);
#define TWO_PI 6.283185307179586476925286766559
interrupt void ADCs_EOC(void);
void Initialize_GPIO(void);
void Custom_Init(void);
void PWM1_Init(void);
void Init_ADCs(void);
void X_bar(void);
int buff[100],i,b,c,d=0;
float pi,V_alpha,V_beta,Vd,Vq,R,Y,B,temp,temp2,theta,a;
void main(void)
{
InitSysCtrl();
Custom_Init();
PWM1_Init();
Init_ADCs();
DINT;
Initialize_GPIO();
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl();
InitPieVectTable();
EALLOW;
PieCtrlRegs.PIEIER1.bit.INTx1 = 1; //ADC-A1
PieVectTable.ADCA1_INT = &ADCs_EOC;
PieCtrlRegs.PIECTRL.bit.ENPIE= 1;
EDIS;
IER |= 1;
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
while(1)
{
}
}
void Initialize_GPIO(void)
{
EALLOW;
//GPIO 18 - Xbar input
/* GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 0;
// GpioCtrlRegs.GPAGMUX2.bit.GPIO18 = 0;
// GpioCtrlRegs.GPAPUD.bit.GPIO18 = 1;
// GpioCtrlRegs.GPADIR.bit.GPIO18 = 0;
// GpioCtrlRegs.GPACSEL3.bit.GPIO18 = 0;
// GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3;
InputXbarRegs.INPUT5SELECT = 18;
*/
// LED out
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;
GpioCtrlRegs.GPCDIR.bit.GPIO73= 1;
//PWMs
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; //ePWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; //ePWM2A
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1; //ePWM3A
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 1; //ePWM4A
GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 1; //ePWM5A
GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 1; //ePWM6A
EDIS;
}
void Custom_Init(void)
{
EALLOW;
ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL=1;
ClkCfgRegs.AUXPLLMULT.bit.IMULT=20;
ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV=0;
ClkCfgRegs.SYSPLLCTL1.bit.PLLCLKEN = 1;
ClkCfgRegs.LOSPCP.bit.LSPCLKDIV = 2;
ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0;
CpuSysRegs.PCLKCR0.bit.CPUTIMER0 = 1;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; ///source initsysctrl
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.PCLKCR13.bit.ADC_A = 1;
CpuSysRegs.PCLKCR0.bit.CLA1 = 1;
DevCfgRegs.CPUSEL0.bit.EPWM1 = 0;
Flash0CtrlRegs.FPAC1.bit.PMPPWR = 1; // Enable flash pump
Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 3; // Adjust wait states
EDIS;
}
#pragma CODE_SECTION(ADCs_EOC, "ramfuncs")
void ADCs_EOC(void)
{
Vd=100;
Vq=0;
c =c +1;
if(c>3)
{
c=0;
}
a = AdcaResultRegs.ADCRESULT0; //Va
temp = (a*62500)/4095;
R = 1000-a;
EPwm1Regs.CMPA.bit.CMPA = temp;
EPwm1Regs.CMPB.bit.CMPB = temp + 9000;
i= i+1;
EPwm1Regs.ETCLR.bit.SOCA = 1;
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
void PWM1_Init(void)
{
EALLOW;
//R Phase
EPwm1Regs.TBCTL.bit.CTRMODE = 0; // Count up
EPwm1Regs.TBPRD = 62500; // Set timer period
EPwm1Regs.TBCTL.bit.PHSEN = 0; // 1 for external SYNC
EPwm1Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0
EPwm1Regs.TBCTR = 0x0000; // Clear counter
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 2; // Clock ratio to SYSCLKOUT
EPwm1Regs.TBCTL.bit.CLKDIV = 4;
EPwm1Regs.TBCTL.bit.SYNCOSEL = 1;
// Setup shadow register load on ZERO
EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0;
EPwm1Regs.CMPCTL.bit.LOADAMODE = 0;
EPwm1Regs.CMPCTL.bit.LOADBMODE = 0;
// Set Compare values
// Set compare A value
// Set actions
EPwm1Regs.AQCTLA.all = 0;
EPwm1Regs.AQCTLA.bit.CAU = 2; // Set PWM1A on TBCTR = CMPA
EPwm1Regs.AQCTLA.bit.CBU = 1; // Clear PWM1A on TBCTR = CMPB= CMPA + 100
//SOCA to ADC
EPwm1Regs.ETSEL.bit.SOCAEN=1;
EPwm1Regs.ETSEL.bit.SOCASEL=1;
EPwm1Regs.ETPS.bit.SOCAPRD = 1;
EPwm1Regs.ETCLR.bit.SOCA = 1;
EDIS;
}
void Init_ADCs(void)
{
EALLOW;
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;
AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1;
// DELAY_US(1);
AdcaRegs.ADCCTL2.bit.PRESCALE = 6;
AdcbRegs.ADCCTL2.bit.PRESCALE = 6;
AdccRegs.ADCCTL2.bit.PRESCALE = 6;
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0 will convert pin A0
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1; //SOC1 will convert pin A1
AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2; //SOC2 will convert pin A2
AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3; //SOC3 will convert pin A3
AdcaRegs.ADCSOC4CTL.bit.CHSEL = 4; //SOC4 will convert pin A4
AdcaRegs.ADCSOC5CTL.bit.CHSEL = 5; //SOC5 will convert pin A5
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles
AdcaRegs.ADCSOC2CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles
AdcaRegs.ADCSOC3CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles
AdcaRegs.ADCSOC4CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles
AdcaRegs.ADCSOC5CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles
AdcaRegs.ADCBURSTCTL.bit.BURSTEN = 1;
AdcaRegs.ADCBURSTCTL.bit.BURSTSIZE = 11;
AdcaRegs.ADCBURSTCTL.bit.BURSTTRIGSEL = 5;
//interrupt
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; //end of SOC0 will set INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 05;
EDIS;
}
下图显示了 ADCIER、它从0x8000开始。

在微控制器复位之前、一切看起来都是正常的! 我希望它能继续发挥预期的功能(ePWM、获取模拟、PWM 三角 ADC)、但它停止了这种做法、最后得到 ILLEGAL_ISR!
我怀疑内存、 发现代码与前一个视图不同。 我不知道这是否是罪魁祸首、但只是分享意见。

请帮助我解决这个问题。
此致、
Rajesh。

