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.

[参考译文] TM4C1294NCPDT:从 USB 大容量器件应用跳转至 USB 引导加载程序

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/684587/tm4c1294ncpdt-jump-to-usb-bootloader-from-usb-bulk-device-application

器件型号:TM4C1294NCPDT

您好!

我正在努力使 USB 引导加载程序正常工作。

这是我所做的。

1. USB 大容量设备应用程序工作正常。

2.我通过 USB 批量从 PC 发送命令到我的代码以跳转到 ROM 中的 USB 引导加载程序

在尝试跳转到基于 ROM 的 USB 引导加载程序之前、会执行以下代码:

USBDevDisconnect (USB0_BASE);

//
//禁用 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_UpdateUSB (0);

作为参考、这里是我的项目.cmd 文件。

#define APP_BASE 0x00000000
#define RAM_base 0x20000000

/*系统内存映射*/

存储器

/*存储在内部闪存中并从内部闪存执行的应用程序*/
闪存(RX):origin = APP_BASE,length = 0x00100000
/*应用程序使用内部 RAM 进行数据*/
SRAM (rwx):origin = 0x20000000,length = 0x00040000

/*内存中的段分配*/

部分

.intvecs:> app_base
.text:> FLASH
.const:> FLASH
.cinit:>闪存
.pinit:> FLASH
init_array:> FLASH

.vtable:> RAM_base
.data :> SRAM
.bss:> SRAM
.sysmem:> SRAM
.stack:> SRAM

__STACK_TOP =__STACK + 1024;

5.跳转到引导加载程序后、代码将在位置0x0100CB58附近执行。  

6.设备管理器最终显示未知 USB 设备(设备描述符请求失败)

如果有任何帮助或提示、我们将不胜感激。

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

    您好 Richard、

    看到一篇来自我实际认识的人的帖子很棒。 不幸的是,我不是这方面的专家。 如果器件被擦除、它是否会被识别为"Stellaris 器件固件升级"?

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

    Bob、

    很高兴听到您的声音。 但愿一切顺利。

    我擦除了器件、是的、我看到器件管理器中显示了 Stellaris 器件固件升级。

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

    您是否正在使用复合设备? 如果是、此帖子可能有助于解释: e2e.ti.com/.../2517326

    我注意到一些工程师跳转到了在地址0编程的引导加载程序、他们的应用程序代码被上移至0x4000、有些工程师调用了 ROM 函数。 这两种策略的优缺点是什么?

    在 usbdfu-rt.c 中可以找到调用已编程引导加载程序的示例:

    HWREG (NVIC_DIS0)= 0xffffffff;
    HWREG (NVIC_DIS1)= 0xffffffff;
    
    //
    //重置 USB 外设
    //
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_USB0);
    MAP_SysCtlPeripheralReset (SYSCTL_Periph_USB0);
    MAP_SysCtlPeripheralDisable (SYSCTL_Periph_USB0);
    
    //
    //等待大约一秒钟。
    //
    MAP_SysCtlDelay (MAP_SysCtlClockGet ()/ 3);
    
    //
    //在 NVIC 级别重新启用中断。
    //
    MAP_IntMasterEnable();
    
    //
    //将控制权返回给引导加载程序。 这是对 SVC 的调用
    //引导加载程序中的处理程序。
    //
    (*(void (*)(void))(*(uint32_t *) 0x2C))();
    
    //
    //不应该出现在这里,而是以防万一。
    //
    while (1)
    {
    } 

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

    我使用的是通用大容量器件。

    最后还是运气不好

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

    如果您使用 TI LMFlash 编程器、能否从 USB 引导加载程序成功进行编程?

    您提到"我通过 USB 批量从 PC 发送命令到代码以跳转到 ROM 中的 USB 引导加载程序"-此命令来自哪里?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    拉尔夫

    是的、当器件被擦除时、我可以使用 TI LMFlash 编程器对闪存进行编程。

    该命令来自我们创建的 PC 软件、用于通过 USB 大容量与电路板通信。 我正确接收命令并运行论坛上提到的相同代码行。

    代码似乎跳转至 ROM 以开始执行引导加载程序(代码分支至~0x1000000。 然后、我在 PC 上收到以下消息。

    "无法识别 USB 设备。"

    在控制面板中、我看到"Unknown USB Device (未知 USB 设备(设备描述符请求失败)"。

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

    我还运行了一个测试、以确保在主应用程序中使用 USB 大容量器件不会影响 USB 引导加载程序中的某些内容。

    我从主应用程序中删除了所有 USB 代码并跳转到 USB 引导加载程序。 行为仍然相同。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Richard、

    好的、现在我想我更好地理解了这个问题。 我找到了一个与您所做的接近的示例、并在 TivaWare 中找到了用于我们 DK-TM4C1294X 板的 BOOT_DEMOD_USB。 在该程序中、通过 ROM_UpdateUSB API 调用 ROM 引导加载程序还有很多步骤。

    //
    //终止 USB 设备并从总线断开。
    //
    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_USBClockEnable (USB0_BASE、4、USB_CLOCK_INTERNAL);
    
    //
    //等待大约一秒钟。
    //
    ROM_SysCtlDelay (ui32SysClock / 3);
    
    //
    //在 NVIC 级别重新启用中断。
    //
    ROM_IntMasterEnable();
    
    //
    //调用 USB 引导加载程序。
    //
    ROM_UpdateUSB (0); 

    我发布了完整的代码、很明显 CDC 函数不适用、而您的批量函数会应用、但您的示例代码缺少一些配置。 您是否也可以尝试将这些内容包括在内?

    我相信您还需要 ROM_IntMasterDisable();在顶部附近调用。