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.

[参考译文] EK-TM4C1294XL:引导加载程序问题

Guru**** 2454880 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1497566/ek-tm4c1294xl-boot-loader-question-s

器件型号:EK-TM4C1294XL

工具/软件:

你好查尔斯:)所以让我们继续在这里...

因此、与此同时、我设法让引导加载程序工作... 影响。 我这样说是因为它是有效的、但我必须提出一些问题。

首先、我使用"Blinky"来测试 ROM 引导加载程序。 这是有效的、但在 Blinky 和引导加载程序中的时序并不是真正相同的。 所以、通常我认为系统中有用于定义频率等延迟例程的晶体。 Blinky 正常地闪烁了几毫秒开关,但当我用 ROM 引导加载程序上传它时,它开始振动而不是闪烁。 然后我看到延迟例程在闪烁,它实际上是一个空循环。

1.为什么闪烁的速度要快得多?

然后、我尝试调查调试端口上的打印输出。 我找不到代码中实际在调试端口上打印字符的那一刻。  

2.我应该去哪里?

因此我插入了以下内容:

UARTCharPut (UART0_BASE、'\n');
  for (i = 0g_pcMACAddr[i]!='\0';i++)
    UARTCharPut (UART0_BASE、g_pcMACAddr[i]);
  UARTCharPut (UART0_BASE、'\n');

  用于(i = 0g_pcIPAddr[i]!='\0';i++)
    UARTCharPut (UART0_BASE、g_pcIPAddr[i]);
  UARTCharPut (UART0_BASE、'\n');

  UARTCharPut (UART0_BASE、'W'); //"等待"
  UARTCharPut (UART0_BASE、'8');
  UARTCharPut (UART0_BASE、'\n');
它没有全部打印出来,但最后3个字符为 W8
实际的打印输出来自名为 SetupForEthernet()的函数
usnprintf (g_pcMACAddr、size_MAC_ADDR_BUFFER、
       "Mac:%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x"
       pui8MACAddr[0]pui8MACAddr[1]pui8MACAddr[2]、pui8MACAddr[3]
       pui8MACAddr[4]pui8MACAddr[5]);

  //
  //请记住、我们还没有 IP 地址。
  //
  usnprintf (g_pcIPAddr、size_IP_ADDR_BUFFER、"ip:not assigned");
3.这个代码是如何在调试端口上打印的?
4、为什么它没有打印 MAC 和 IP ,只有"W8"?
感谢所有的建议!
Gabor
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    首先、我使用"blanky"测试 ROM 引导加载程序。 这是有效的、但在 Blinky 和引导加载程序中的时序并不是真正相同的。 所以、通常我认为系统中有用于定义频率等延迟例程的晶体。 Blinky 正常地闪烁了几毫秒开关,但当我用 ROM 引导加载程序上传它时,它开始振动而不是闪烁。 然后我在 Blinky 中看到了延迟例程,它实际上是一个空循环。
    1. 为什么闪烁更改为更快?

    这是什么盲计划? 这个是您自己的 blanky 或 blanky 示例 TivaWare。 一旦加载了闪烁程序或任何程序、延迟或闪烁速率应基于应用程序初始化期间配置的系统时钟。 换句话说、您应该看到与使用 JTAG 加载闪烁程序相同的闪烁速率。 我不明白你的意思,闪烁的速度变得振动,我想快得多。  

    为什么您不先加载 TivaWare blinky 示例? 您是否看到使用以太网加载它与使用 JTAG 加载之间的盲率不同?

    [引述 userid="646799" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1497566/ek-tm4c1294xl-boot-loader-question-s

    然后、我尝试调查调试端口上的打印输出。 我找不到代码中实际在调试端口上打印字符的那一刻。  

    2.我应该去哪里?

    因此我插入了以下内容:

    UARTCharPut (UART0_BASE、'\n');
      for (i = 0g_pcMACAddr[i]!='\0';i++)
        UARTCharPut (UART0_BASE、g_pcMACAddr[i]);
      UARTCharPut (UART0_BASE、'\n');

      用于(i = 0g_pcIPAddr[i]!='\0';i++)
        UARTCharPut (UART0_BASE、g_pcIPAddr[i]);
      UARTCharPut (UART0_BASE、'\n');

      UARTCharPut (UART0_BASE、'W'); //"等待"
      UARTCharPut (UART0_BASE、'8');
      UARTCharPut (UART0_BASE、'\n');
    它没有全部打印出来,但最后3个字符为 W8
    实际的打印输出来自名为 SetupForEthernet()的函数
    usnprintf (g_pcMACAddr、size_MAC_ADDR_BUFFER、
           "Mac:%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x"
           pui8MACAddr[0]pui8MACAddr[1]pui8MACAddr[2]、pui8MACAddr[3]
           pui8MACAddr[4]pui8MACAddr[5]);

      //
      //请记住、我们还没有 IP 地址。
      //
      usnprintf (g_pcIPAddr、size_IP_ADDR_BUFFER、"ip:not assigned");
    3.这个代码是如何在调试端口上打印的?
    4、为什么它没有打印 MAC 和 IP ,只有"W8"?
    [/报价]

    如何 在程序中用 MAC 地址加载 g_pcMACAddr? 为什么不提到 enet_lwip 示例? MAC 地址存储在 USER0/User1寄存器中。 如果您查看 enet_lwip、它会调用 FlashUserGet 将 MAC 地址存储到 ui32User0和 ui32User1变量中、然后将其分配给 pui8MacArray 数组、在此处 将其传递到 lwIPInit ()函数。 如果要打印出 MAC 地址、您将首先调用 FlashUserGet、 然后将其从 UART 发送出去。 如果需要、可以使用 UARTCharPut、但有一个更方便的 UARTPrintf() API 可将字符串发送到终端。   

        //
        // Configure the hardware MAC address for Ethernet Controller filtering of
        // incoming packets.  The MAC address will be stored in the non-volatile
        // USER0 and USER1 registers.
        //
        MAP_FlashUserGet(&ui32User0, &ui32User1);
        if((ui32User0 == 0xffffffff) || (ui32User1 == 0xffffffff))
        {
            //
            // We should never get here.  This is an error if the MAC address has
            // not been programmed into the device.  Exit the program.
            // Let the user know there is no MAC address
            //
            UARTprintf("No MAC programmed!\n");
            while(1)
            {
            }
        }
    
        //
        // Tell the user what we are doing just now.
        //
        UARTprintf("Waiting for IP.\n");
    
        //
        // Convert the 24/24 split MAC address from NV ram into a 32/16 split MAC
        // address needed to program the hardware registers, then program the MAC
        // address into the Ethernet Controller registers.
        //
        pui8MACArray[0] = ((ui32User0 >>  0) & 0xff);
        pui8MACArray[1] = ((ui32User0 >>  8) & 0xff);
        pui8MACArray[2] = ((ui32User0 >> 16) & 0xff);
        pui8MACArray[3] = ((ui32User1 >>  0) & 0xff);
        pui8MACArray[4] = ((ui32User1 >>  8) & 0xff);
        pui8MACArray[5] = ((ui32User1 >> 16) & 0xff);

    在任何情况下、我都会建议您:

    1.擦除闪存

    2.使用 ROM 基础以太网引导加载程序加载 TivaWare 示例 enet_lwip。 您还可以加载其他示例、例如 enet_io 或 enet_tcppecho_server。  

    3.使用 Wireshark 查看 ROM 引导加载程序如何使用 TFTP 协议加载程序。