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.

[参考译文] TM4C129EKCPDT:当带有 USB_init()的引导加载程序被添加到器件中时、应用程序被挂起。 否则、它在引导加载程序不带 USB_init()时运行正常。

Guru**** 2440240 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/626854/tm4c129ekcpdt-application-gets-hung-when-boot-loader-with-usb_init-is-added-to-the-device-otherwise-it-is-running-fine-with-bootloader-without-usb_init

器件型号:TM4C129EKCPDT

您好!

在初始化 USB 之前、我的引导加载程序和应用程序运行正常。 如果我在不初始化 USB 的情况下直接跳转到应用程序、则应用程序运行正常。 如果我在引导加载程序中初始化 USB、则应用程序仅在初始化期间挂起。 USB 初始化接受3个中断、即 Timer1、USB 和 SysTick。 在引导加载程序中,在跳转到应用程序之前,我仅使用 IntMasterDisable()函数。 在跳转到应用程序之前、我是否需要执行其他操作? 我认为中断会导致应用程序出现一些问题。

此致、

那曼

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

    您好、Naman、
    您的引导加载程序基于 USB 还是通过其他方法? 调用 USB_init()后的 USB 是否生成中断。 即使您通过 IntMasterDisable()禁用,但中断仍可能处于暂挂状态。 一旦您跳转到应用程序,您将通过 IntMasterEnable()重新启用中断,您是否不会?

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

    是的、这是一个 USB 引导加载程序。 它使用 SysTick、Timer1和 USB0处理程序来处理中断。

    我尝试在应用程序中使用 IntMasterEnable()命令,但应用程序在该命令上卡住。 然后我尝试使用 IntPendClear ()来清除所有3个外设的所有中断,然后再使用它。 仍然没有成功。

    我意识到应用程序由于计时器初始化而挂起。 我正在使用 timer0和 Timer1、并在应用程序中为其启用中断。 当我评论他们的初始化时、应用程序运行正常、但需要计时器。

    然后、在跳转到应用程序之前、我禁用了引导加载程序本身中的计时器以及 USB 和 SysTick。 这在某种程度上起作用、但需要解决问题。 只有当我在 timer0 (带有它的中断)之前初始化 USB (带有它的中断)时、它才起作用。 反之亦然。 当我直接运行应用程序或不在引导加载程序中使用 USB_init 时、就不会出现此问题。 因此、该问题可能会再次出现。

    在此基础上、您能提出什么建议吗?

    此致、
    那曼
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Naman、
    您能否说明悬挂在何处? 当它停机时、它是否在等待什么?
    引导加载程序需要计时器还是应用程序需要计时器? 当您在应用中只需要计时器时、为什么需要在引导加载程序中初始化计时器? 您是否在计时器初始化过程中启用了计时器? 如果在引导加载程序中启用计时器、则计时器开始计数、即使您尚未启用中断、中断也可能变为挂起。 一旦在应用中启用中断、就会生成中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    让我澄清一切。 很抱歉造成这种混淆。

    我有一个 USB 引导加载程序、它可以运行 USB 闪存驱动器/挂起以及 USB 键盘(通过切换)。 我使用 Timer1中断来检测 USB 键盘的键盘、但引导加载程序不使用、它用于应用、因为我们在 USB 键盘中遇到了一些键盘检测问题、因为应用程序中始终有很多东西在运行。 在引导加载程序中、我们使用的是 USB 键盘、但即使 Timer1未初始化、它也能正常工作。 但是、在应用中、我们初始化 Timer1及其中断。

    在引导加载程序中、我们有2个中断 USB 和 SysTick。 在应用中、我们使用 timer0中断连续发送 UART 数据。 因此、在应用程序中使用的中断包括 USB、SysTick、timer0、Timer1和以太网控制器中断。 现在、如果我从引导加载程序中删除 USB_init、应用程序运行正常。 但是、一旦我在 booltloader 中添加 USB_init、应用程序在 UART 初始化后一旦到达 timer0 init (也启用其中断)、就会立即挂起。

    当我注释 timer0 init 时、它在 Timer1 init 处挂起、该初始化在一些语句之后完成。
    因此、当我知道计时器会导致问题时、在跳转到引导加载程序中的应用程序之前、我启用了这两个计时器、然后将其禁用。 我也禁用了 USB 外设和 SysTick。 那么、它可以用某种方式工作、但我已经告诉过您。 我必须在 UART_init 之前执行 USB_init。 我不知道为什么它的行为是这样的。

    一旦在应用中启用中断、就会生成中断。 是的、我同意。 这就是为什么在使用 IntMasterDisable()之前,我禁用了所有中断和相关外设。 我仍然想知道,没有这种变通办法,它为什么不起作用。 我是否仍然在引导加载程序中启用了本应禁用的任何内容。 您是否有任何命令来检查控制器中当前可用的中断。?

    此致、
    那曼