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.

[参考译文] TM4C1297NCZAD:恢复引导加载程序

Guru**** 2380050 points
Other Parts Discussed in Thread: TM4C1297NCZAD, UNIFLASH, EK-TM4C1294XL, SYSBIOS
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1035585/tm4c1297nczad-recover-bootloader

器件型号:TM4C1297NCZAD
主题中讨论的其他器件: UNIFLASHEK-TM4C1294XLTM4C123SYSBIOS

您好!

我 不小心将 Tiva 引导加载程序刷写到 LM 闪存编程器中的错误地址。 我本来应该闪存到0x2800、但我闪存到0x1800。 如何恢复? 我无法从 LM 闪存编程器中看到 USB DFU、也无法使用 XDS110进行检测。 请提供建议

提前感谢。  

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

    您好、Suzanne、

     让我先尝试了解一下您的设置。

     -我假设您有一个带 TM4C1297NCZAD MCU 的定制板、对吧?  

     -您有一个外部 XDS110调试探针、对吧? 也许您可以拍摄您正在使用的 XDS110的图片。

     -您在谈论什么引导加载程序? 闪存引导加载程序通常加载到0x0。  既不是0x2800也不是0x1800。 这就是我所困惑的地方。 您是否在谈论要在0x2800加载的应用固件、您能澄清一下吗?

     -我很困惑的另一件事是如何使用 LM 闪存编程器。 LM 闪存编程器用于具有板载 ICDI 调试探针的 LaunchPad。 LM 闪存编程器不支持 XDS200、XDS100和 JLink 等其他调试探针。 我认为它不支持 XDS110、即使 XDS110基于 ICDI。 您过去是否成功使用 LM 闪存编程器使用 XDS110对器件进行编程、因为这种组合对我来说是新的。 通常、您将使用 Uniflash、这是另一个支持各种调试探针的独立闪存编程器工具。  

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

    您好、Charles、

    是的、这是一个定制板。 这是我使用 https://www.ti.com/tool/TMDSEMU110-U?keyMatch=XDS110的 XDS110调试器

    我遵循 https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1031501/tm4c1297nczad-bootloader-code/3814744?tisearch=e2e-sitesearch&keymatch=%25252520user%2525253A174606#3814744提供的指南

    我按照 SPMU373指南使用 LM 闪存编程器来刷写引导加载程序。 我使用的基本代码是  ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\boot_serial。  

    借助 LM Flash Programmer、 我将使用 USB DFU 通过 USB 连接对其进行刷写。 我已成功刷写它、并在使用正确的地址0x2800时工作。  但是 、在我用0x1800对其进行闪存之后、 我无法再检测到它。 我还有 XDS110和 XDS200 JTAG 编程器。 两个编程器都无法检测电路板。  

    如何恢复它并使电路板再次引导至应用?  

    谢谢

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

    您好、Suzanne、

      我有一些意见。

     -库存示例  ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\boot_serial 是基于闪存的引导加载程序、用于从 UART 端口引导加载。 您是否修改了工程中的 bl_config.h 文件以从 USB 端口引导加载?

     -假设您修改了 boot_serial,以便可以从 USB 端口引导加载,这仍然是引导加载程序。 这个基于闪存的引导加载程序必须从0x0开始。 不是0x2800或0x1800。

     -对于 TM4C129器件、应用程序应从0x4000开始、而不是从0x2800开始。 您在 TivaWare 用户指南中看到的0x2800适用于 TM4C123。 与 TM4C129相比、TM4C123在闪存扇区组织方面具有不同的闪存架构。 如果您查看 ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\boot_serial\BL_config.h 的 bl_config.h 文件、它具有以下#define。

    //
    //
    //应用程序的起始地址。 这必须是1024的倍数
    //字节(使其与页边界对齐)。 矢量表的预期值为
    //此位置,以及向量表(位于的栈)的感知有效性
    //在 SRAM 中、位于闪存中的复位矢量)用作的指示
    //应用程序映像的有效性。
    //
    //引导加载程序的闪存映像不得大于此值。
    //
    //取决于:无
    //不包括:无
    //要求:无
    //
    //
    #define APP_START_ADDRESS 0x4000

     -为了再次澄清、有两个用于引导加载的软件。 第一个是引导加载程序、另一个是您的应用固件。 引导加载程序必须启动0x0、您的应用程序固件可以在0x4000或更高版本(与闪存页边界对齐的1024字节的倍数)上启动。 如果您看一下 TivaWare 示例、boot_serial 是一个引导加载程序。 boot_demo1或 boot_demo2是要通过 UART 端口加载的应用固件示例。  

     -当闪存被完全擦除时、如果您希望使用"基于 ROM 的"引导加载程序来首先加载"基于闪存的"boot_serial、那么您需要将 LM 闪存编程器偏移地址指定为0x0。 加载 boot_serial 后、处理器将从0x0运行。 然后、此 boot_serial 将通过 UART 或 USB 端口从0x4000加载应用固件、具体取决于您是否已修改 boot_serial 以使用 USB 端口。 在这种情况下、LM 闪存编程器偏移地址将需要为0x4000。 再说一次、不是0x1800或0x2800。 0x2800用于 TM4C123 MCU、而不是 TM4C129 MCU。  

     -请先擦除闪存并执行上面提到的步骤。   

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

    您好、Charles、

    我能够根据您的建议恢复董事会的活力。

    其他问题:

    我正在构建代码、输出为 DLPNIRSCAN.bin。 这只是应用程序、还是引导加载程序和应用程序? 我尝试在0x4000处刷写它、但它不起作用。 我检查 bin、该二进制文件从0x0开始。 我正在尝试对应用程序部件进行固件更新。 如何生成正确的纸槽以执行此操作? 最初、我认为使用编译中的 bin 将起作用。 情况似乎并非如此。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="174606" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1035585/tm4c1297nczad-recover-bootloader/3829414 #3829414]I 正在生成代码、输出为 DLPNIRSCAN.bin。 这只是应用程序还是引导加载程序和应用程序?[/quot]

     此 DLPNIRSCAN.bin 必须是您自己的应用程序。 我认为您应该比我更了解它是如何创建的。 构建此应用程序时、必须确保其链接到0x4000。 请参阅 boot_demo_ccs.cmd 链接器命令文件、了解如何构建示例应用。 下面是.cmd 文件的片段。  

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

    您构建的 boot_serial 或任何引导加载程序应从0x0开始。 您可以通过 CCS 或 LM 闪存编程器通过 JTAG 加载此引导加载程序。 引导加载程序运行后、会将您的应用程序(例如 DLPNIRSCAN.bin)编程到地址0x4000。 但您必须 首先编译应用程序固件 DLPNIRSCAN.bin 并将其链接到0x4000。 如果将应用程序编译为从0x0开始、并让引导加载程序在0x4000处对应用程序进行编程、则不起作用。  

     我强烈建议您从 TivaWare 引导加载程序示例开始、并对此进行了解。 只需通过 JTAG 在0x0处加载 boot_serial (这是一个引导加载程序)。 运行后、您可以将 boot_demo1.bin 指定为要加载到 LM 闪存编程器中的应用程序、其偏移地址为0x4000。 请查看有关如何构建 boot_demo1的示例。 同样、库存 TivaWare 示例 boot_serial 原样将从 UART 端口引导加载。 您只需修改 bl_config.h 即可从 USB 端口进行引导加载。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="174606" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1035585/tm4c1297nczad-recover-bootloader/3829414 #3829414"]我正在生成代码,输出为 DLPNIRSCAN.bin。

    这是用于 DLPNIRNANOEVM 还是任何其他 TI DLP EVM/参考设计?

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

    您好、Charles、

    我的项目的.cmd 文件如下所示  

    --retain=g_pfnVectors
    
    /* The starting address of the application.  Normally the interrupt vectors  */
    /* must be located at the beginning of the application.                      */
    #define APP_BASE 0x00000000
    #define RAM_BASE 0x20000000
    
    MEMORY
    {
        FLASH (RX) : origin = APP_BASE, length = 0x00100000
        SRAM (RWX) : origin = 0x20000000, length = 0x00040000
        SDRAM (RWX) : origin = 0x60000000, length = 0x01FFFFFF
    
    }
    
    /* The following command line options are set as part of the CCS project.    */
    /* If you are building using the command line, or for some reason want to    */
    /* define them here, you can uncomment and modify these lines as needed.     */
    /* If you are using CCS for building, it is probably better to make any such */
    /* modifications in your CCS project and leave this file alone.              */
    /*                                                                           */
    /* --heap_size=0                                                             */
    /* --stack_size=256                                                          */
    /* --library=rtsv7M4_T_le_eabi.lib                                           */
    
    /* Section allocation in memory */
    
    SECTIONS
    {
        .intvecs:   > APP_BASE
        .text   :   > FLASH
        .const  :   > FLASH
        .cinit  :   > FLASH
        .pinit  :   > FLASH
        .init_array : > FLASH
        *		:   > FLASH
    
        .vtable :   > RAM_BASE
        .data   :   > SRAM
        .bss    :   > SRAM
        .sysmem :   > SRAM
        .stack  :   > SRAM
    }
    
    __STACK_TOP = __stack + 512;

    是否有可能没有闪存引导加载程序并直接运行应用程序? 如果我理解正确、在我的例子中、ROM 引导加载程序直接从0x0运行应用程序。 如果 我需要使用闪存引导加载程序从 USB 进行更新、 我需要修改.cmd 文件。  

    是的、 我已修改 bl_config.h 以支持 UART 和 USB。 我的概念是使用外部 WiFi 芯片通过 UART 刷写 Tiva 芯片、同时仍有可用于外部刷写的 USB。  

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

    切斯特、您好!

    这是从参考设计中得出的。  

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

    您好、Charles、  

    我改变了  

    闪存(RX):origin = APP_BASE,length = 0x00100000

    更改为  

    闪存(RX):origin = app_BASE,length = 0x000fc000

    使用  

    #define APP_BASE 0x00004000

    我当前收到此错误

    "configPkg/linker.cmd"、第141行:警告#10096-D:指定的地址位于内存映射之外
    错误#10264:默认存储器范围与现有存储器范围闪存重叠
    错误#10264:默认存储器范围与现有存储器范围 SRAM 重叠
    错误#10264:默认存储器范围与现有存储器范围 SDRAM 重叠
    错误#10010:链接期间遇到错误;未构建"DLPNIRSCAN.OUT"

    我应该去哪里?

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

    您好、Suzanne、

    [引用 userid="174606" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1035585/tm4c1297nczad-recover-bootloader/3829667 #3829667]\n 是否可以不使用闪存引导加载程序并直接运行应用程序? 如果我理解正确、在我的例子中、ROM 引导加载程序直接从0x0运行应用程序。

    可以在0x0处没有闪存引导加载程序。 您可以让应用程序从0x0开始。 大多数客户应用程序没有引导加载程序。 您可以通过 CCS、LM 闪存编程器或 Uniflash 通过 JTAG 加载应用。 几乎所有 TivaWare 示例都不需要引导加载程序。 只需查看 blinky.bin 示例。 如何加载和运行闪烁程序? 您的应用没有不同。 您还可以通过 UART 使用基于 ROM 的引导加载程序来加载应用程序。 ROM 引导加载程序仅在闪存为空(处于擦除状态)时从 UART 端口引导加载。 ROM 引导加载程序查看闪存存储器中包含栈指针和复位矢量的前两个字。 如果这两个字是非 FFFFFFFF、那么它会认为0x0有应用程序、并将运行应用程序。 如果两个字为0xFFFFFFFF、ROM 引导加载程序将在 UART0、SSI0、I2C2、CAN、USB 和以太网之间搜索端口以加载固件。

    您的标题从如何恢复引导加载程序开始、这让我认为您使用的是基于闪存的引导加载程序。

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

    您好、Charles、  

    我改变了  

    闪存(RX):origin = APP_BASE,length = 0x00100000

    更改为  

    闪存(RX):origin = app_BASE,length = 0x000fc000

    使用  

    #define APP_BASE 0x00004000

    我当前收到此错误

    "configPkg/linker.cmd"、第141行:警告#10096-D:指定的地址位于内存映射之外
    错误#10264:默认存储器范围与现有存储器范围闪存重叠
    错误#10264:默认存储器范围与现有存储器范围 SRAM 重叠
    错误#10264:默认存储器范围与现有存储器范围 SDRAM 重叠
    错误#10010:链接期间遇到错误;未构建"DLPNIRSCAN.OUT"

    我应该去哪里?

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

    您好、Charles、

    我在这里找到了一个解决方案。

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/393965/default-memory-range-overlaps-existing-memory-range

    我在.cfg 文件中添加了以下内容

    var m3Hwi = xdc.useModule('ti.sysbios.family.arm.m3.Hwi');
    m3Hwi.resetVectorAddress = 0x4000;//应用程序基址*/

    然后、我在0x0处刷写 boot_serial.bin、在0x4000 wuth UNIFLASH 处刷写 DLPNIRSCAN.bin。  

    感谢您的支持和快速回复。 您节省了我几天的开发时间