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.

[参考译文] TM4C123GH6PM:从代码跳转到 USB DFU 引导加载程序后、器件可以#39;t 枚举

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/569039/tm4c123gh6pm-device-can-t-enumerate-after-jumping-to-usb-dfu-bootloader-from-code

器件型号:TM4C123GH6PM
Thread 中讨论的其他器件:EK-TM4C123GXL

我正在尝试让我的器件跳转到引导加载程序并接受通过 USB DFU 进行的固件更新。 但是、当我这么做时、器件会正确断开连接、但我的内核日志显示器件无法枚举。

代码:

uint32_t
GoToBootloader (void)
{
ROM_IntMasterDisable ();
ROM_USBDevDisconnect (USB0_BASE);
ROM_UpdateUSB (0);
return (0);
} 

错误:

USB 断开连接、器件编号为48

使用 xhci_hcd 的49号新全速 USB 设备

器件描述符已读/64、错误-110

我的引导加载程序代码是否有问题?

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

    您能否详细说明 USB 是如何配置的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Amit、您好、感谢您的回复。

    下面是配置代码的一个片段

    //配置 USB 操作所需的引脚。
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    MAP_GPIOPinTypeUSBAnalog (GPIO_PORTD_BASE、GPIO_PIN_5 | GPIO_PIN_4);
    
    //初始化发送和接收缓冲区。
    USBBufferInit (&g_sTxBuffer);
    USBBufferInit (&g_sRxBuffer);
    
    //将 USB 堆栈模式设置为设备模式并进行 VBUS 监控。
    USBStackModeSet (0、eUSBModeForceDevice、0);
    
    //将我们的器件信息传递到 USB 库并将器件
    //放置在总线上。
    USBDCDCInit (0、&g_sCDCDevice);
    
    //寄存器 USB 中断处理程序
    USBIntRegister (USB0_BASE、USB0DeviceIntHandler);
    
    //启用处理器中断。
    MAP_IntMasterEnable(); 

    完整的 USB 配置文件如下: github.com/.../tivac_hardware_usb.h

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

    正确的方法

    USBDCDTerm (0);

    //
    //禁用所有中断。
    //
    ROM_IntMasterDisable();

    //
    //禁用 SysTick 及其中断。
    //
    ROM_SysTickIntDisable();
    ROM_SysTickDisable();

    //
    //禁用所有处理器中断。 而不是逐个禁用它们
    //时间,直接写入 NVIC 以禁用所有外设
    //中断。
    //
    HWREG (NVIC_DIS0)= 0xffffffff;
    HWREG (NVIC_DIS1)= 0xffffffff;
    HWREG (NVIC_DIS2)= 0xffffffff;
    HWREG (NVIC_DIS3)= 0xffffffff;
    HWREG (NVIC_DIS4)= 0xffffffff;

    //
    //启用和复位 USB 外设。
    //
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_USB0);
    ROM_SysCtlPeripheralReset (SYSCTL_Periph_USB0);

    //
    //等待大约一秒钟。
    //
    ROM_SysCtlDelay (ui32SysClock / 3);

    //
    //在 NVIC 级别重新启用中断。
    //
    ROM_IntMasterEnable();

    //
    //调用 USB 引导加载程序。
    //
    ROM_UpdateUSB (0);

    这是来自 TM4C129x 器件的示例代码、但应适用于 TM4C123x。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    使用您的代码、我的设备会断开连接、但绝不会尝试重新连接。 请注意、我将 ROM_SysCtlDelay (ui32SysClock / 3)替换为 ROM_SysCtlDelay (SysCtlClockGet ()/ 3); 我也毫不拖延地尝试了它。

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

    在之前的帖子中找到了 EK-TM4C123GXL 的类似代码中缺少的一行、我已针对 SPMA074应用手册执行了该操作

    //
    //启用和复位 USB 外设。
    //
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_USB0);
    ROM_SysCtlPeripheralReset (SYSCTL_Periph_USB0);
    ROM_SysCtlUSBPLLEnable();
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、您好!

    我包含了该行、现在我看到器件尝试重新连接、但我得到的错误与以前相同
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好 Steven

    您能否将 TM4C123x 代码作为电路板上应用手册的一部分进行尝试、因为客户也证明了它的工作方式? 这将使我们了解系统或嵌入式固件是否存在问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您指的是哪个示例代码? 我无法在 Tivaware 示例中找到它。

    谢谢、

    Steven

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

    SPMA074应用手册中的代码。