Flash无法加载程序—常见问题解决方法
开发记录人:ah_thunder      Email:feilenker@163 最近几天突然发现TMS320F28335遇到了一个问题,即在仿真状态下(仿真器XDS510-USB2.0)程序能在RAM中正常运行,但写入到FLASH中后程序运行不正常。
出现上述象现,我们要分析:是程序没有烧写到Flash里面,还是程序从Flash加载时失败。花了点时间看了以前做的TMS320F2812的开发记录,发现应该是后一个问题:即程序从Flash 加载时不成功。
瞿颖胡兵1、D SP程序写入到FLASH中,当上电复位后程序从Flash加载不成功,主要有如下几个方面的
原因:
l CMD文件配置错误
l编译选项不正确
l FLASH寄存器配置不正确
l定义了在RAM中运行的函数,但在调用函数之前没有将其复制到RAM中,使程序跑飞。
2、解决办法:
2.1 CMD文件配置错误:首先我这个程序刚开始时在Flash里面运行正常,经过一段时间开发后,
代码增长了,但是配置文件没有修改,所以应该不是这个问题。并且我们一般会采用TI官方使用CMD文件(经过自己的局部修改不会有错)。
2.2编译选项不正确:这也是从网络上得到,我自己没有遇到过。且放在这里,作以后查询。
在编译选项中有一个优化等级的配置选项(上图的红圈内的),如果你的程序不能运行你可以将他设置为None,即为不优化,设置好后保存,再重新编译你的工程,再将程序写入到FLASH 中看看能不能运行。
2.3FLASH寄存器配置不正确
这种可能性很少,我们一般使用TI公司的头文件(只要局部添加自己要定义的一些结构体、全局变量、函数)我相信就不会出现这问题,TI的默认配置就可以正常运行。只是默认配置时,运行速度较慢,如果想提高运行速度应该自己在InitFlash()这个函数中自己重新配置。
2.4定义在RAM中的函数,在调用它之前,没有使用MemCopy把其从Flash里面复制到RAM里面,
致使程序跑飞了。
说明这里就不得不提到系统里面两个典型的函数:InitFlash(),DELAY_US()。
InitFlash():TI的官方文件中有定义,但是没有调用(不论程序是在RAM模式运行,还是在Flah模式运行)。所以此函数不会引起上述问题。上面提到,它却影响程序运行速度。
DELAY_US():这是系统的一个DSP2833X_usDelay.asm文件中定义的一个汇编函数,函数代码如下所示:
.def _DSP28x_usDelay
.sect "ramfuncs"
.global __DSP28x_usDelay
_DSP28x_usDelay:
SUB ACC,#1
BF _DSP28x_usDelay,GEQ ;; Loop if ACC >= 0
LRETR
从以上可以看到.sect “ramfuncs”,即系统把此函数定义在了RAM上。但是系统的一个典型应用是在ADC的上电初始化过程,必须使用延时函数。如下ADC初始化函数:
void InitAdc(void)
{
extern void DSP28x_usDelay(Uint32 Count);
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; //使能ADCCLK
ADC_cal();
EDIS;
AdcRegs.ADCREFSEL.bit.REF_SEL = 0;
AdcRegs.ADCTRL3.all = 0x00E0;
DELAY_US(ADC_usDELAY);        // Delay before converting ADC channels
}
从上面代码可以看到,系统使用了DELAY_US(ADC_usDELAY)函数。当你在仿真器模式(即RAM模式)进行程序运行时,是没有问题的。但是一旦程序烧写到Flash里后,您又没有调用MemCopy函数时,当程序运行到该函数后就会跑飞了,恰好你写的代码都在ADC初始化函数后面(比如点亮某个LED等),后面的这些代码都没有执行,系统当然没有输出了,即表面上看系统没有任何反应。
2.5另外着重说明一下初始化的位置:放在系统时钟初始化之后最恰当
鱼塘承包合同MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();//初始化Flash();
上述两个函数的位置,不能太前,也方便太后。我测试只要放在系统时钟初始化之后最恰当。因为InitFlash()里面要使用到系统时钟,所以不能放在初始化系统时钟函数InitSysCtrl()之前。如果太后面,可能您会使用到DELAY_US(),导致程序运行不正常。
3、F lash程序运行速度问题:
如果你没有自行配置Flash寄存器时,Flash运行模式速度很慢。但是通过配置后,速度还是可以的。以下是我自己的测试过程。
TMS320F28335运行条件:晶振20M,通过20M*10/2=100M。通过程序执行一段循环代码,来测试时间。循环代码前点亮一个LED,循环代码再点亮另一个LED,使用外部秒表来计时。
3.1在仿真器(即RAM)运行模式时
3.2 Flash运行模式,但是不调用以下函数:
//MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
//InitFlash();//初始化Flash();
3.3Flash运行模式,但是调用以下函数,但是InitFlash函数为系统自带,未优化配置
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();//初始化Flash();
以下为InitFlash函数的配置代码部分:
#if CPU_FRQ_100MHZ
FlashRegs.FBANKWAIT.bit.PAGEWAIT = 3;
FlashRegs.FBANKWAIT.bit.RANDWAIT = 3;
FlashRegs.FOTPWAIT.bit.OTPWAIT = 5;
#endif
3.4Flash运行模式,调用以下函数,且InitFlash函数经过优化配置
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();//初始化Flash();
以下为InitFlash函数的配置代码部分:
车险需要买哪些#if CPU_FRQ_100MHZ
FlashRegs.FBANKWAIT.bit.PAGEWAIT = 1;
FlashRegs.FBANKWAIT.bit.RANDWAIT = 1;
FlashRegs.FOTPWAIT.bit.OTPWAIT = 1;
#endif
麦多馅饼
3.5测试结果:
测试项目
花费时间
(系统时钟:20M*10/2=100M)
3.2 (Flash运行模式,但是不调用以下函数) 42.9秒
描写水的四字词语3.3 (Flash运行模式,调用函数,但不优化配置) 1
4.4秒
3.4 (Flash运行模式,调用函数,且优化配置) 10.5秒
杨紫忽悠王鹤棣
3.1 (在仿真器(即RAM)运行模式时) 8.12秒
测试结果说明:当系统运行在Flash模式下,且对Flash配置寄存器进行优化后,其运行速度与在仿真器(即RAM模式)时差异不是很大,为其速度的8.12/10.5*100%=76%。