DM365高低温下偶尔无法启动问题记录:
DM365在高低温下偶尔无法启动,原因在于UBL引导工具
解决办法:找到nand.c文件中的如下函数:
(*hNandInfo->hEccInfo->fxnEnable)(hNandInfo);
上面是一个函数指针,作用是设置NAND的4bit的ECC校验,当电源不稳定或者受到外界影响比较大时
该函数所指向的地址会出错。从而程序跑飞了,死机。
我们可以在使用该函数之前,加一个函数的地址判断,如果函数的地址入口正确,则使用,如果不正确,则重启
debug = (Uint32)&hNandInfo->hEccInfo->fxnEnable;
if((debug & 0x000FFFF0) == Debug)
{
#ifdef DM365_Ipnc_debug
DEBUG_printString("debug = ");
DEBUG_printHexInt(debug);
DEBUG_printString("\r\n");
#endif
(*hNandInfo->hEccInfo->fxnEnable)(hNandInfo);
}
else
{
#ifdef DM365_Ipnc_debug
DEBUG_printString("debug = ");
DEBUG_printHexInt(debug);
DEBUG_printString("\r\n");
#endif
TIMER2_WDTInit();
}
其中TIMER2_WDTInit()是一个看门狗函数,看门狗函数如下:
void TIMER2_WDTInit()
{
//TIMER2_TCR &= ~(0x1 << 8); //NTERNAL - Internal cloc
TIMER2_WDTCR = 0x00; //清除WDT
TIMER2_TGCR = 0x00;
//TIMER2_TGCR |= ((0x02 <<2) | (0x1) | (0x1<<1));//64bit wdt,Reser timer
TIMER2_TGCR &= ~(0x03<<2);
TIMER2_TGCR |= (0x02<<2);
TIMER2_TGCR |= 0x03;
TIMER2_PRD34 = 0x00000000;
TIMER2_PRD12 = 0x07270E00; //5s
//TIMER2_PRD12 = 0x016E3600; //1s
TIMER2_PRD12 = 0x00000000;
TIMER2_TIM12 = 0;
TIMER2_TIM34 = 0;
//TIMER2_TCR &= (0x0 << 6);//countinue timer
TIMER2_WDTCR = 0x01 << 15; //清除看门狗标志位
TIMER2_WDTCR = 0x01 << 14; //看门狗使能
TIMER2_WDTCR = (0xA5C64000);
TIMER2_WDTCR = (0xDA7E4000);
}