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.
您好!
我正在努力使 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 设备(设备描述符请求失败)
如果有任何帮助或提示、我们将不胜感激。
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) { }
我使用的是通用大容量器件。
最后还是运气不好
拉尔夫
是的、当器件被擦除时、我可以使用 TI LMFlash 编程器对闪存进行编程。
该命令来自我们创建的 PC 软件、用于通过 USB 大容量与电路板通信。 我正确接收命令并运行论坛上提到的相同代码行。
代码似乎跳转至 ROM 以开始执行引导加载程序(代码分支至~0x1000000。 然后、我在 PC 上收到以下消息。
"无法识别 USB 设备。"
在控制面板中、我看到"Unknown USB Device (未知 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();在顶部附近调用。