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.

[参考译文] TM4C129DNCPDT:使用 USB COM /串行端口的引导加载程序

Guru**** 2524620 points
Other Parts Discussed in Thread: TM4C129DNCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/820176/tm4c129dncpdt-bootloader-using-usb-com-serial-port

器件型号:TM4C129DNCPDT

大家好、

我使用的是 TM4C129DNCPDT。 我们项目的要求之一是让用户能够通过 RS-232端口(UART0)、USB 端口(USB0)和驻留在 UART1上的无线模块更新我们的固件。 由于我们需要对 UART1执行更新、因此无法使用基于 ROM 的引导加载程序。 相反、我一直在修改 boot_serial 示例以满足我们的需求。 此外、由于我们的后端软件设置为通过 COM 端口与 USB 进行通信、因此我更希望 USB 作为 COM /串行端口(CDC)运行、以使软件端的操作简单(它是旧代码、不支持已实现的 USB 器件或 DFU、 仅串行端口)。

在 boot_serial 演示中配置 UART 端口的过程很顺利、但 USB 给了我一段时间的麻烦。 目前我的主要问题是、当我插入 USB 电缆时、设备管理器中不会显示任何设备。 该窗口将刷新、表明 Windows 已识别到设备已连接、但不会显示新的 COM 端口、通用串行总线控制器部分下也不会显示任何新设备。 几秒钟后,“Device Manager (设备管理器)”窗口将再次刷新。 我无法查看是否有任何新内容出现、但这两个部分肯定没有出现。

我觉得我已经用尽了所有选项、因此我决定启动一个从 main 运行的新项目(与从 ResetISR 运行的 boot_serial 示例不同)、我遵循了 Ralph Jacobi 在以下主题中提供的 CDC 示例:

https://e2e.ti.com/support/microcontrollers/other/f/908/t/670258

该代码与重新编程闪存所涉及的 boot_serial 代码合并、几乎可以完美地工作。 计算机识别出 USB 串行端口、我可以使用从 USB CDC 创建的 COM 端口通过 LM 闪存编程器执行代码更新。 我遇到的唯一问题是引导加载程序尝试跳转到主应用程序时。 我获得了 FaultISR。 我并不完全确定原因、但我猜它与闪存中的两个'main'有关。

回到修改后的 boot_serial 示例、我一直在比较两个项目中的所有 USB 相关寄存器、以查看它们是否相同。 我可以告诉大家、重要的是相同的(比如从 PLL 或非 PLL 运行、VBUS、ID、DP 和 DM 被启用、 USB0实际通电等)。 代码中的 USB CDC 结构也以相同的方式进行设置、我在两个项目之间调用相同的函数。 然而对于从 int main()运行的项目,我获得了一个 USB COM 端口。 对于从 ResetISR 运行的项目、我没有 COM 端口。

我对可能导致问题的原因没有什么想法。 我知道我在这篇文章中写了很多文章、但我是否忽略了可能导致此问题的任何内容?

-Tom

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

    Tom、

    我将请 Ralph 帮助处理 USB 部件。 获取 FaultISR 的问题可能是您尝试跳转到应用程序主地址而不是 main+1。 M4处理器仅在 Thumb2模式下运行、并且(为了与在 ARM 和 Thumb 模式下运行的 ARM 处理器兼容)分支必须是奇数地址。

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

    尊敬的 Bob:

    我不知道为什么我说我跳到主程序。 我真的要跳转到主应用程序的"复位矢量"、地址为0x8000、应用程序代码的起始位置。 我测试过、看看直接进入主函数是否会改变任何东西。 它似乎锁定在特定的地址、但我看不到那里有什么。

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

    您不想跳转到复位矢量。 它们不包含代码。 您需要跳转到复位矢量指向的位置。

    (*(void (*)(void))(*(uint32_t *) 0x00008004))();
    

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

    我现在必须看起来很绿色。 感谢 Bob 的帮助。 这达到了目的。 我想我可以继续使用我创建的这个新的引导加载程序项目、但我仍然很好奇为什么我无法在 boot_serial 示例上使用 USB 串行端口。

    -Tom