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.

[参考译文] TM4C1290NCZAD:使用通过 UART 与 MCU 连接的 SD 卡进行固件更新

Guru**** 2502205 points
Other Parts Discussed in Thread: TM4C1290NCZAD, UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1295309/tm4c1290nczad-firmware-update-using-sd-card-interfaced-through-uart-with-mcu

器件型号:TM4C1290NCZAD
主题中讨论的其他器件: UNIFLASH

我计划 使用 通过 UART 连接的 SD 卡和具有 MCU -  TM4C1290NCZAD 的定制电路板来实现更新固件的功能。

SD 卡通过 UART 与 MCU - TM4C1290NCZAD 连接、SD 卡将具有固件.out 文件或其他格式(请建议合适的格式)。

每当 SD 卡插入我的自定义电路板并且发生电源复位时、固件会位于 MCU 的片上闪存中- 如果 SD 卡中.out 文件的 CRC 与 MCU 中已存在的固件不匹配、则 TM4C1290NCZAD 应获取更新、 固件升级结束后、应该可以过渡到我的应用代码。

请与我分享有关如何开始设计此功能的具体详细信息。

我已经查看过 Tiva 示例、对给出的信息有点困惑、但也在浏览过 spmu301e.pdf、无法获取所需的详细信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    SD 卡通过 UART 连接到 MCU - TM4C1290NCZAD、SD 卡将具有固件.out 文件或其他格式(请建议合适的格式)。

    您好!

     请使用二进制.bin 文件。  

    [quote userid="499651" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1295309/tm4c1290nczad-firmware-update-using-sd-card-interfaced-through-uart-with-mcu

    每当 SD 卡插入我的自定义电路板并且发生电源复位时、固件会位于 MCU 的片上闪存中- 如果 SD 卡中.out 文件的 CRC 与 MCU 中已存在的固件不匹配、则 TM4C1290NCZAD 应获取更新、 固件升级结束后、应该可以过渡到我的应用代码。

    请与我分享有关如何开始设计此功能的具体详细信息。

    [/报价]

    不确定示例和用户指南上不清楚的内容。  我建议您首先运行该示例、以便对其有所了解。 有一个 boot_serial 程序、还有一个 boot_deme1程序。 boot_serial 是一个基于闪存的引导加载程序、位于闪存上的0x0。 上电后、引导加载程序将运行、如果它找不到有效的应用程序、则它将处于引导模式。 如果检测到有效的应用程序固件、它将直接跳转到应用程序。  假设还没有有效的应用程序。  在引导加载程序通过 UART 端口接收到来自主机的命令后、boot_serial 将下载 boot_deme1固件。 固件下载完毕后、将重置器件并跳转到应用、因为现在有有效的应用程序。 引导加载程序的基本工作方式。 boot_deme1是一个简单的应用程序固件示例、会使 LED 闪烁。  如果在 LaunchPad 上按下开关、它将跳回引导加载程序以下载/升级新固件。

    引导加载程序配置的一部分是允许在运行时检查 CRC 以及在下载完成后存储 CRC。 有关详细信息、请参阅用户指南。  

    在这种情况下、应用的一部分应设计为从 SD 卡读取新映像的 CRC 值。 如果新 CRC 与闪存中存储的 CRC 不同、应用程序可以跳转到引导加载程序以升级新固件。 新 CRC 存储在 SD 卡中的位置由您决定、这是您需要定义的。  

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

    不确定示例和用户指南上不清楚的内容。  我建议您首先运行该示例、以便对其有所了解。 有一个 boot_serial 程序、还有一个 boot_deme1程序。 boot_serial 是一个基于闪存的引导加载程序、位于闪存上的0x0。

    RAM:基于闪存的引导加载程序默认驻留在 MCU 闪存上的0x0? 或者它必须由我加载? 如果要加载、如何加载?

    ----------------

    上电后、引导加载程序将运行、如果它找不到有效的应用程序、则它将处于引导模式。

    RAM:它将在何处检查有效的应用程序? 内容是什么? 或外部设备? 假设是首次使用 MCU 并且未加载固件、在这种情况下如何处理?

    ----------------

    如果检测到有效的应用程序固件、它将直接跳转到应用程序。  假设还没有有效的应用程序。  在引导加载程序通过 UART 端口接收到来自主机的命令后、boot_serial 将下载 boot_deme1固件。

    RAM:boot_serial 程序将从哪里下载 boot_deme1? 哪种存储器?

    ----------------

    固件下载完毕后、将重置器件并跳转到应用、因为现在有有效的应用程序。 引导加载程序的基本工作方式。 boot_deme1是一个简单的应用程序固件示例、会使 LED 闪烁。  如果在 LaunchPad 上按下开关、它将跳回引导加载程序以下载/升级新固件。

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

    RAM:基于闪存的引导加载程序默认驻留在 MCU 闪存上的0x0? 或者它必须由我加载? 如果要加载、如何加载?

    [/报价]

    是的、您需要通过 JTAG 加载基于闪存的引导加载程序。 通过 JTAG 加载引导加载程序与加载 blinky 或 hello 程序等程序没有不同。

    RAM:它将在何处检查有效的应用程序? 内容是什么? 或外部设备? 假设是首次使用 MCU 并且未加载固件、在这种情况下如何处理?

    [/报价]

    引导加载程序将检查应用程序预期驻留的闪存的前两个位置。 例如、如果您查看 boot_serial 示例、它配置为在0x4000处对应用程序进行编程。 因此、引导加载程序将首先检查0x4000处的前两个位置是否为非 F 值。 如果它们是 F's、则表示目前还没有应用程序。 当闪存被擦除时、数据将是 F。 如果存在非 F 值、引导加载程序将跳转到0x4000以执行应用程序。 请参阅用户指南和 boot_serial 示例。 请查看 bl_config.h 文件。  

    RAM:boot_serial 程序将从哪里下载 boot_deme1? 哪种存储器?

    [/报价]

    外部主机(您的 PC)将运行 LM Flash Programmer 或 Uniflash 等下载工具、该工具将通过 UART 将二进制文件发送到 MCU。 这意味着您需要将 MCU 连接到 PC、并且通过虚拟 COM 端口从 PC 下载数据。  

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

    这是否意味着每当引导加载程序在执行引导程序期间想要加载或更新固件时、PC 和 MCU 之间就应该存在 UART 连接?

    假设我确实有一个引导加载程序从0x0000运行并且应用程序(例如 image1.bin)已存在于0x4000和升级后的固件应用程序(例如、 Image2.bin)存储在通过 UART 与 MCU 连接的 SD 卡中的文件、需要进行升级才能发送到 image1.bin 所在的 MCU。 另一种情况是、如果 SD 卡具有 image1.bin、则加载的引导不需要升级固件。

    在这种情况下、哪个程序决定需要进行固件升级?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否意味着引导加载程序在执行引导程序期间每当需要加载或更新固件时,PC 和 MCU 之间应存在 UART 连接?

    UART 由引导加载程序进行设置。 因此、如果引导加载程序正在运行、则 UART 已初始化(例如、您指定的 UART 实例、波特率、停止位和奇偶校验)。 请参阅 bl_config.h 中与 UART 相关的以下配置。  

    //*****************************************************************************
    //
    // Selects the UART as the port for communicating with the boot loader.
    //
    // Depends on: None
    // Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE,
    //               SSI_ENABLE_UPDATE, USB_ENABLE_UPDATE
    // Requires: UART_AUTOBAUD or UART_FIXED_BAUDRATE, UART_CLOCK_ENABLE, 
    //           UARTx_BASE, UART_RXPIN_CLOCK_ENABLE, UART_RXPIN_BASE, 
    //           UART_RXPIN_PCTL, UART_RXPIN_POS, UART_TXPIN_CLOCK_ENABLE,
    //           UART_TXPIN_BASE, UART_TXPIN_PCTL and UART_TXPIN_POS
    //
    //*****************************************************************************
    #define UART_ENABLE_UPDATE
    
    //*****************************************************************************
    //
    // Enables automatic baud rate detection.  This can be used if the crystal
    // frequency is unknown, or if operation at different baud rates is desired.
    //
    // Depends on: UART_ENABLE_UPDATE
    // Exclusive of: UART_FIXED_BAUDRATE
    // Requires: None
    //
    //*****************************************************************************
    //#define UART_AUTOBAUD
    
    //*****************************************************************************
    //
    // Selects the baud rate to be used for the UART.
    //
    // Depends on: UART_ENABLE_UPDATE, CRYSTAL_FREQ
    // Exclusive of: UART_AUTOBAUD
    // Requires: None
    //
    //*****************************************************************************
    #define UART_FIXED_BAUDRATE     115200
    
    //*****************************************************************************
    //
    // Selects the clock enable for the UART peripheral module
    //
    // Depends on: UART_ENABLE_UPDATE
    // Exclusive of: None
    // Requires: UARTx_BASE
    //
    //*****************************************************************************
    #define UART_CLOCK_ENABLE     SYSCTL_RCGCUART_R0
    
    //*****************************************************************************
    //
    // Selects the base address of the UART peripheral module
    //
    // Depends on: UART_ENABLE_UPDATE
    // Exclusive of: None
    // Requires: UART_CLOCK_ENABLE
    //
    //*****************************************************************************
    #define UARTx_BASE     UART0_BASE
    
    //*****************************************************************************
    //
    // Selects the clock enable for the GPIO corresponding to UART RX pin
    //
    // Depends on: UART_ENABLE_UPDATE
    // Exclusive of: None
    // Requires: UART_RXPIN_BASE, UART_RXPIN_PCTL and UART_RXPIN_POS
    //
    //*****************************************************************************
    #define UART_RXPIN_CLOCK_ENABLE     SYSCTL_RCGCGPIO_R0
    
    //*****************************************************************************
    //
    // Selects the base address for the GPIO corresponding to UART RX pin
    //
    // Depends on: UART_ENABLE_UPDATE
    // Exclusive of: None
    // Requires: UART_RXPIN_CLOCK_ENABLE, UART_RXPIN_PCTL and UART_RXPIN_POS
    //
    //*****************************************************************************
    #define UART_RXPIN_BASE     GPIO_PORTA_BASE
    
    //*****************************************************************************
    //
    // Selects the port control value for the GPIO corresponding to UART RX pin
    //
    // Depends on: UART_ENABLE_UPDATE
    // Exclusive of: None
    // Requires: UART_RXPIN_CLOCK_ENABLE, UART_RXPIN_BASE and UART_RXPIN_POS
    //
    //*****************************************************************************
    #define UART_RXPIN_PCTL     0x1
    
    //*****************************************************************************
    //
    // Selects the pin number for the GPIO corresponding to UART RX pin
    //
    // Depends on: UART_ENABLE_UPDATE
    // Exclusive of: None
    // Requires: UART_RXPIN_CLOCK_ENABLE, UART_RXPIN_BASE and UART_RXPIN_PCTL
    //
    //*****************************************************************************
    #define UART_RXPIN_POS     0
    
    //*****************************************************************************
    //
    // Selects the clock enable for the GPIO corresponding to UART TX pin
    //
    // Depends on: UART_ENABLE_UPDATE
    // Exclusive of: None
    // Requires: UART_TXPIN_BASE, UART_TXPIN_PCTL and UART_TXPIN_POS
    //
    //*****************************************************************************
    #define UART_TXPIN_CLOCK_ENABLE     SYSCTL_RCGCGPIO_R0
    
    //*****************************************************************************
    //
    // Selects the base address for the GPIO corresponding to UART TX pin
    //
    // Depends on: UART_ENABLE_UPDATE
    // Exclusive of: None
    // Requires: UART_TXPIN_CLOCK_ENABLE, UART_TXPIN_PCTL and UART_TXPIN_POS
    //
    //*****************************************************************************
    #define UART_TXPIN_BASE     GPIO_PORTA_BASE
    
    //*****************************************************************************
    //
    // Selects the port control value for the GPIO corresponding to UART TX pin
    //
    // Depends on: UART_ENABLE_UPDATE
    // Exclusive of: None
    // Requires: UART_TXPIN_CLOCK_ENABLE, UART_TXPIN_BASE and UART_TXPIN_POS
    //
    //*****************************************************************************
    #define UART_TXPIN_PCTL     0x1
    
    //*****************************************************************************
    //
    // Selects the pin number for the GPIO corresponding to UART TX pin
    //
    // Depends on: UART_ENABLE_UPDATE
    // Exclusive of: None
    // Requires: UART_TXPIN_CLOCK_ENABLE, UART_TXPIN_BASE and UART_TXPIN_PCTL
    //
    //*****************************************************************************
    #define UART_TXPIN_POS     1

    假设我确实有一个引导加载程序从0x0000运行并且应用程序(例如 image1.bin)已存在于0x4000和升级后的固件应用程序(例如、 Image2.bin)存储在通过 UART 与 MCU 连接的 SD 卡中的文件、需要进行升级才能发送到 image1.bin 所在的 MCU。 另一种情况是、如果 SD 卡具有 image1.bin、则加载的引导不需要升级固件。

    在这种情况下、哪个程序决定需要进行固件升级?

    [/报价]

    您的 image1.bin 可以决定是否需要升级固件。 我想您想从 SD 卡读取 image2的 CRC、以确定是否需要升级。 这一切都由您的软件决定。 您还可以像 boot_deme1一样使用引脚。 检测到指定的引脚时、它将跳转到引导加载程序。 这是一个您需要自行回答的系统/应用级问题。   

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

    不确定示例和用户指南上不清楚的内容。  我建议您首先运行该示例、以便对其有所了解。 有一个 boot_serial 程序、还有一个 boot_deme1程序。

    RAM:哪个程序应该被首先载入? 我们可以使用 CCS 加载程序并建立调试会话吗?

    -------------------------------------------------------

    boot_serial 是一个基于闪存的引导加载程序、位于闪存上的0x0。 上电后、引导加载程序将运行、如果它找不到有效的应用程序、则它将处于引导模式。 如果检测到有效的应用程序固件、它将直接跳转到应用程序。  

    RAM:如何 通过 设置断点来建立调试会话、调试引导加载程序以及在 CCS 中将引导加载程序跳转到应用程序?

    -------------------------------------------------------

    假设还没有有效的应用程序。  在引导加载程序通过 UART 端口接收到来自主机的命令后、boot_serial 将下载 boot_deme1固件。

    RAM:我的要求是访问存储在 SD 卡中的固件.bin 文件、该卡通过 UART 与 MCU 连接、然后使用闪存中的固件.bin 文件进行升级。 我是否需要更新引导加载程序?

    -------------------------------------------------------

    固件下载完毕后、将重置器件并跳转到应用、因为现在有有效的应用程序。 引导加载程序的基本工作方式。 boot_deme1是一个简单的应用程序固件示例、会使 LED 闪烁。  

    RAM:如何调试从引导加载程序到应用程序的转换并查看 LED 闪烁等。

    -------------------------------------------------------

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

    RAM:哪个程序应该被首先载入? 我们可以使用 CCS 加载程序并建立调试会话吗?

    [/报价]

    您能返回到我以前提供的所有答案吗? 我想我已经给了你答案。 您需要首先使用 JTAG 加载引导加载程序。 您可以像使用 hello 或闪烁程序等任何程序一样、使用 CCS 加载引导加载程序。  

    RAM:如何通过  设置断点建立调试会话来调试引导加载程序以及在 CCS 中跳转到应用程序?

    调试引导加载程序就像调试任何程序一样。 确保加载符号。 您可以设置断点或单步。  

    RAM:我的要求是访问存储在 SD 卡中的固件.bin 文件(通过 UART 与 MCU 连接)、然后使用闪存中的固件.bin 文件进行升级。 我是否需要更新引导加载程序?

    否、您无需更新引导加载程序。 固件编程完成后、由固件决定是否需要升级。 如果固件决定需要对新固件进行升级、则会跳回引导加载程序。 请务必先运行示例。

    RAM:如何调试从引导加载程序到应用程序的转换并查看 LED 闪烁等。

    [/报价]

    加载固件后、需要加载固件的符号。 请参见下方的。  

    [/quote]