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:EK-TM4C1294XL

Guru**** 2538955 points
Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1163205/ek-tm4c1294xl-ek-tm4c1294xl

器件型号:EK-TM4C1294XL

尊敬的 TI 支持:

我有 EK-TM4C1294XL 评估套件。 我下载了 SPMA072 (用于 TM4C129x 的串行转以太网转换器)。

我能够使用 CCS 11.2.0进行编译。 应用程序运行正常、我可以打开 Web 服务器。

目前、我使用已在开发板中编程的 MAC 地址。 标签上显示的那个。

但是、我的应用程序将从外部 MAC 芯片读取 MAC 地址。 我已经编写了代码从该芯片读取 MAC 地址。  

目前、我正在使用 BOOT_EMAC_FLASH 进行固件更新。 它从用户寄存器 ui32User0和 ui32User1中读取 MAC 地址。

我要做的是将我从 MAC 芯片获取的 MAC 地址写入用户寄存器、这样当 boot_emac_flash 接管时、它将从它读取 MAC 地址。  

您是否有如何写入 NV 用户寄存器的示例代码? 我查看了示例代码文件夹、但不确定是否存在。

非常感谢您的帮助。

Felix

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

    您好、Felix、

     请使用这两个 API。 从外部读取 MAC 地址后、应 写入 USER_REG0和 USER_REG1、因为这是以太网堆栈将读取以获取 MAC 地址的两个寄存器。  请注意、一旦您承诺永久保存这些寄存器、除非执行解锁操作、否则它们是不可逆的。  

    请阅读数据表中的参考说明。  

    下面的这篇文章也将非常有用。  

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/969133/tm4c1294kcpdt-how-to-program-mac-address-during-app-code-programming/3580187?tisearch=e2e-sitesearch&keymatch=FlashAllUserRegisterSet#3580187

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

    感谢 Charles、由于某种原因、FlashAllUserRegisterSet 不适合我。 在以下代码中、我输入 了 user0和 user1的硬编码值作为测试。 我使用 MAP_FlashUserGet 回读、但 usermem0和 usermem1始终返回值0。 我在 FlashAllUserRegisterSet 之后添加了一个延迟、以防需要一段时间才能完成写入。 我不会得到错误、就像它在写入时没有错误一样、但是我读回的值不正确。 有什么建议吗? 非常感谢您的帮助。 Felix

    if (FlashAllUserRegisterSet (0xFF801F12、0xFFE097F9、0xFFFFFFFF、0xFFFFFFFF)!= 0)

    UARTprintf ("写入 MAC 地址失败\n");

    SysCtlDelay (SysCtlClockGet ()/3);

    map_FlashUserGet (&usermem0、&usermem1);

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

    您好、Felix、

     这是一款全新的器件吗? 您能否尝试先解锁设备、以便将其恢复为出厂设置、然后再试一次? 我尝试使用您的代码、得到了正确的值。 请参见下面的。  

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

    您好、Charles、这是我收到的一个新电路板、我下载了我的应用程序。 我以前从未尝试过写入用户寄存器。 如何解锁器件?

    谢谢、Felix  

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

    您好、Felix、

     您有哪种调试探针? 如果是 XDS 类型的调试探针来解锁器件、请遵循第5.3.2节。  https://www.ti.com/lit/pdf/spma075

     我还建议您尝试在 LaunchPad 上对 USER_REGx 进行编程、以了解它应该如何工作。 请注意、对 MAC 地址进行编程并提交后、必须先解锁器件、然后才能对新 MAC 进行编程。  

      

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

    您好、Charles、我有 XDS200探针。 我在 LaunchPad 上尝试过相同的代码、也获得了错误的值。 我知道 LaunchPad 附带了使用 MAC 地址进行编程的用户寄存器。 我不知道是否已锁定。  当您说 MAC 地址已提交时、您是说 FlashAllUserRegisterSave 已执行? FlashAllUserRegisterSet 意味着器件已编程但未通信、因此未锁定、这是正确的吗?

    谢谢、

    Felix

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

    您好 Charles、您是否可以向我发送用于测试用户注册的代码? 我甚至修改了示例文件夹中的 Simple Blinky 项目并添加了用户寄存器读取、但仍然无法获得正确的值。 我不知道我做了什么错。 我只是尝试读取 LaunchPad 背面标签中显示的 MAC 地址。

    Felix  

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

    您好、Felix、  

     这是我使用的代码、实际上来自您。 我甚至没有提交 MAC 地址更改。 但是、我首先解锁器件、以便在运行程序之前 MAC 全部为0xF。  

    #include <stdint.h>
    #include <stdbool.h>
    #include "inc/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/rom.h"
    #include "driverlib/rom_map.h"
    #include "driverlib/eeprom.h"
    #include "driverlib/flash.h"
    #include "driverlib/uart.h"
    #include "utils/uartstdio.h"
    
    
    
    //*****************************************************************************
    //
    // Define pin to LED mapping.
    //
    //*****************************************************************************
    
    //*****************************************************************************
    //
    //! \addtogroup example_list
    //! <h1>Project Zero (project0)</h1>
    //!
    //! This example demonstrates the use of TivaWare to setup the clocks and
    //! toggle GPIO pins to make the LED blink. This is a good place to start
    //! understanding your launchpad and the tools that can be used to program it.
    //
    //*****************************************************************************
    
    #define USER_LED1  GPIO_PIN_0
    #define USER_LED2  GPIO_PIN_1
    
    uint32_t ui32SysClock;
    
    
    //*****************************************************************************
    //
    // The error routine that is called if the driver library encounters an error.
    //
    //*****************************************************************************
    #ifdef DEBUG
    void
    __error__(char *pcFilename, uint32_t ui32Line)
    {
    }
    #endif
    
    void
    ConfigureUART(void)
    {
    	//
    	// Enable the GPIO Peripheral used by the UART.
    	//
    	MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    
    	//
    	// Enable UART0
    	//
    	MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
    
    	//
    	// Configure GPIO Pins for UART mode.
    	//
    	MAP_GPIOPinConfigure(GPIO_PA0_U0RX);
    	MAP_GPIOPinConfigure(GPIO_PA1_U0TX);
    	MAP_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    
    	//
    	// Initialize the UART for console I/O.
    	//
    	UARTStdioConfig(0, 115200, ui32SysClock);
    }
    //*****************************************************************************
    //
    // Main 'C' Language entry point.  Toggle an LED using TivaWare.
    //
    //*****************************************************************************
    int
    main(void)
    {
    	uint32_t usermem0, usermem1;
    
    	//
    	// Run from the PLL at 120 MHz.
    	//
    	ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
    			SYSCTL_OSC_MAIN |
    			SYSCTL_USE_PLL |
    			SYSCTL_CFG_VCO_480), 120000000);
    
    	ConfigureUART();
    
    
    
    	if(FlashAllUserRegisterSet(0x12345678, 0xFFE097F9, 0xFFFFFFFF, 0xFFFFFFFF) != 0)
    	{
    		UARTprintf("Failed to write MAC address\n");
    	}
    
    	SysCtlDelay(SysCtlClockGet()/3);
    
    	MAP_FlashUserGet(&usermem0, &usermem1);
    	while(1);
    }

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

    另外,如果您看一些以太网示例,FlashUserGet ()用于读出 user0和 user1寄存器。  

        //
        // 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)
            {
            }
        }

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

    谢谢 Charles、您说得对。 解锁器件后、我能够正确编程和回读。  

    非常感谢您的出色支持。

    Felix