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

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中运行,但是还是不可以,所以特来求教?

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

mangui zhang:不会刷新就是值没有变化烧写到flash你是怎么观察刷新的?
新的TI例程中都有搬移代码提供只需要增加一个宏定义就可以实现将flash代码搬移到ram中运行

在用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中运行,但是还是不可以,所以特来求教?

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

user4884320:

回复 mangui zhang:

感谢您的回答!
观察刷新是在线烧写到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中运行,但是还是不可以,所以特来求教?

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

mangui zhang:

回复 user4884320:

你好参考一下我的分享bbs.21ic.com/icview-1262388-1-1.html

赞(0)
未经允许不得转载:TI中文支持网 » 28335烧写flash运行不正常?
分享到: 更多 (0)