This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

28335烧写flash运行不正常?

在用28335控制程序,在Ram中仿真运行时程序运行正常,但是烧写到flash中就会出现问题,主要的问题是adc的采样值不正确而且不会刷新。

现在的情况是这样的:

(1)flash的CMD文件中有语句:

.cinit : > FLASHA PAGE = 0
.pinit : > FLASHA, PAGE = 0
.text : > FLASHA PAGE = 0
codestart : > BEGIN PAGE = 0
ramfuncs : LOAD = FLASHA,
RUN = RAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0

(2)main.c中有语句:

#pragma CODE_SECTION(MainISR,"ramfuncs");
#pragma CODE_SECTION(OffsetISR,"ramfuncs");

extern Uint16 *RamfuncsLoadStart, *RamfuncsLoadEnd, *RamfuncsRunStart;

(3)主函数中有flash到ram复制语句:

#ifdef FLASH
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
#endif //(FLASH)

(4)DSP28x_usDelay.asm文件中语句:

.def _DSP28x_usDelay
.sect "ramfuncs"

.global __DSP28x_usDelay
_DSP28x_usDelay:
SUB ACC,#1
BF _DSP28x_usDelay,GEQ ;; Loop if ACC >= 0
LRETR

我一直以为是ADC_MACRO_INIT(ChSel,TrigSel,ACQPS)函数中的delay_us语句导致,ADC_MACRO_INIT(ChSel,TrigSel,ACQPS)函数在f28335xileg_vdc.h中定义如下所示:

extern void DSP28x_usDelay(unsigned long Count);
extern void ADC_cal();
#define CPU_CLOCK_SPEED 15.000L // 10.000L for a 100MHz CPU clock speed
#define ADC_usDELAY 50000L
#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_CLOCK_SPEED) - 9.0L) / 5.0L)

#define ADC_MACRO_INIT(ChSel,Trigsel,ACQPS) \
\
EALLOW; \
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; \
ADC_cal(); \
EDIS; \
\
AdcRegs.ADCTRL3.all = 0x00E0; /* Power up bandgap/reference/ADC circuits*/ \
DELAY_US(ADC_usDELAY); /* Delay before converting ADC channels*/ \
\
AdcRegs.ADCTRL1.bit.ACQ_PS = ACQPS[0]; \
AdcRegs.ADCTRL1.bit.CPS = 1; \
AdcRegs.ADCTRL3.bit.ADCCLKPS = 0; \
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0; /* 0x0 Dual Sequencer Mode, 0x1 Cascaded Mode*/ \
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x0; \
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1; \
AdcRegs.ADCTRL2.bit.RST_SEQ2 = 0x1; \
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1=0x1; /* enable SOC from EPWMA trigger*/ \
\
\
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = ChSel[0]; \
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = ChSel[1]; \
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = ChSel[2]; \
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = ChSel[3]; \
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = ChSel[4]; \
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = ChSel[5]; \
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = ChSel[6]; \
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = ChSel[7]; \
\
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 7; \
EDIS; \
\
/* Set up Event Trigger with CNT_zero enable for Time-base of EPWM1 */ \
EPwm1Regs.ETSEL.bit.SOCAEN = 1; /* Enable SOCA */ \
EPwm1Regs.ETSEL.bit.SOCASEL = 2; /* Enable period event for SOCA */ \
EPwm1Regs.ETPS.bit.SOCAPRD = 1; /* Generate SOCA on the 1st event */ \
EPwm1Regs.ETCLR.bit.SOCA = 1; /* Clear SOCA flag */

我一直以为是里面delay_us的调用导致烧写flash不正常,我就把这个语句直接写在main.c文件中作为一个函数ADC_MACRO_INIT()来调用,然后用语句#pragma CODE_SECTION(ADC_MACRO_INIT,"ramfuncs");去把他复制到ram中运行,但是还是不行,甚至有时程序完全跑飞成乱码,不只是为何?

然后恢复原始书写状态,在main.c中写语句#pragma CODE_SECTION(DSP28x_usDelay,"ramfuncs");,是想把delay_us复制到ram中运行,但是还是不可以,所以特来求教?

由于情况比较紧急,非常希望能够得到您的指教,感激不尽!