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.

[参考译文] TMS570LC4357:TMS570LC4357:TMS570LC4357定制板中的 UART 引导加载程序。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1048559/tms570lc4357-tms570lc4357-uart-bootloader-in-tms570lc4357-custom-board

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

您好、QJ Wang、

除了 SCI RX 和 SCI TX 引脚、请指导我处理 UART 引导加载程序的硬件电路、  

我们是否需要根据 JTAG 连接任何其他引脚。  

UART 引导加载程序仅在 HDK 的 UART1中工作。  

它在 SCI 2、SCI3或 SCI4中不工作  

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

    您好、Santhosh、

    要使用 SCI2/3/4、您需要一个 UART 收发器连接到 SCI TX/RX 引脚。

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

    是的,我已经连接了 UART SCI 2 TX/RX 引脚,  是否需要使用 bl_config.h 中的 Forced_update_PIN (GIOA7)通过 UART 引导加载程序下载应用程序代码?

    SCI 2已配置、工作正常。 如果没有调试器、则无法正常工作。  

     Forced_update_pin 的用途是什么?

    如何配置 APP_START_ADDRESS 和 APP_STATUS_ADDRESS   

    UART 引导加载程序的 hL_sys_link.cmd 文件  

    /*内存映射*/

    存储器

    /*用户代码开始(2)*/
    #if 0
    /*用户代码结束*/
    /*用户代码开始(3)*/
    #endif

    #if 1.
    引导程序(X):origin=0x00000000 length=0x00000020 fill =0xFFFF
    FLASH0 (RX):origin=0x00000020 length=0x001FFFE0 vfill = 0xffffffff
    FLASH1 (RX):origin=0x00200000 length=0x00200000 vfill = 0xffffffff
    /*银行7 (128KB、FEE)*/
    FLASH7 (R):origin=0xF0200000 length=0x00020000 vfill = 0xffffffff

    堆栈(RW):origin=0x08000000 length=0x00001500
    RAM (RW):origin=0x08001500 length=0x0002EB00
    /*组0 ECC */
    ECC_VEC (R):origin=(0xf0400000 +(start (vectors)>> 3))
    length=(size (vectors)>> 3)
    ecc={algoL2R5F021、input_range=vectors}

    ECC_FLA0 (R):origin=(0xf0400000 +(开始(FLASH0)>> 3))
    length=(size (FLASH0)>> 3)
    ecc={algoL2R5F021、input_range=FLASH0}

    /*组1 ECC */
    ECC_FLA1 (R):origin=(0xf0400000 +(开始(FLASH1)>> 3))
    length=(size (FLASH1)>> 3)
    ecc={algoL2R5F021、input_range=FLASH1}

    /*组7 ECC */
    ECC_FLA7 (R):origin=0xF0100000
    length=(size (FLASH7)>> 3)
    ecc={algoL2R5F021、input_range=FLASH7}
    #endif
    /*用户代码结束*/

    /*用户代码开始(4)*/
    #if 1.
    ECC{
    algoL2R5F021:address_mask = 0xfffffff8 //地址位31:3 */
    汉明_mask = R4 /*使用掩码中的 R4/R5构建*/
    奇偶校验掩码= 0x0c //设置哪些 ECC 位是偶校验和奇校验*/
    镜像= F021 //* RM57Lx 和 TMS570LCx 在 F021中编译

    #endif
    /*用户代码结束*/


    /*------------------ *
    /*段配置*/

    部分

    /*用户代码开始(5)*/
    #if 0

    /*用户代码开始(6)*/
    #endif

    #if 1.
    .intvecs:{} palign =8>vectors
    闪存 API:

    ..\Boot\Fapi_UserDefinedFunctions.obj (.text)
    .\Boot\BL_FLASH.obj (.text)
    --library = F021_API_CortexR4_BE_L2FMC.lib (.text)
    }palign = 8 load = FLASH0 |FLASH1、run = RAM、load_start (apiLoadStart)、run_start (apiRunStart)、size (apiLoadSize)

    .text:{} palign =8>FLASH0 |FLASH1 /*已初始化的可执行代码和常量*/
    .const:{}palign =8 load=FLASH0 |FLASH1、run = RAM、load_start (constLoadStart)、run_start (constRunStart)、size (constLoadSize)/*初始化的常量数据(例如 const flash_sects[.] =)*/
    .cinit:{} palign =8>FLASH0| FLASH1 /*表,用于显式初始化的全局和静态变量*/
    .pinit:{} palign =8>FLASH0|FLASH1 /* C++全局构造函数地址*/
    .bss:{}>RAM /*未初始化的全局和静态变量*/
    .data :{}>RAM /*显式初始化的全局和静态非常量变量。 *
    .sysmem:{}>RAM /*用于动态内存分配的内存池(heap)*/
    #endif

    /*用户代码结束*/

    /*用户代码开始(7)*/
    /*用户代码结束*/


    /*------------------ *
    /*其他*/

    /*用户代码开始(8)*/
    /*用户代码结束*/
    /*------------------ *

    应用链接文件是  

    存储器

    /*用户代码开始(2)*/
    /*用户代码结束*/
    引导程序(X):origin=0x00200000 length=0x00000020
    FLASH0 (RX):origin=0x00000000 length=0x00200000
    FLASH1 (RX):origin=0x00200020 length=0x001FFFE0
    堆栈(RW):origin=0x08080000 length=0x00001500
    RAM (RW):origin=0x08081500 length=0x0007EB00

    /*用户代码开始(3)*/
    /*用户代码结束*/

    /*用户代码开始(4)*/
    /*用户代码结束*/


    /*------------------ *
    /*段配置*/

    部分

    /*用户代码开始(5)*/
    /*用户代码结束*/
    .intvecs:{}>向量
    .text align(32):{}>FLASH1
    .const align (32):{}> FLASH1
    .cinit align (32):{}> FLASH1
    .pinit align (32):{}> FLASH1
    .bss:{}> RAM
    .data :{}> RAM
    .sysmem:{}>RAM

    /*用户代码开始(6)*/
    /*用户代码结束*/

    是否可以确认应用程序和引导加载程序的内存映射是否正确?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="478029" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1048559/tms570lc4357-tms570lc4357-uart-bootloader-in-tms570lc4357-custom-board/3892489 #3892489"]

      bl_config.h 中的 Forced_update_PIN (GIOA7)是否需要用于通过 UART 引导加载程序下载应用程序代码?

    SCI 2已配置、工作正常。 如果没有调试器、则无法正常工作。  

     Forced_update_pin 的用途是什么?

    [/报价]

    复位后,引导加载程序通过调用 ForceCheckUpdate()来检查是否应执行应用程序更新。 如果不需要 AM 更新、  则调用 APP_START_ADDRESS 处的应用程序。  

    检查应用程序更新(在 CheckForceUpdate()中)包括检查 APP_STATUS_ADDRESS 处的更新状态以及可选检查 GPIO 引脚的状态。  

    可以通过 bl_config.h 头文件中的 ENABLE_UPDATE_CHECK 启用 GPIO 引脚检查、在这种情况下、可以通过更改 GPIO 引脚的状态来强制执行更新(例如、使用 HDK 上的按钮)。

    如果应用程序有效(状态= 0x5A5A5A5A)且 GPIO 引脚未请求更新、则会调用应用程序。 否则、通过进入引导加载程序的主循环来启动更新。

    [引用 userid="478029" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1048559/tms570lc4357-tms570lc4357-uart-bootloader-in-tms570lc4357-custom-board/3892489 #3892489"]您能否确认应用程序和引导加载程序的内存映射正确?

    请检查将引导加载程序中的输出段分配给 FLASH0、而不是 FLASH0 | FLASH1

    闪存 API:

    ..\Boot\Fapi_UserDefinedFunctions.obj (.text)
    .\Boot\BL_FLASH.obj (.text)
    --library = F021_API_CortexR4_BE_L2FMC.lib (.text)
    }palign = 8 load = FLASH0、run = RAM、load_start (apiLoadStart)、run_start (apiRunStart)、size (apiLoadSize)

    .text:{} palign =8>FLASH0/*已初始化的可执行代码和常量*/
    .const:{}palign =8 load=FLASH0、run = RAM、load_start (constLoadStart)、run_start (constRunStart)、size (constLoadSize)/*初始化的常量数据(例如 const flash_sectors [.] =)*/
    .cinit:{} palign =8>FLASH0/*表,用于显式初始化的全局和静态变量*/
    .pinit:{} palign =8>FLASH0/* C++全局构造函数地址*/
    .bss:{}>RAM /*未初始化的全局和静态变量*/
    .data :{}>RAM /*显式初始化的全局和静态非常量变量。 *
    .sysmem:{}>RAM /*用于动态内存分配的内存池(heap)*/
    #endif

    /*用户代码结束*/

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

    您好、QJ Wang、

    复位后,引导加载程序通过调用 ForceCheckUpdate()来检查是否应执行应用程序更新。 如果不需要 AM 更新、  则调用 APP_START_ADDRESS 处的应用程序。  

    --从 IDE 软件复位后,引导加载程序会检查 CheckForceUpdate()并且我启用 了 debug_MSG =1,但它会进入 UART 功能,但它不会显示在连接到 HyperTerminal 的 UART 中。

    并且正在进入 CheckGPIOForceUpdate()函数 Forced_update_PIN 不是 从 myside 设置的。 因此、当我使用调试进行设置时、它会跳转到应用程序、 并且应用程序 LED 闪烁正常。

    但是、如果我在没有调试的情况下运行它、那么它将进入 UART-getKey、这是除了我从 UART 输入之外的、但我在 UART 超级终端中看不到任何东西。

    请从引导加载程序检查此存储器映射  

    #if 1.
    引导程序(X):origin=0x00000000 length=0x00000020 fill =0xFFFF
    FLASH0 (RX):origin=0x00000020 length=0x001FFFE0 vfill = 0xffffffff
    FLASH1 (RX):origin=0x00200000 length=0x00200000 vfill = 0xffffffff
    /*银行7 (128KB、FEE)*/
    FLASH7 (R):origin=0xF0200000 length=0x00020000 vfill = 0xffffffff

    堆栈(RW):origin=0x08000000 length=0x00001500
    RAM (RW):origin=0x08001500 length=0x0002EB00

    以及 LED 闪烁应用代码。

    存储器

    /*用户代码开始(2)*/
    /*用户代码结束*/
    引导程序(X):origin=0x00200000 length=0x00000020
    FLASH0 (RX):origin=0x00000000 length=0x00200000
    FLASH1 (RX):origin=0x00200020 length=0x001FFFE0
    堆栈(RW):origin=0x08080000 length=0x00001500
    RAM (RW):origin=0x08081500 length=0x0007EB00

    /*用户代码开始(3)*/
    /*用户代码结束*/

    在这方面、我怀疑 FLASH0从 0x00000020开始、 引导加载程序长度为 0x001FFFE0

    添加 FLASH0和长度时、应该为 FLASH1的值为0x00200000是应用程序代码

    #define APP_START_ADDRESS 0x00200020

    #define APP_STATUS_ADDRESS 0x00200000  

    是这样的  

    请确认存储器映射。  

    提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="478029" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1048559/tms570lc4357-tms570lc4357-uart-bootloader-in-tms570lc4357-custom-board/3894161 #3894161"],它将输入 CheckGPIOForceUpdate()函数 FORCE_UPDATE_PIN,但不 会从 myside 设置。 因此、当我使用调试进行设置时、它会跳转到应用程序、而 应用程序 LED 闪烁正常。

    这是否意味着它会正确跳转应用程序? 您是否使用引导加载程序对应用程序映像进行了编程?

    [引用 userid="478029" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1048559/tms570lc4357-tms570lc4357-uart-bootloader-in-tms570lc4357-custom-board/3894161 #3894161"]我在 UART 超级终端中看不到任何内容。[/quot]

    终端是否具有与代码中使用的波特率和停止位相同的波特率? 您能否在终端上显示任何消息?

    [引用 userid="478029" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1048559/tms570lc4357-tms570lc4357-uart-bootloader-in-tms570lc4357-custom-board/3894161 #3894161"]在这方面、我怀疑 FLASH0从 0x00000020开始 、引导加载程序长度为 0x001FFFE0

    引导加载程序不应太大(0x1FFE0)。 它通常适合第一个、并且应该适合前4个闪存扇区(64KB)。  

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

    :这是否意味着它正确跳转应用程序? 您是否使用引导加载程序对应用程序映像进行了编程?

    是的、有时如果我正确调试它、则会转到应用程序代码并正常工作。

    是的、我使用引导加载程序对应用程序映像进行编程。

    :终端的波特率和停止位是否与您的代码中使用的相同? 您能否在终端上显示任何消息?

    是的、我可以看到显示 UART 引导加载程序选项并从 UART 获取输入的消息、该消息工作正常、 但在它通过第三个选项转到应用程序代码后。  

    下一个循环未在超级终端中正确显示。

    现在、应用程序代码 LED 指示灯闪烁正常。

    然后、我已经提供了软件复位。

    它通过  CheckGPIOForceUpdate 函数

    无强制输入  

    UpdateerUART();

    现在,它卡在 UART_getKey()函数下面,等待来自 UART 的输入,但使用超级终端  

    硬件复位后、它跳转到应用程序  

    但应用程序代码无法正常工作。 LED 不闪烁。  

    UART 引导加载程序存储器:

    应用存储器:

    请帮助我解决此问题  

    提前感谢

    桑托什

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

    您好、 Santhosh、

    请更改:

      引导程序(X)  :origin=0x0020000 length=0x00000020

    至:

      引导程序(X)  :origin=0x0020020 length=0x00000020

    因为中的应用程序映像编程到闪存部分、从0x20020而不是0x20000开始。

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

    您好、QJ Wang、

    我是否只需要在应用程序存储器 hL_sys_link.cmd 文件中更改  

    应用存储器:

    向量 origin 和 FLASH1 origin 应该相同?

    UART 引导加载程序存储器:

     在 UART 引导加载程序存储器中,FLASH1 (RX)来源与应用程序存储器来源相同?

    请确认

    提前感谢。

    桑托什

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

    您好、QJ Wang、  

    请使用 hL_sys_link.cmd 文件和 hL_sys_startup.c 文件共享应用程序内存和引导加载程序内存的内存映射、该文件的启动 函数 _c_int00在应用程序和引导加载程序代码中是相同的。

    如何为应用程序和引导加载程序代码分配向量、堆栈和 RAM 内存?

    如果连接了 XDS110调试探针、则执行应用程序代码、并且在从 IDE 进行系统复位后也可以正常工作。

    SCI2是用于 UART 引导加载程序的 UART

    但我移除了 XDS110调试探针、只将 SCI2 UART 用于 UART 引导加载程序、因此无法正常工作。

    应用  

    引导加载程序

    存储器

    部分

    请检查并确认我。

    我卡在 UART 引导加载程序中  

    提前感谢

    桑托什

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

    您好、Santhosh、

    引导加载程序链接器 cmd 文件中的 FLASH1存储器分配应为:

    FLASH1 (RX):origin=0x00200000 length=0x200000

    其他一切看起来都很好。

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

    您好、QJ Wang、

    UART 引导加载程序问题已解决。 应用程序代码现在通过 UART 引导加载程序执行。  

    我对应用端代码进行了查询、以切换回引导加载程序部分、从而选择可通过 UART 引导加载程序烧录不同应用代码的可重新编程选项。

    请提出任何想法。  

    提前感谢。

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

    您好、QJ Wang、

    如果我需要重新编程应用程序代码,如何从应用程序中移动 UART 引导加载程序,那么在引导加载程序代码中,如何判断它是正常复位还是重新编程复位?

    如何使用 F021_API "F021_API_CortexR4_BE_L2FMC_V3D16.lib"从应用代码访问闪存组1

    在我的应用程序主代码中、 我在进入 Fapi_doMarginReadByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByBy  

    FapiReturn = Fapi_BlockRead (g_ulUpdateStatusAddr、(无符号长整型)&g_pulUpdateUpdateUpdateUpdateess、g_ulSuccessBufferSize);

    但该函数位于库文件中。

    fapi_doMarginReadByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByBy
    (uint8_t *) dst、
    (uint32_t)字节、//16
    Fapi_NormalRead);

    请支持以查找此函数或链接中的问题  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="478029" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1048559/tms570lc4357-tms570lc4357-uart-bootloader-in-tms570lc4357-custom-board/3951912 #3951912"]正常复位或重新编程复位?[/quot]

    重新编程复位可能是软件复位。

    [引用 userid="478029" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1048559/tms570lc4357-tms570lc4357-uart-bootloader-in-tms570lc4357-custom-board/3951912 #3951912"]进入 Fapi_doMarginReadByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByBy  [/报价]

    为什么在应用程序中调用 Marginiad API? 您需要将闪存 API 复制到 RAM 并从 RAM 运行。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、QJ Wang、
    重新编程复位可能是软件复位。
    G_ulbootTransferAddress =(uint32_t) boot_start_address;
    ((void (*)(void)) g_ulbootTransferAddress)();
    我已使用函数指针从应用程序跳转到引导加载程序
    如何找到使用 寄存器重新编程为软件复位的方法?
    为什么在应用程序中调用 Marginiad API? 您需要将闪存 API 复制到 RAM 并从 RAM 运行。
    它被调用来写入和读取一个闪存存储器、以发送一个应用旨在请求重新编程的信息。  
    如果发生正常复位、引导加载程序应允许通过检查的闪存直接进入应用程序
    #define APP_STATUS_ADDRESS 0x00200000。
    如果应用程序请求重新编程、则应输入 UART 编程选项。  
    如何从应用程序向引导加载程序发送信息以请求重新编程?
    提前感谢
    桑托什
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="478029" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1048559/tms570lc4357-tms570lc4357-uart-bootloader-in-tms570lc4357-custom-board/3956514 #3956514"]如何从应用程序向引导加载程序发送信息以请求重新编程?

    您可以使用 EERPOM 在应用程序和引导加载程序之间共享这些信息。 HALCoGen 可以生成用于 EEPROM 读取和写入的 FEE 驱动器。