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:实现简单的 DFU 引导加载程序

Guru**** 2609285 points
Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/755577/tm4c1294ncpdt-implementation-of-a-simple-dfu-boot-loader

器件型号:TM4C1294NCPDT

使用:TM4C1294NCPDT

外设库:TivaWare 2.1.4.178

我正在尝试为我们的 FSE 人员提供一种简单的方法、以便使用笔记本电脑上的 LMI Flasher 实用程序在现场更新我们的产品固件。

为简单起见、在代码中、设置 CPU 时钟后(如果按下按钮、我执行此操作)、我想深入 ROM_UpdateUSB (0)函数以开始更新。

当我运行代码并查看设备管理器(抱歉、win10)时、我看到"Unknown USB Device (Device Descriptor Request Failed)"(未知的 USB 设备(设备描述符请求失败)。 我尝试使用 SW-TM4C-2.1.4.178.patch-1.0更新驱动程序、但 Windows 告诉我您的设备的最佳驱动程序已安装。 我甚至像以前的帖子所建议的那样尝试卸载现有驱动程序、但这没有帮助。

我在下面发布了我的代码、以防我在代码中做不到正确的事情。 我希望排除我的代码是问题、然后我可以将注意力转向我的 PC。

如果有任何建议,将不胜感激? 谢谢!

include "inc/hw_memmap.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/rom_map.h"
#include "driverlib/usb.h"
#include "usblib/usblib.h"
器


件#include "usblib/usblib.h"

uint32_t SysClock;
uint32_t ui32PLLRate;
//
//从 PLL 以120MHz 运行。
//
SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_main | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);

//
//将 CPU 时钟和 PLL 频率告知 USB 库。 这是一个
// TM4C129器件的新要求。
//
SysCtlVCOGet (SYSCTL_XTAL_25MHz、\ui32PLLRate);
USBDCDFeatureSet (0、USBLIB_Feature_CPUCLK、&SysClock);
USBDCDFeatureSet (0、USBLIB_Feature_USBPLL、&ui32PLLRate);

//
//启用用于更新的其他 GPIO 外设。
//
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOL);
//
MAP_GPIOPinTypeUSBAnalog (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1);
MAP_GPIOPinTypeUSBAnalog (GPIO_PORTL_BASE、GPIO_PIN_6 | GPIO_PIN_7);
//
//启用和复位 USB 外设。
//
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_USB0);
MAP_SysCtlPeripheralReset (SYSCTL_Periph_USB0);
MAP_USBCLOCK 使能(USB0_BASE、8、USB_CLOCK _INTERNAL);

//
//等待大约一秒钟。
//
MAP_SysCtlDelay (SysClock / 3);
//
//在 NVIC 级别重新启用中断。
//
MAP_IntMasterEnable();//在 NVIC 级别启用中断

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

while (1)
{
}
} 

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

    我没有 USB 引导加载程序方面的经验、但我成功运行了 DK-TM4C129X 开发板演示"boot_demo_USB"。(C:\ti\TivaWare_C_Series-2.1.4.178\examples\boards\cdk-tm4c129x\boot_demo_usb)

    在"boot_demo_usb.c"文件中、他们使用以下代码切换到了 DFU 引导加载程序:

    //
    //终止 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);
    
    //
    //不应该出现在这里,而是以防万一。
    //
    while (1)
    {
    }
    

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

    尊敬的 Bob:

    我与您发布的代码进行了比较、并检测到其中一个函数调用参数存在差异。

    在您的代码列表中、您有 ROM_USBClockEnable (USB0_BASE、4、USB_CLOCK _INTERNAL)、而在我的代码中、我有 ROM_USBClockEnable (USB0_BASE、8、USB_CLOCK _INTERNAL)。 中间参数表示从 CPU 时钟到 USB 所需时钟速度60MHz 的分频值。

    在查看 TivaWare 外设驱动程序库的用户指南时(使用第613页的2.1.4.178版)、他们显示了以下示例:

    指定 USB_clock_internal 后、必须设置 ui32Div 值、以便
    PLL_VCO/ui32Div 产生60MHz 时钟。
    
    示例:使用480MHz PLL 设置启用 USB 时钟。
    //
    //使用480MHz PLL 启用 USB 时钟。
    //(480MHz/8 = 60MHz)
    //
    USBClockEnable (USB0_BASE、8、USB_CLOCK _INTERNAL); 

    在我的代码中、我使用480MHz PLL 设置、因此使用了8分频值。

    为了看看会发生什么、我将我的代码更改为4分频、正如您的示例中所示、现在它正在工作。

    您知道分频器从8变为4的原因吗? 这与 SysCtlClockFreqSet 时钟设置代码修改有关系吗?

    谢谢、
    Alan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我知道这是有道理的。 发现了一个问题、此问题在勘误文档中列为 SYS#22。 问题是 PLL 时钟分频器有时(很少)卡在2分频、忽略设置为4分频。 TivaWare 2.1.4.178中实现的解决方案是修改 SysCtlClockFreqSet()函数以使用240MHz VCO、并除以2以120MHz 而不是480MHz VCO、并除以4、即使选择了 SYSCTL_CFG_VCO_480选项。 很明显、我们错过了第613页上的示例更新。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

    感谢您的回答。 现在、我也开始明白了。

    我现在是否可以使用:

    //
    //将 CPU 时钟和 PLL 频率告知 USB 库。
    这是 TM4C129器件的//新要求。
    //
    SysCtlVCOGet (SYSCTL_XTAL_25MHz、&ui32PLLRate);
    USBDCDFeatureSet (0、USBLIB_FEATE_CPUCLK、&SysClock);
    USBDCDFeatureSet (0、USBLIB_Feature_USBPLL、&ui32PLLRate); 

    而不是使用

    MAP_USBCLOCK 使能(USB0_BASE、4、USB_CLOCK _INTERNAL); 

    因为它们似乎都在做同样的事情?

    或者、只要设置 USB 时钟、就可以只使用 USBClockEnable 调用、并且现在将分频值设置为4、并且无需满足上面列出的 TM4C129器件的新要求吗?

    谢谢、
    Alan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、既然我们知道发生了什么、我认为首选第一种解决方案。