This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C6748烧写程序NORWriter_DSP老跑飞

Other Parts Discussed in Thread: OMAP-L138

通过官网下载的OMAP-L138_FlashAndBootUtils_2_40里面的NORWriter_DSP程序烧写到外部norflash,在输入bin文件敲回车后经常卡主很久不动,点击暂停后显示未知地址。。。

还有个问题,自己的程序,很随机会出现连接仿真器后跑飞现象,就是连接后程序自己run了,点暂停后也是未知地址。。请问是gel文件问题吗?

  • 1. 如果是自己的板子,需要根据您板子的硬件做修改后重新编译norwriter。
    processors.wiki.ti.com/.../Serial_Boot_and_Flash_Loading_Utility_for_OMAP-L138

    2. 只有"自己的程序"会出现跑飞的现象吗?例程会跑飞吗?程序跑飞,可以增加堆栈试试。硬件上检查一下电源是否稳定干净,reset信号是否足够长?
  • 请问是购买的开发板吗?如果是的话用以下路径中的GEL文件测试一下。
    ccs_<version>\ccs_base\emulation\boards
    烧写部分的log打印信息贴出来看一下。
  • 您好,对照连接里需要改device。c的pll初始化,但是看下载的NORWriter_DSP里面#ifndef SKIP_LOW_LEVEL_INIT 直接将PLL部分屏蔽着,需要解开吗?每次都是输入bin文件地址后没动静,有没有其他什么原因会让fflush函数卡死?
    只有自己的程序会跑飞吧。。。例程基本没怎么用过,一直都是将例程里内容copy出来调试的。我在把堆栈增加去试试,这个很随机,目前还没找到固定重现操作。
  • 您好,不是开发板,自己的板子。。也不是每次都出现,基本连接20次会随机出现1~2次。
  • Camel Santo 说:
    但是看下载的NORWriter_DSP里面#ifndef SKIP_LOW_LEVEL_INIT 直接将PLL部分屏蔽着,需要解开吗?

    如果是用CCS运行程序,通常加了gel文件初始化PLL,PSC,DDR等,所以可以屏蔽。用户程序最终是脱离仿真器跑,则要打开,或者通过AISgen里配置也可以。

    如果只是烧NOR flash,直接用TI的例程就可以的。

    是不是DDR不稳定,有没有测试过DDR或者检查过DDR的配置? 

  • 不用解开。PLL已经在GEL文件里配好了。fflush函数是用来清空输入缓冲区,如果卡死的话,可能是Memory不稳定。
  • 您好,是用的TI例程,什么都没改,只是给添加了自己板子用的gel文件,但是经常会碰到bin文件地址输入后就没动静了,最终手动停止地址大概在0x7xxxxx内部rom。。前面几步读flash配置,大小都很稳健可以看到反馈信息。

    所有程序一直都在外部DDR跑的,还没遇到过不稳定现象。

  • 只是从console窗口反馈看到nor 初始化都一直正常,只有输入ais路径后才会卡主不动了(“INFO: File read complete.”显示不出来),手动停止地址大概一直在0x713d4e 左右。。。Memory 不稳?有什么办法改善吗?
  • 检查一下板子的供电电源的稳定性,再按照Tony说的做一下DDR的压力测试。
    另外,看一下是否只有这个板子有问题?
  • 有3块板子,都是同样的问题。

    好的,我去测测DDR。

  • Camel Santo 说:
    在输入bin文件敲回车后经常卡主很久不动,

    意思是说有时是成功的?多数情况下有问题?

    Camel Santo 说:
    点击暂停后显示未知地址。。。

    你提到过的地址0x7xx是芯片ROM的地址,也就是跑飞以及复位了

    Camel Santo 说:
    还有个问题,自己的程序,很随机会出现连接仿真器后跑飞现象,就是连接后程序自己run了,点暂停后也是未知地址。。请问是gel文件问题吗?

    你也可不加gel文件连接仿真器看是否有同样的问题。

    另外,你有确认你的板子的NAND的位宽跟gel文件里的配置一样吗?也就是说8bit还是16bit?

  • Camel Santo 说:
    好的,我去测测DDR。

    这里有DDR压力测试例程:

    https://e2echina.ti.com/question_answer/dsp_arm/omap_l1x/f/54/t/121580

  • 您好, 有时成功,有时卡死,很随机,曾专门试过成功时 连续写5次都能成功,卡死时需要多次reload也会成功,有时也会reload很多次依旧失败。单步NORWriter_DSP程序跟踪到fread(appPtr, 1, appFileSize, fPtr)然后就卡死了。。。我是NORflash,不是NANDflash。。。
    不加GEL也是同样情况,时好时坏。
  • 这行代码是一个纯粹的读文件到DDR上的操作。你的板子跑别的代码有什么问题吗?

    static Uint32 norwriter()
    {
    NOR_InfoHandle hNorInfo;

    FILE *fPtr;
    Uint8 *appPtr;
    Int32 appFileSize = 0;
    Int8 fileName[256];
    Uint32 baseAddress = 0;

    DEBUG_printString("Starting ");
    DEBUG_printString((String)devString);
    DEBUG_printString(" NORWriter.\r\n");

    // Initialize NOR Flash
    hNorInfo = NOR_open((Uint32)LOCAL_norBase, DEVICE_BUSWIDTH_16BIT );
    if (hNorInfo == NULL)
    {
    DEBUG_printString( "\tERROR: NOR Initialization failed.\r\n" );
    return E_FAIL;
    }

    // Set base address to start putting data at
    baseAddress = hNorInfo->flashBase;

    // Read the UBL file from host
    DEBUG_printString("Enter the binary AIS application file name (enter 'none' to skip): \r\n");
    DEBUG_readString(fileName);
    fflush(stdin);

    if (strcmp(fileName,"none") != 0)
    {
    // Open an File from the hard drive
    fPtr = fopen(fileName, "rb");
    if(fPtr == NULL)
    {
    DEBUG_printString("\tERROR: File ");
    DEBUG_printString(fileName);
    DEBUG_printString(" open failed.\r\n");
    return E_FAIL;
    }

    // Initialize the pointer
    appFileSize = 0;

    // Read file size
    fseek(fPtr,0,SEEK_END);
    appFileSize = ftell(fPtr);

    // Check to make sure image was read correctly
    if(appFileSize == 0)
    {
    DEBUG_printString("\tERROR: File read failed.\r\n");
    fclose (fPtr);
    return E_FAIL;
    }
    // Check to make sure the app image will fit
    else if ( appFileSize > hNorInfo->flashSize )
    {
    DEBUG_printString("\tERROR: File too big.. Closing program.\r\n");
    fclose (fPtr);
    }

    // Setup pointer in RAM
    appPtr = (Uint8 *) UTIL_allocMem(appFileSize);

    fseek(fPtr,0,SEEK_SET);

    if (appFileSize != fread(appPtr, 1, appFileSize, fPtr))
    {
    DEBUG_printString("\tWARNING: File Size mismatch.\r\n");
    }

    fclose (fPtr);

    DEBUG_printString("\tINFO: File read complete.\r\n");

    // Erase the NOR flash to accomodate the file size
    if (NOR_erase( hNorInfo, baseAddress, appFileSize ) != E_PASS)
    {
    DEBUG_printString("\tERROR: Erasing NOR failed.\r\n");
    return E_FAIL;
    }

    // Write the application data to the flash
    if (NOR_writeBytes( hNorInfo, baseAddress, appFileSize, (Uint32)(appPtr)) != E_PASS)
    {
    DEBUG_printString("\tERROR: Writing NOR failed.\r\n");
    return E_FAIL;
    }

    // Verify memory contents
    {
    // temp: check flash mem
    int i;

    DEBUG_printString("Checking flash contents... ");
    for (i = 0; i < appFileSize; i++)
    {
    if (*(Uint8 *)(LOCAL_norBase + i) != *(appPtr + i))
    {
    DEBUG_printString("Failed! (");
    DEBUG_printHexInt(i);
    DEBUG_printString(" bytes successful)\r\n");
    //return E_FAIL;
    }
    }
    DEBUG_printString("Passed! (");
    DEBUG_printHexInt(appFileSize);
    DEBUG_printString(" bytes)\r\n");
    }
    }
    return E_PASS;
    }

  • 您好,

    我所有程序都是在外部DDR跑的,其他程序跑起来很稳定,不过偶尔会出现仿真器连接后未停到main入口,概率很小。