请教各位:问题一:程序烧写到FLASH中,无在RAM中运行的程序1、 烧写CMD采用F28027.CMD2、 主程序中,在初始化系统后加入InitFlash()函数
InitFlash();//这个是初始化FLASH问题就是是不是只需这1、2步即可?问题二:程序烧写到FLASH中,有在RAM中运行的程序1
、烧写CMD
采用F28027.CMD2
、MemCopy()(1
)这个在F28027.CMD
自带(请看理解对不对)ramfuncs
关键字的定义,在“F28027.CMD
”文件中 ramfuncs : LOAD = FLASHA, RUN = PRAML0, LOAD_START(_RamfuncsLoadStart), LOAD_END(_RamfuncsLoadEnd),/* LOAD_SIZE(_RamfuncsLoadSize),*/ RUN_START(_RamfuncsRunStart), PAGE = 0这个的意思是定义一个叫“ramfuncs
”的段,这个段从FLASHA中装载,在PRAML0运行。以及装载的地址,运行地址等。(2)主文件或头文件声明extern voidMemCopy(Uint16*SourceAddr, Uint16*SourceEndAddr, Uint16*DestAddr);extern Uint16RamfuncsLoadStart;extern Uint16RamfuncsLoadEnd;externUint16RamfuncsRunStart;(3)主程序调用MemCopy()和InitFlash()函数 MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd, &RamfuncsRunStart); InitFlash();(4)定义需要在ram中运行的函数#pragma CODE_SECTION(EPwm2_timer_isr, "ramfuncs");//
将EPwm2_timer_isr
放在ram
中运行 问题如下:main()函数中,采用F28027.CMD#pragmaCODE_SECTION(EPwm1_timer_isr, "ramfuncs");#pragmaCODE_SECTION(EPwm2_timer_isr, "ramfuncs"); externvoid MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr);externUint16 RamfuncsLoadStart;externUint16 RamfuncsLoadEnd;externUint16 RamfuncsRunStart; void main(void)
{ InitSysCtrl(); InitGpio(); InitSciaGpio(); InitCpuTimers(); DINT; InitPieCtrl(); IER= 0x0000; IFR= 0x0000; InitPieVectTable();
MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd, &RamfuncsRunStart); InitFlash();}这样是不是就是将EPwm1_timer1/2放在ram中运行了?如果再增加一条#pragmaCODE_SECTION(xxxx,”ramfuncs”)预定义,是不是就是将xxx也放在ram中执行? 问题三:/*main.c*/#include "DSP28x_Project.h"//#pragma CODE_SECTION(EPwm1_timer_isr,"ramfuncs");//#pragma CODE_SECTION(EPwm2_timer_isr,"ramfuncs"); #ifdefTOFLASH //是预编译,有TOFLASH定义就执行中间这个一段程序extern void MemCopy(Uint16 *SourceAddr, Uint16*SourceEndAddr, Uint16* DestAddr);extern Uint16 RamfuncsLoadStart;extern Uint16 RamfuncsLoadEnd;extern Uint16 RamfuncsRunStart;#endifvoid main(void){ InitSysCtrl(); InitGpio(); InitSciaGpio(); InitCpuTimers(); DINT; InitPieCtrl(); IER =0x0000; IFR =0x0000; InitPieVectTable(); #ifdefTOFLASH //是预编译,有TOFLASH定义就执行中间这个一段程序 MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd, &RamfuncsRunStart); InitFlash();#endif for (;;) { GpioDataRegs.GPATOGGLE.bit.GPIO0= 1; GpioDataRegs.GPATOGGLE.bit.GPIO1= 1; DELAY_US(1000000L); }} 问题点:
这个TOFLASH在哪里定义,是不是就是指//#pragma CODE_SECTION(Epwm1_timer_isr, "ramfuncs");//#pragma CODE_SECTION(EPwm2_timer_isr, "ramfuncs");这个语句;如果没有注释掉就执行,如果注释掉就不执行?
此帖出自
小平头技术问答
-----------楼主再看看MemCopy()这个函数是怎样写的,都做些什么。
TOFLASH是自己定义的,想怎么定义都是可以的,只要符合C法则。
它可以在编译器设置里定义,也可以在文件里
这个程序就是根据您的F28027_flash来分析的
1、InitFlash()函数我看了,实际是根据不同的时钟选择不同的时间;实际使用根据系统时钟选取即可。
2、MemCopy()是将FLASH地址的一段复制到RAM中,也就是需要在ram中运行的程序
3、具体需要在ram中运行的程序,是在“F2802x_DefaultIsr.c”中定义的:
#pragma CODE_SECTION(SCITXINTA_ISR, "ramfuncs");
#pragma CODE_SECTION(SCIRXINTA_ISR, "ramfuncs");
#pragma CODE_SECTION(INT13_ISR, "ramfuncs");
#pragma CODE_SECTION(TINT0_ISR, "ramfuncs");
也就是说SCITXINTA_ISR、SCIRXINTA_ISR、INT13_ISR、TINT0_ISR需要在ram中运行;用MemCopy()将程序复制到ram中。
4、现在有个问题就是在您的程序中没有发现让#ifdef TOFLASH预编译进入执行的语句,意思就是怎么进入#ifdef FLASH的?是不是就是您说的“可以在编译器设置里定义”;具体编译器的设置选择项在哪里?或者说用"F28027.CMD"来编译就实现了进入#ifdef TOFLASH
是在编译器的设置里定义的
一周热门 更多>