大家好、
我使用的是 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