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

DSP28335程序烧入flash后,显示烧录成功,在线运行没问题,断电后重新上电,感觉程序只运行了一部分,初始化没有完成;后来在初始化后试着加一段延时,程序就运行正常了,不知道是怎么回事,求大神帮解答,不胜感激~~

/****************************主函数*******************************/
void main(void)
{

InitSysCtrl();//初始化系统控制:看门狗 锁相环 外设时钟使能

//InitGpio();//初始化通用GPIO

InitXintf();

InitXintf16Gpio(); //初始化外扩接口引脚

InitSciGpio();//初始化串口引脚

InitECanGpio();//初始化ECan引脚

InitECan();//初始化ECan

InitSci();//初始化串口

DINT;//禁止CPU中断

InitPieCtrl();//初始化PIE中断向量

IER = 0x0000;//禁止所有CPU中断
IFR = 0x0000;//清除中断标志位

InitPieVectTable();//初始化中断向量表

// StopCpuTimer0();//停止CpuTimer0定时器

// PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//使能PIE相关模块
// PieCtrlRegs.PIEIER12.bit.INTx1 = 1;//使能12组第1中断 XINT3
// PieCtrlRegs.PIEIER12.bit.INTx2 = 1;//使能12组第2中断 XINT4
// PieCtrlRegs.PIEIER12.bit.INTx3 = 1;//使能12组第3中断 XINT5
// PieCtrlRegs.PIEIER12.bit.INTx4 = 1;//使能12组第4中断 XINT6
// PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//使能1组第7中断 TINT0(CPU定时器0)
PieCtrlRegs.PIEIER8.bit.INTx5 = 1;//使能8组第5中断 SCIRXINT_C
PieCtrlRegs.PIEIER8.bit.INTx6 = 1;//使能8组第6中断 SCITXINT_C
PieCtrlRegs.PIEIER9.bit.INTx3 = 1;//使能9组第3中断 SCIRXINT_B
PieCtrlRegs.PIEIER9.bit.INTx4 = 1;//使能9组第4中断 SCITXINT_B
PieCtrlRegs.PIEIER9.bit.INTx1 = 1;//使能9组第1中断 SCIRXINT_A
PieCtrlRegs.PIEIER9.bit.INTx2 = 1;//使能9组第2中断 SCITXINT_A

IER |= (M_INT1 | M_INT8 | M_INT12 | M_INT9);//使能CPU级中断

EINT;//使能全局中断

ERTM;//使能实时中断

PieCtrlRegs.PIEACK.all = 0xFFFF;//响应中断

memset(MoBan,0x0,81920);// 1280*1024/16 = 81920 一共有81920个地址需要写0x0 一个地址16位
memset(MoBan1,0x0,81920);
memset(MoBan2,0x0,81920);
delay_ms(4000);//  如果不加这个延时,烧进去后程序运行就出现异常情况

mangui zhang:

你这个函数是干啥的  memset(MoBan2,0x0,81920);

感觉延时只对它起了作用吧    

相关链接帖子    请查考

http://www.deyisupport.com/question_answer/microcontrollers/c2000/f/56/t/106276.aspx

/****************************主函数*******************************/
void main(void)
{

InitSysCtrl();//初始化系统控制:看门狗 锁相环 外设时钟使能

//InitGpio();//初始化通用GPIO

InitXintf();

InitXintf16Gpio(); //初始化外扩接口引脚

InitSciGpio();//初始化串口引脚

InitECanGpio();//初始化ECan引脚

InitECan();//初始化ECan

InitSci();//初始化串口

DINT;//禁止CPU中断

InitPieCtrl();//初始化PIE中断向量

IER = 0x0000;//禁止所有CPU中断
IFR = 0x0000;//清除中断标志位

InitPieVectTable();//初始化中断向量表

// StopCpuTimer0();//停止CpuTimer0定时器

// PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//使能PIE相关模块
// PieCtrlRegs.PIEIER12.bit.INTx1 = 1;//使能12组第1中断 XINT3
// PieCtrlRegs.PIEIER12.bit.INTx2 = 1;//使能12组第2中断 XINT4
// PieCtrlRegs.PIEIER12.bit.INTx3 = 1;//使能12组第3中断 XINT5
// PieCtrlRegs.PIEIER12.bit.INTx4 = 1;//使能12组第4中断 XINT6
// PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//使能1组第7中断 TINT0(CPU定时器0)
PieCtrlRegs.PIEIER8.bit.INTx5 = 1;//使能8组第5中断 SCIRXINT_C
PieCtrlRegs.PIEIER8.bit.INTx6 = 1;//使能8组第6中断 SCITXINT_C
PieCtrlRegs.PIEIER9.bit.INTx3 = 1;//使能9组第3中断 SCIRXINT_B
PieCtrlRegs.PIEIER9.bit.INTx4 = 1;//使能9组第4中断 SCITXINT_B
PieCtrlRegs.PIEIER9.bit.INTx1 = 1;//使能9组第1中断 SCIRXINT_A
PieCtrlRegs.PIEIER9.bit.INTx2 = 1;//使能9组第2中断 SCITXINT_A

IER |= (M_INT1 | M_INT8 | M_INT12 | M_INT9);//使能CPU级中断

EINT;//使能全局中断

ERTM;//使能实时中断

PieCtrlRegs.PIEACK.all = 0xFFFF;//响应中断

memset(MoBan,0x0,81920);// 1280*1024/16 = 81920 一共有81920个地址需要写0x0 一个地址16位
memset(MoBan1,0x0,81920);
memset(MoBan2,0x0,81920);
delay_ms(4000);//  如果不加这个延时,烧进去后程序运行就出现异常情况

Jason Wu4:

试试将如下MemCopy添加到初始化部分试试。

#if FLASH_MEMCOPY

/***************************************************************** Copy time critical code and Flash setup code to RAM The RamfuncsLoadStart, RamfuncsLoadEnd, and RamfuncsRunStart symbols are created by the linker. Refer to the F2808.cmd file.******************************************************************/

EALLOW; MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart); EDIS;

// Call Flash Initialization to setup flash waitstates// This function must reside in RAM InitFlash(); // Initialize the Flash

#endif

/****************************主函数*******************************/
void main(void)
{

InitSysCtrl();//初始化系统控制:看门狗 锁相环 外设时钟使能

//InitGpio();//初始化通用GPIO

InitXintf();

InitXintf16Gpio(); //初始化外扩接口引脚

InitSciGpio();//初始化串口引脚

InitECanGpio();//初始化ECan引脚

InitECan();//初始化ECan

InitSci();//初始化串口

DINT;//禁止CPU中断

InitPieCtrl();//初始化PIE中断向量

IER = 0x0000;//禁止所有CPU中断
IFR = 0x0000;//清除中断标志位

InitPieVectTable();//初始化中断向量表

// StopCpuTimer0();//停止CpuTimer0定时器

// PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//使能PIE相关模块
// PieCtrlRegs.PIEIER12.bit.INTx1 = 1;//使能12组第1中断 XINT3
// PieCtrlRegs.PIEIER12.bit.INTx2 = 1;//使能12组第2中断 XINT4
// PieCtrlRegs.PIEIER12.bit.INTx3 = 1;//使能12组第3中断 XINT5
// PieCtrlRegs.PIEIER12.bit.INTx4 = 1;//使能12组第4中断 XINT6
// PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//使能1组第7中断 TINT0(CPU定时器0)
PieCtrlRegs.PIEIER8.bit.INTx5 = 1;//使能8组第5中断 SCIRXINT_C
PieCtrlRegs.PIEIER8.bit.INTx6 = 1;//使能8组第6中断 SCITXINT_C
PieCtrlRegs.PIEIER9.bit.INTx3 = 1;//使能9组第3中断 SCIRXINT_B
PieCtrlRegs.PIEIER9.bit.INTx4 = 1;//使能9组第4中断 SCITXINT_B
PieCtrlRegs.PIEIER9.bit.INTx1 = 1;//使能9组第1中断 SCIRXINT_A
PieCtrlRegs.PIEIER9.bit.INTx2 = 1;//使能9组第2中断 SCITXINT_A

IER |= (M_INT1 | M_INT8 | M_INT12 | M_INT9);//使能CPU级中断

EINT;//使能全局中断

ERTM;//使能实时中断

PieCtrlRegs.PIEACK.all = 0xFFFF;//响应中断

memset(MoBan,0x0,81920);// 1280*1024/16 = 81920 一共有81920个地址需要写0x0 一个地址16位
memset(MoBan1,0x0,81920);
memset(MoBan2,0x0,81920);
delay_ms(4000);//  如果不加这个延时,烧进去后程序运行就出现异常情况

qiang liu9:

回复 mangui zhang:

程序中用到了外扩接口同FPGA通讯      memset(MoBan2,0x0,81920);用来清零相关存储区域  

我后来把memset();屏蔽掉了后,烧写还是出现同样的问题

/****************************主函数*******************************/
void main(void)
{

InitSysCtrl();//初始化系统控制:看门狗 锁相环 外设时钟使能

//InitGpio();//初始化通用GPIO

InitXintf();

InitXintf16Gpio(); //初始化外扩接口引脚

InitSciGpio();//初始化串口引脚

InitECanGpio();//初始化ECan引脚

InitECan();//初始化ECan

InitSci();//初始化串口

DINT;//禁止CPU中断

InitPieCtrl();//初始化PIE中断向量

IER = 0x0000;//禁止所有CPU中断
IFR = 0x0000;//清除中断标志位

InitPieVectTable();//初始化中断向量表

// StopCpuTimer0();//停止CpuTimer0定时器

// PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//使能PIE相关模块
// PieCtrlRegs.PIEIER12.bit.INTx1 = 1;//使能12组第1中断 XINT3
// PieCtrlRegs.PIEIER12.bit.INTx2 = 1;//使能12组第2中断 XINT4
// PieCtrlRegs.PIEIER12.bit.INTx3 = 1;//使能12组第3中断 XINT5
// PieCtrlRegs.PIEIER12.bit.INTx4 = 1;//使能12组第4中断 XINT6
// PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//使能1组第7中断 TINT0(CPU定时器0)
PieCtrlRegs.PIEIER8.bit.INTx5 = 1;//使能8组第5中断 SCIRXINT_C
PieCtrlRegs.PIEIER8.bit.INTx6 = 1;//使能8组第6中断 SCITXINT_C
PieCtrlRegs.PIEIER9.bit.INTx3 = 1;//使能9组第3中断 SCIRXINT_B
PieCtrlRegs.PIEIER9.bit.INTx4 = 1;//使能9组第4中断 SCITXINT_B
PieCtrlRegs.PIEIER9.bit.INTx1 = 1;//使能9组第1中断 SCIRXINT_A
PieCtrlRegs.PIEIER9.bit.INTx2 = 1;//使能9组第2中断 SCITXINT_A

IER |= (M_INT1 | M_INT8 | M_INT12 | M_INT9);//使能CPU级中断

EINT;//使能全局中断

ERTM;//使能实时中断

PieCtrlRegs.PIEACK.all = 0xFFFF;//响应中断

memset(MoBan,0x0,81920);// 1280*1024/16 = 81920 一共有81920个地址需要写0x0 一个地址16位
memset(MoBan1,0x0,81920);
memset(MoBan2,0x0,81920);
delay_ms(4000);//  如果不加这个延时,烧进去后程序运行就出现异常情况

qiang liu9:

回复 Jason Wu4:

我的程序里 没有FLASH_MEMCOPY这个变量    我把这部分代码加进main之后,编译不通过,后来把代码加到main.h中后编译成功,但烧写后现象还是依旧,我不清楚这段代码是用来干什么的,求解答,谢谢~~~

/****************************主函数*******************************/
void main(void)
{

InitSysCtrl();//初始化系统控制:看门狗 锁相环 外设时钟使能

//InitGpio();//初始化通用GPIO

InitXintf();

InitXintf16Gpio(); //初始化外扩接口引脚

InitSciGpio();//初始化串口引脚

InitECanGpio();//初始化ECan引脚

InitECan();//初始化ECan

InitSci();//初始化串口

DINT;//禁止CPU中断

InitPieCtrl();//初始化PIE中断向量

IER = 0x0000;//禁止所有CPU中断
IFR = 0x0000;//清除中断标志位

InitPieVectTable();//初始化中断向量表

// StopCpuTimer0();//停止CpuTimer0定时器

// PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//使能PIE相关模块
// PieCtrlRegs.PIEIER12.bit.INTx1 = 1;//使能12组第1中断 XINT3
// PieCtrlRegs.PIEIER12.bit.INTx2 = 1;//使能12组第2中断 XINT4
// PieCtrlRegs.PIEIER12.bit.INTx3 = 1;//使能12组第3中断 XINT5
// PieCtrlRegs.PIEIER12.bit.INTx4 = 1;//使能12组第4中断 XINT6
// PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//使能1组第7中断 TINT0(CPU定时器0)
PieCtrlRegs.PIEIER8.bit.INTx5 = 1;//使能8组第5中断 SCIRXINT_C
PieCtrlRegs.PIEIER8.bit.INTx6 = 1;//使能8组第6中断 SCITXINT_C
PieCtrlRegs.PIEIER9.bit.INTx3 = 1;//使能9组第3中断 SCIRXINT_B
PieCtrlRegs.PIEIER9.bit.INTx4 = 1;//使能9组第4中断 SCITXINT_B
PieCtrlRegs.PIEIER9.bit.INTx1 = 1;//使能9组第1中断 SCIRXINT_A
PieCtrlRegs.PIEIER9.bit.INTx2 = 1;//使能9组第2中断 SCITXINT_A

IER |= (M_INT1 | M_INT8 | M_INT12 | M_INT9);//使能CPU级中断

EINT;//使能全局中断

ERTM;//使能实时中断

PieCtrlRegs.PIEACK.all = 0xFFFF;//响应中断

memset(MoBan,0x0,81920);// 1280*1024/16 = 81920 一共有81920个地址需要写0x0 一个地址16位
memset(MoBan1,0x0,81920);
memset(MoBan2,0x0,81920);
delay_ms(4000);//  如果不加这个延时,烧进去后程序运行就出现异常情况

Jason Wu4:

回复 qiang liu9:

你加的不对,建议你参考TI官方例程中对这段代码的使用,是运行Flash中代码是将其搬移到RAM中运行,提高程序运行速度。

/****************************主函数*******************************/
void main(void)
{

InitSysCtrl();//初始化系统控制:看门狗 锁相环 外设时钟使能

//InitGpio();//初始化通用GPIO

InitXintf();

InitXintf16Gpio(); //初始化外扩接口引脚

InitSciGpio();//初始化串口引脚

InitECanGpio();//初始化ECan引脚

InitECan();//初始化ECan

InitSci();//初始化串口

DINT;//禁止CPU中断

InitPieCtrl();//初始化PIE中断向量

IER = 0x0000;//禁止所有CPU中断
IFR = 0x0000;//清除中断标志位

InitPieVectTable();//初始化中断向量表

// StopCpuTimer0();//停止CpuTimer0定时器

// PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//使能PIE相关模块
// PieCtrlRegs.PIEIER12.bit.INTx1 = 1;//使能12组第1中断 XINT3
// PieCtrlRegs.PIEIER12.bit.INTx2 = 1;//使能12组第2中断 XINT4
// PieCtrlRegs.PIEIER12.bit.INTx3 = 1;//使能12组第3中断 XINT5
// PieCtrlRegs.PIEIER12.bit.INTx4 = 1;//使能12组第4中断 XINT6
// PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//使能1组第7中断 TINT0(CPU定时器0)
PieCtrlRegs.PIEIER8.bit.INTx5 = 1;//使能8组第5中断 SCIRXINT_C
PieCtrlRegs.PIEIER8.bit.INTx6 = 1;//使能8组第6中断 SCITXINT_C
PieCtrlRegs.PIEIER9.bit.INTx3 = 1;//使能9组第3中断 SCIRXINT_B
PieCtrlRegs.PIEIER9.bit.INTx4 = 1;//使能9组第4中断 SCITXINT_B
PieCtrlRegs.PIEIER9.bit.INTx1 = 1;//使能9组第1中断 SCIRXINT_A
PieCtrlRegs.PIEIER9.bit.INTx2 = 1;//使能9组第2中断 SCITXINT_A

IER |= (M_INT1 | M_INT8 | M_INT12 | M_INT9);//使能CPU级中断

EINT;//使能全局中断

ERTM;//使能实时中断

PieCtrlRegs.PIEACK.all = 0xFFFF;//响应中断

memset(MoBan,0x0,81920);// 1280*1024/16 = 81920 一共有81920个地址需要写0x0 一个地址16位
memset(MoBan1,0x0,81920);
memset(MoBan2,0x0,81920);
delay_ms(4000);//  如果不加这个延时,烧进去后程序运行就出现异常情况

Terry Deng:

会不会是FPGA那边需要延时等待,否则整个系统就运行出问题了呢

/****************************主函数*******************************/
void main(void)
{

InitSysCtrl();//初始化系统控制:看门狗 锁相环 外设时钟使能

//InitGpio();//初始化通用GPIO

InitXintf();

InitXintf16Gpio(); //初始化外扩接口引脚

InitSciGpio();//初始化串口引脚

InitECanGpio();//初始化ECan引脚

InitECan();//初始化ECan

InitSci();//初始化串口

DINT;//禁止CPU中断

InitPieCtrl();//初始化PIE中断向量

IER = 0x0000;//禁止所有CPU中断
IFR = 0x0000;//清除中断标志位

InitPieVectTable();//初始化中断向量表

// StopCpuTimer0();//停止CpuTimer0定时器

// PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//使能PIE相关模块
// PieCtrlRegs.PIEIER12.bit.INTx1 = 1;//使能12组第1中断 XINT3
// PieCtrlRegs.PIEIER12.bit.INTx2 = 1;//使能12组第2中断 XINT4
// PieCtrlRegs.PIEIER12.bit.INTx3 = 1;//使能12组第3中断 XINT5
// PieCtrlRegs.PIEIER12.bit.INTx4 = 1;//使能12组第4中断 XINT6
// PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//使能1组第7中断 TINT0(CPU定时器0)
PieCtrlRegs.PIEIER8.bit.INTx5 = 1;//使能8组第5中断 SCIRXINT_C
PieCtrlRegs.PIEIER8.bit.INTx6 = 1;//使能8组第6中断 SCITXINT_C
PieCtrlRegs.PIEIER9.bit.INTx3 = 1;//使能9组第3中断 SCIRXINT_B
PieCtrlRegs.PIEIER9.bit.INTx4 = 1;//使能9组第4中断 SCITXINT_B
PieCtrlRegs.PIEIER9.bit.INTx1 = 1;//使能9组第1中断 SCIRXINT_A
PieCtrlRegs.PIEIER9.bit.INTx2 = 1;//使能9组第2中断 SCITXINT_A

IER |= (M_INT1 | M_INT8 | M_INT12 | M_INT9);//使能CPU级中断

EINT;//使能全局中断

ERTM;//使能实时中断

PieCtrlRegs.PIEACK.all = 0xFFFF;//响应中断

memset(MoBan,0x0,81920);// 1280*1024/16 = 81920 一共有81920个地址需要写0x0 一个地址16位
memset(MoBan1,0x0,81920);
memset(MoBan2,0x0,81920);
delay_ms(4000);//  如果不加这个延时,烧进去后程序运行就出现异常情况

qiang liu9:

回复 Jason Wu4:

好的,我试试,FPGA这边不会出现问题

赞(0)
未经允许不得转载:TI中文支持网 » DSP28335程序烧入flash后,显示烧录成功,在线运行没问题,断电后重新上电,感觉程序只运行了一部分,初始化没有完成;后来在初始化后试着加一段延时,程序就运行正常了,不知道是怎么回事,求大神帮解答,不胜感激~~
分享到: 更多 (0)