我用的sdk版本是dvsdk_4.02, 在调试中发现了一个很隐蔽的问题:通过外部NANDflash启动,在RBL启动UBL时会偶尔失败,概率是1/3000 左右,不知道是什么原因,大家有没有出现过这种情况。
Louis:
你好,
启动失败有什么错误信息么?能不能提供一下logs?
yongjian huang:
回复 Louis:
你好,
我调试时在UBL 的DEVICE_init()函数里加了看门狗复位操作让程序不断做重启,当启动失败出现时没有任何打印(RBL本身没有打印信息的,只有UBL在初始化串口后才能打印信息),我怀疑是在RBL启动UBL阶段出现了问题,即程序还没有进入UBL就已经失败了,DEVICE_init()函数修改如下(红色部分):
Uint32 DEVICE_init(){ Uint32 status = E_PASS; // Mask all interrupts AINTC->INTCTL = 0x4; AINTC->EABASE = 0x0; AINTC->EINT0 = 0x0; AINTC->EINT1 = 0x0; // Clear all interrupts AINTC->FIQ0 = 0xFFFFFFFF; AINTC->FIQ1 = 0xFFFFFFFF; AINTC->IRQ0 = 0xFFFFFFFF; AINTC->IRQ1 = 0xFFFFFFFF;
POR_RESET(); WDT_RESET();
#ifndef SKIP_LOW_LEVEL_INIT
// System PSC setup – enable all DEVICE_PSCInit(); DEVICE_pinmuxControl(0,0xFFFFFFFF,0x00FD0000); // All Video Inputs DEVICE_pinmuxControl(1,0xFFFFFFFF,0x00145555); // All Video Outputs DEVICE_pinmuxControl(2,0xFFFFFFFF,0x000000DA); // EMIFA DEVICE_pinmuxControl(3,0xFFFFFFFF,0x00180000); // SPI0, SPI1, UART1, I2C, SD0, SD1, McBSP0, CLKOUTs DEVICE_pinmuxControl(4,0xFFFFFFFF,0x55555555); // MMC/SD0 instead of MS, SPI0
GPIO->DIR02 &= 0xfeffffff; GPIO->CLRDATA02 = 0x01000000;
if (status == E_PASS) status |= DEVICE_PLL1Init();
if (status == E_PASS) status |= DEVICE_PLL2Init();
if (status == E_PASS) status |= DEVICE_DDR2Init();
#endif // AEMIF Setup if (status == E_PASS) status |= DEVICE_EMIFInit();
// UART0 Setup if (status == E_PASS) status |= DEVICE_UART0Init();
// TIMER0 Setup if (status == E_PASS) status |= DEVICE_TIMER0Init(); // I2C0 Setup if (status == E_PASS) status |= DEVICE_I2C0Init();
WDT_FLAG_ON();
DEBUG_printString("WDT_RESET—————1\r\n"); WDT_RESET();
while(1) { DEBUG_printString(" wait WDT_RESET\r\n"); }
return status;}
yongjian huang:
回复 yongjian huang:
关于这个问题我尝试在ubl中修改dm365的运行频率,从原来的Arm 297 DDR2 243 MHZ 修改为ARM 216 DDR2 173 MHz,重启失败就不会出现了,失败的时候DDR2还没开始运行代码啊,难道dm365在297频率下无法稳定工作?