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.

[参考译文] TM4C129XNCZAD:为什么 LM 闪存不#39;t 在通过以太网闪存时提供地址偏移

Guru**** 2391665 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/1065727/tm4c129xnczad-why-lm-flash-doesn-t-provide-address-offset-while-flashing-through-ethernet

器件型号:TM4C129XNCZAD
Thread 中讨论的其他器件:EK-TM4C1294XL

为什么 LM Flasher 在尝试以太网闪存时不提供地址偏移? 或者在跳转到  ROM_UpdateEMAC()之前如何更改应用程序地址? 默认情况下、它会在地址0x00闪烁应用程序。

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

    您好!

    [引用 userid="509149" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1065727/tm4c129xnczad-why-lm-flash-doesn-t-provide-address-offset-while-flashing-through-ethernet "]默认情况下,它会在地址0x00处刷写应用程序。

     它从0x0开始的原因是链接器命令文件指定应用程序从0x0开始。 假设您希望应用程序在0x4000处启动。 您首先需要构建应用程序、以便使用链接器命令文件将程序重定位到0x4000。 请参阅目录 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\boot_demo_emac_flash 中的 boot_demo_emac_ccs.cmd 文件的以下示例。 请参阅以下.cmd 文件的片段。  

    /*应用程序的起始地址。 通常是中断矢量*/
    /*必须位于应用程序的开头。 *
    #define APP_BASE 0x00004000
    #define RAM_base 0x20000000

    /*系统内存映射*/

    存储器

    /*存储在内部闪存中并从内部闪存执行的应用程序*/
    闪存(RX):origin = app_BASE,length = 0x000fc000
    /*应用程序使用内部 RAM 进行数据*/
    SRAM (rwx):origin = 0x20000000,length = 0x00040000

     请记住、当您将应用程序重新定位到0x4000或其他偏移时、0x0和0x4000之间的值是多少? 通常、在闪存存储器的该区域中会有一个基于闪存的引导加载程序。 当闪存基础引导加载程序看到应用程序存在时、它将跳转到应用程序。 如果引导加载程序在0x4000处(或指定的任何位置)看不到应用程序、则会尝试从以太网端口引导加载。 由于您正在调用  ROM_UpdateEMAC(),因此我假设您在0x0处没有基于闪存的引导加载程序。 如果在0x0没有代码并且只有0x4000处的应用程序、那么复位后、CPU 将不会在0x0和0x4处看到堆栈指针和复位矢量。 这可能会导致程序崩溃。 换言之,您需要引导加载程序或有效代码从0x0开始,或者如果您只想通过调用 ROM_UpdateEMAC()来使用基于 ROM 的引导加载程序,那么您的应用程序应该启动0x0 (而不是0x4000或其他偏移量)。  

     请注意美国明天的假期、如果您有进一步的问题、我将无法回复、直到2022年4月1日回来。  

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

    您好、Charles、

    感谢您的回答。  

    我理解您的说法。 我的问题是不同的、假设我的闪存引导加载程序从0x00开始、我的应用程序从0x4000开始。 我只想写入应用程序(从0x4000开始)、换句话说、我只有一个二进制文件、其中包含应用程序代码、我想使用 EMAC 从 LM 闪存写入0x4000地址。 我该怎么做? 根据您的说法,我必须组合引导加载程序代码和应用程序代码,并制作一个二进制文件,然后通过 LM Flash 使用 EMAC 将其闪存为0x00。不是吗?  引导加载程序通常不会反复更新、但应用程序会多次更新、以修复异常或增强功能等

    根据此逻辑、偶数串行(UART)不应选择偏移地址。 只需在0x00写入所有内容,不是吗? 一

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="509149" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1065727/tm4c129xnczad-why-lm-flash-doesn-t-provide-address-offset-while-flashing-through-ethernet/3943528 #3943528">我的问题是不同的,假设我的闪存引导加载程序从0x00开始,而我的应用程序从0x4000开始。 我只想写入应用程序(从0x4000开始)、换句话说、我只有一个二进制文件、其中包含应用程序代码、我想使用 EMAC 从 LM 闪存写入0x4000地址。 我如何做到这一点?

    您好!

     我建议您尝试 boot_emac_flash (这是一个从0x0开始的引导加载程序)和 boot_demo_emac_flash (这是一个从0x4000开始的应用程序)。 运行这两个示例后、您将更好地了解引导加载程序的工作方式。  

     在 BOOT_EMAC_FLASH 工程中、您将在工程中找到 bl_config.h 文件。 请参阅以下片段、其中应用程序定义为从0x4000开始。 这就是引导加载程序知道如何在0x4000处对应用程序固件进行编程的方法。  

    //*****************************************************************************
    //
    // The starting address of the application.  This must be a multiple of 1024
    // bytes (making it aligned to a page boundary).  A vector table is expected at
    // this location, and the perceived validity of the vector table (stack located
    // in SRAM, reset vector located in flash) is used as an indication of the
    // validity of the application image.
    //
    // The flash image of the boot loader must not be larger than this value.
    //
    // Depends on: None
    // Exclusive of: None
    // Requires: None
    //
    //*****************************************************************************
    #define APP_START_ADDRESS       0x00004000
    
    //*****************************************************************************
    //
    // The address at which the application locates its exception vector table.
    // This must be a multiple of 1024 bytes (making it aligned to a page
    // boundary).  Typically, an application will start with its vector table and
    // this value should be set to APP_START_ADDRESS.  This option is provided to
    // cater for applications which run from external memory which may not be
    // accessible by the NVIC (the vector table offset register is only 30 bits
    // long).
    //
    // Depends on: None
    // Exclusive of: None
    // Requires: None
    //
    //*****************************************************************************
    #define VTABLE_START_ADDRESS    0x00004000
    
    //*****************************************************************************
    //
    // The size of a single, erasable page in the flash.  This must be a power
    // of 2.
    //
    // Depends on: None
    // Exclusive of: None
    // Requires: None
    //
    //*****************************************************************************
    #define FLASH_PAGE_SIZE         0x4000

    接下来、查看 boot_demo_emac_flash 项目中的 boot_demo_emac_flash_ccs.cmd 文件。 请参阅链接器命令文件的以下片段、其中应用程序会重定位到0x4000。  

    /* The starting address of the application.  Normally the interrupt vectors  */
    /* must be located at the beginning of the application.                      */
    #define APP_BASE 0x00004000
    #define RAM_BASE 0x20000000
    
    /* System memory map */
    
    MEMORY
    {
        /* Application stored in and executes from internal flash */
        FLASH (RX) : origin = APP_BASE, length = 0x000fc000
        /* Application uses internal RAM for data */
        SRAM (RWX) : origin = 0x20000000, length = 0x00040000
    }
    

    当闪存基础引导加载程序(BOOT_EMAC_FLASH)开始运行时、它会将应用程序(BOOT_DEMO_EMAC_FLASH)编程为0x4000。 您不使用 LM 闪存编程器为要编程的应用指定地址偏移量。  

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

    是的、这只能用于串行、我从未问过您有关串行的问题。 但以太网无法做到这一点。 为什么在以太网中禁用偏移地址? 这就是我要问的问题。

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

    好的、我似乎能够看到您的观察结果。  下面是我所做的。  

    -我首先修改了 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xboot_demo_emac_ROM 的链接器命令文件、以将 app_start 链接到0x4000。  

    -然后、我使用 JTAG 将 BOOT_EMAC_FLASH (闪存引导加载程序)加载到0x0。  

    -我让闪存引导加载程序与 LM 闪存编程器一起对应用程序进行编程、以使用以太网端口传输应用程序映像。  

    引导_EMAC_FLASH 将在0x4000处正确地对应用程序进行编程,因为我们可以指定应用程序将在何处使用 bl_config.h 文件进行编程。  

    - boot_demo_emac_rom 运行后,它将调用 ROM_UpdateEMAC()并将控件传输到 ROM 引导加载程序。  

    - ROM 引导加载程序无法在0x4000而不是0x0处对 BOOT_DEMO_EMAC_ROM 进行编程。  

    我不知道为什么 ROM EMAC 引导加载程序只对0x0处的任何映像进行编程。 ROM 不是在器件释放后可以改变的东西。 我建议您改用闪存引导加载程序。 如前所述、即使您可以成功使用 ROM 引导加载程序在0x4000处对应用程序进行编程、但在0x0和0x3FFF 之间仍有一个空空间。 由于处理器必须在0x0和0x4处看到一个有效的堆栈指针和复位向量、因此它无论如何都不起作用。 如果您要在0x0处使用闪存引导加载程序等程序、您可能也只需使用基于闪存的引导加载程序来对您的应用程序进行编程、而不是使用 ROM 引导加载程序。  

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

    最后、您了解了我的问题、但无法提供解决方案。 无论如何、我们最终发现了一个错误、我希望它能够在下一个芯片版本中得到解决。 谢谢你。

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

    Parvez、您好!

    此功能不是器件错误。 这是 ROM 引导加载程序的预期设计。 启动时、引导加载程序需要知道在哪个地址查找有效的应用程序、然后才能配置引导加载程序并接收任何数据、因此、使用 ROM 引导加载程序无法支持动态存储器位置。

    为了支持除0x0000以外的不同应用程序起始地址、您必须使用一个闪存引导加载程序、这将为您提供更多的灵活性。

    ROM 引导加载程序的目的不是提供一个非常可靠的选项、而是提供一个支持多种协议的简单引导加载接口、以便在没有 JTAG (包括闪存引导加载程序)的情况下加载初始固件。

    在 生产环境中、您将使用 ROM 引导加载程序将闪存引导加载程序加载到0x0000。 然后、您将使用闪存引导加载程序将应用程序代码加载到所选的起始地址。

    我希望这有助于澄清 ROM 引导加载程序的预期功能是什么、并且它不是一个芯片错误。

    此致、

    Ralph Jacobi