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.

[参考译文] TM4C129ENCPDT:如何动态更改 MAC (尚未保存在 NV 寄存器中)?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1380013/tm4c129encpdt-how-to-change-mac-not-saved-yet-in-nv-registers-on-the-fly

器件型号:TM4C129ENCPDT

工具与软件:

我尚未将 MAC 保存到 NV 寄存器、我替代临时 MAC。 它能够正常工作、器件获取基于我的替代 MAC 的 IP。
现在、出于调试目的、我想以编程方式将该 MAC 替换为另一个 MAC、并使用新的 MAC/IP 重新建立 DHCP 会话、而无需重新启动处理器

 我正在使用 lwiplib.c (lwIP TCP/IP 库抽象层)库、但没有 RTOS。

已尝试呼叫 MAP_EMACAddrSet (EMAC0_BASE、0、(uint8_t *) NewMAC) 和  dhcp_renew (&g_sNetIF)  (从 lwiplib.c)之后、它不起作用。
也尝试了与的各种组合  dhcp_release() DHCP_STOP() DHCP_START() 、  DHCP_NETWORK_CHANGED() 、无结果。

我现在能做到吗?

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

    您好!

     我建议您使用新的 MAC 地址调用 lwIPInit 来重新启动 lwip。   

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

    我很抱歉、忘了提及我已尝试此功能、代码与 FaultISR...崩溃
    这是我尝试过的:

    const uint8_t SubstMACArray[6] = {0xDE, 0xAD, 0x00, 0xBE, 0xAF, 0x00,}; //Temporal MAC to substitute
    lwIPInit(g_ui32SysClock, SubstMACArray, 0, 0, 0, IPADDR_USE_DHCP);


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

    在什么上下文中插入上述2行代码。  

    在 TivaWare 示例中、以下是用于 初始化 lwIP 的内容。 我真的看不出  pui8MACArray 和 SubstMACArray 之间有什么区别 。

    //
    // 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);

    //
    // Initialize the lwIP library, using DHCP.
    //
    lwIPInit(g_ui32SysClock, pui8MACArray, 0, 0, 0, IPADDR_USE_DHCP);

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

      由于未在 NV RAM 中对 MAC 进行编程、因此我未使用 ui32User0和 ui32User1 、并且分别为 MAP_FlashUserGet (&ui32User0、&ui32User1)返回所有0xFF。 以下是我的初始化代码:

    Pui8MACArray[0] = 0x12;
    pui8MACArray[1] = 0x34;
    pui8MACArray[2] = 0x56;
    pui8MACArray[3] = 0x78;
    pui8MACArray[4] = 0x9A;
    pui8MACArray[5] = 0xBC;
    // Initialize the lwIP library, using DHCP.
    lwIPInit(g_ui32SysClock, pui8MACArray, 0, 0, 0, IPADDR_USE_DHCP);

    以太网使用此类 MAC、我成功获得 IP、并且可进行定标。
    稍后、通过某种事件(UART 命令)、当我需要更改 MAC 时、我将执行以下两行:

    uint8_t SubstMACArray[6] = {0xDE, 0xAD, 0x00, 0xBE, 0xAF, 0x00,}; //Temporal MAC to substitute
    lwIPInit(g_ui32SysClock, SubstMACArray, 0, 0, 0, IPADDR_USE_DHCP);

    在这里它崩溃到 FaultISR ()无限循环...

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

    您好!

     我不确定导致它崩溃的原因。 您能否使用此应用手册来诊断问题。  StellarisRegistered微控制器软件故障诊断

     收到 UART 命令后、可能需要先尝试重置以太网模块、然后再重新启动 lwIP。 您可以使用以下 API 来复位以太网模块。 在任何情况下、首先使用应用手册来诊断故障。  

    MAP_SysCtlPeripheralReset (SYSCTL_PERIPH_EMAC0);

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

    感谢您指向应用手册。

    尝试跟踪故障,我看到 NVIC_FAULT_ADDR 在进入 FaultISR()无限循环时具有0xABCD0011值。
    但我并不真正理解它的含义、我无法在内存映射中找到该值。。

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

    您好!

     0xABCD0011是无效地址、因此是故障。 您需要回溯汇编指令以找出 从该地址读取的是哪条指令。 下面只是一个示例。  

    LDR R0、[R1];其中 R1包含0xABCD0011的值。  

    执行上述指令时、将导致故障、因为此指令尝试从地址0xABCD0011进行存储器读取。  

    您也可能没有足够的堆栈内存。 尝试增加堆栈内存、看看它是否起作用。  

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

    好的、谢谢、我们将尝试进行更深入的诊断。
    它不是堆栈问题,已尝试将它增加3倍,没有帮助。
    另外、已经尝试 在重新启动 lwIP 前使用 MAP_SysCtlPeripheralReset (SYSCTL_PERIPH_EMAC0)、相同的结果-没有帮助。

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

    您好!

     而不调用以下两行。  

    uint8_t SubstMACArray[6]={0xDE、0xAD、0x00、0xBE、0xAF、 0x00、};//Temporal MAC to substitution
    lwIPInit (g_ui32SysClock、SubstMACArray、0、0、0、 ipaddr_use_dhcp);

    您可以按如下所示重复第一次初始化的相同调用吗? 是否也会收到故障?

    Pui8MACArray[0]= 0x12;
    PUi8MACArray[1]= 0x34;
    pui8MACArray[2]= 0x56;
    PUi8MACArray[3]= 0x78;
    pui8MACArray[4]= 0x9A;
    PUi8MACArray[5]= 0xBC;
    //使用 DHCP 初始化 lwIP 库。
    lwIPInit (g_ui32SysClock、pui8MACArray、0、0、0、 ipaddr_use_dhcp);

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

    哎呀。。。 抱歉... 意外单击"这解决了我的问题"、不知道如何还原它。
    否它没有帮助、重复相同的调用仍会导致代码崩溃...

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

    不要担心误点击。 只要您写入此帖子、帖子的状态就会保持打开状态。  

    您是否进一步了解导致故障的指令? 您还能详细说明一下撞击是什么意思吗? 您是否受困于错误 ISR?

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

    否、我没有查看导致故障的指令、可能是下周...
    是的、即使我重复完全相同的代码、也会遇到无限循环的故障 ISR。

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

    您好!

     我只需运行一个简单的测试、将 lwIPInit 重复两次、但是我看不到崩溃的问题。 我不知道在什么上下文中再次调用 lwIPInit。 我建议您使用我提到的应用手册回溯到导致故障的指令。  

    //
    // 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);

    //
    // Initialize the lwIP library, using DHCP.
    //
    lwIPInit(g_ui32SysClock, pui8MACArray, 0, 0, 0, IPADDR_USE_DHCP);

    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);

    //
    // Initialize the lwIP library, using DHCP.
    //
    lwIPInit(g_ui32SysClock, pui8MACArray, 0, 0, 0, IPADDR_USE_DHCP);