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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1036313/tm4c1297nczad-jump-from-application-code-to-flash-bootloader

器件型号:TM4C1297NCZAD
主题中讨论的其他器件:CC3220S

您好!

用于从应用程序跳转到闪存引导加载程序的命令是什么? 这是 boot_demo1代码中的以下函数吗?

//*****************************************************************************
//
// Passes control to the bootloader and initiates a remote software update.
//
// This function passes control to the bootloader and initiates an update of
// the main application firmware image via UART0 or USB depending
// upon the specific boot loader binary in use.
//
// \return Never returns.
//
//*****************************************************************************
void
JumpToBootLoader(void)
{
    //
    // We must make sure we turn off SysTick and its interrupt before entering 
    // the boot loader!
    //
    MAP_SysTickIntDisable(); 
    MAP_SysTickDisable(); 

    //
    // Disable all processor interrupts.  Instead of disabling them
    // one at a time, a direct write to NVIC is done to disable all
    // peripheral interrupts.
    //
    HWREG(NVIC_DIS0) = 0xffffffff;
    HWREG(NVIC_DIS1) = 0xffffffff;
    HWREG(NVIC_DIS2) = 0xffffffff;
    HWREG(NVIC_DIS3) = 0xffffffff;

    //
    // Return control to the boot loader.  This is a call to the SVC
    // handler in the boot loader.
    //
    (*((void (*)(void))(*(uint32_t *)0x2c)))(); 
}

谢谢

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

    您好、Suzanne、

    是的、对于您要使用的命令闪存引导加载程序。 实际跳转在第36行上、但在  进行跳转之前需要剩余的跳转 、因此在引导加载程序正常工作时不会中断引导加载程序。

    此致、

    Ralph Jacobi

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

    您好、Ralph、

    这行代码意味着什么? 什么是0x2C? 这会跳转至地址0x0、该地址是闪存引导加载程序的起始地址吗?  

    (*(void (*)(void))(*(uint32_t *) 0x2C))();

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

    您好、Suzanne、

    您可以通过转至  我们 的 boot_loader TivaWare 文件夹中的 BL_STARTUP_CCS.s 来查看其位置、该文件夹中包含闪存引导加载程序的源代码。 它将跳转到 SVCall 处理程序 、该处理程序随后将从 RAM 执行 UpdateHandler 函数。

    此致、

    Ralph Jacobi

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

    您好、Ralph、

    如何从闪存引导加载程序本身触发更新处理程序? 我尝试通过首先隔离应用程序代码来测试更新。 谢谢

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

    您好、Suzanne、

    如果您有一个要修改的区域要添加到闪存引导加载程序中、我不明白为什么同一跳转在闪存引导加载程序中不起作用。

    您不需要仅使用 TivaWare API

        (*((void (*)(void))(*(uint32_t *)0x2c)))(); 

    此致、

    Ralph Jacobi

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

    您好、Ralph、

    此时、当我运行闪存引导加载程序时、似乎会转到 copy_loop 的 ProceesorInit 函数和循环。  当我暂停调试器时、它似乎会在中断  

    while((HWREG(UARTx_BASE + UART_O_FR) & UART_FR_RXFE));
    在中  

    空 UARTReceive(uint8_t *pui8Data, uint32_t ui32Size)

    我不太确定这里发生了什么。 您能否推荐将更新程序调用到哪里? 我尝试使用 BL_INIT_FN_Hook、但似乎不起作用。  

    #define BL_INIT_FN_HOOK         Updater

    注意:我正在使用 XDS200 USB 调试器。

    注意:我非常确定我将使用通过 UART 的 Updater。 因此、我直接调用 Updater、而不是 Update 处理程序。  

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

    您好、Suzanne、

    也许我在这里有一点不清楚、但为什么要调试引导加载程序? 您是否更改了引导加载程序操作的源代码?

    Flash 引导加载程序经过了非常全面的测试、并由数百位客户使用、因此除非您手动更改、否则您根本不需要对其进行调试。 如果您进行了任何更改、则应将调试重点放在您添加到引导加载程序的代码上。

    我不太清楚发生了什么、因为尝试调试引导加载程序不是我习惯做的事情。

    也许倒退、您是否尝试使用不同的 UART 端口? 如果是、哪一个? 您是否更新了 bl_config.h 以反映这一点?

    此致、

    Ralph Jacobi

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

    您好、Ralph、

    是的。 我正在使用另一个端口、并从 BL_CONFIG.h 对其进行配置 为了给您提供背景信息、我使用 CC3220S 作为闪存 Tiva 的外部器件。 在 CC3220上、我使用 sflash 源代码作为执行更新的基准。 当我尝试使其正常工作时、我无法通过第一部分、即在 COMMAND_ping 之后从 Tiva 闪存引导加载程序获取 ACK。 这就是我尝试从引导加载程序进行调试的原因、如果它被正确发送和接收。  在当前调试设置中、我甚至无法看到这一点。 我已检查波特率和引脚是否正确配置。 我不确定我做的是什么错误的。   

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

    您好、Ralph、

    我设法找到问题所在。  

    总之、我发现如果我从应用程序跳转、UART 线不会在闪存引导加载程序中重新配置。 由应用配置的所有 UART 配置将保留在闪存引导加载程序中。 因此、UART 通信按预期工作。 我现在可以继续闪烁。  

    根据您的经验、引导加载程序可支持的 UART 最大传输大小是多少? 目前、它仅为8字节+命令。 这将永远持续下去。 在 BL_config.h 中、有如下所示的注释。 65是 我应该设置的最大值吗?

    //*****************************************************************************
    //
    // The number of words in the data buffer used for receiving packets.  This
    // value must be at least 3.  If using auto-baud on the UART, this must be at
    // least 20.  The maximum usable value is 65 (larger values will result in
    // unused space in the buffer).
    //
    // Depends on: None
    // Exclusive of: None
    // Requires: None
    //
    //*****************************************************************************
    #define BUFFER_SIZE             20

    如果这种情况发生变化、要更改的相应参数是什么、例如 stack?

    谢谢

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

    您好、Suzanne、

    很高兴您能够在应用程序中找到问题的根本原因。

    [引用 userid="174606" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1036313/tm4c1297nczad-jump-from-application-code-to-flash-bootloader/3835733 #3835733"]BTW、根据您的经验、引导加载程序可支持的 UART 的最大传输大小是多少? 目前、它仅为8字节+命令。 这将永远持续下去。 在 BL_config.h 中、有如下所示的注释。 65是 我应该设置的最大值吗?

    老实说,我不能说我对这种情况很不满意。 我不认为它在传输速度上会有明显的差异、因为真正的瓶颈是 UART 接口的速度。 这仅用于数据缓冲器、不控制数据包大小。 数据缓冲区将易于处理、不应成为瓶颈。 这可能对通过 USB 或以太网进行高速传输更有帮助。

    [引用 userid="174606" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1036313/tm4c1297nczad-jump-from-application-code-to-flash-bootloader/3835733 #3835733"]如果更改,要更改的相应参数是什么,如栈?

    我认为没有任何给定的信息:

    // Depends on: None
    // Exclusive of: None
    // Requires: None

    此致、

    Ralph Jacobi

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

    您好、Ralph、

    感谢您提供信息。 我现在处于更好的位置、并取得了良好的进展。 谢谢。