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.

用TM4C1232D5PM设计了一块电路板,不能使用LM Flash Programmer通过USB下载程序

Other Parts Discussed in Thread: TM4C123GH6PZ, UNIFLASH, LMFLASHPROGRAMMER, EK-TM4C123GXL

新焊好的电路板,第一次写程序。

刚开始时,用将电路板的USB口与电脑的USB接上时,电脑显示正在安装驱动,然后LM Flash Programmer 如下图,识别了Stellaris device Firmware Upgrade。

然后我开始试验看看板子能不能下载程序,就打算下载一个.bin文件到板子上,LM Flash Programmer配置如下图所示

后面的几个Tab没改动,默认选项。点击Program后开始下载程序。但是这是马上电脑有提示音,类似移除USB设备的声音,后来,电脑就不能识别板子了。LM Flash Programmer一直如下图显示。

我自己分析原因,可能是芯片出厂时烧录的bootloader程序被我第一次操作时损坏了。

请问:1、哪儿有TI芯片出厂时烧入芯片的bootloader下载?有没有获取渠道?

           2、手头没有仿真器,有没有办法再次烧入bootloader?

  • 1.你的驱动是否装好了,你在设备管理器里面看看

    2.bootloader好像有这么一个库的,还有一个一个说明文档

    3.你最好找找LM Flash Programmer的操作文档

  • TM4C123x的ROM BootLoader的使用。如果您没有改过BOOTCFG寄存器的话,写入过一次程序后,芯片上电后就直接去执行应用程序,不再进入BootLoader了。

    所以,如果需要重新使用ROM Bootloader,有如下办法:

    1。通过JTAG擦除芯片。

    2.修改BOOTCFG寄存器,指定一个GPIO来控制强制进入 ROM BootLoader。

    3.应用程序中可以通过调用ROM库函数直接跳转到ROM BootLoader中。

  • 谢谢您的解答,我之前用第一种方法(通过JTAG擦除芯片)确实能够让电脑重新识别设备(在设备管理器中找到Stellaris Device Firmware Upgrade),这样能实现重新下载程序,但是出现了以下问题:

    1、在LM Flash Programmer 的Configuration 选择interface 为USB DFU ,Program 的Options选择更改 Program Adress Offset 为0x2800(或者0x 1800),这样设置的话,可以通过USB下载程序,但是程序没有运行;此时,可以一直通过USB下载程序(Program Adress Offset 不为0x0),但是程序一直不能运行。

    2、在LM Flash Programmer 的Configuration 选择interface 为USB DFU ,Program 的Options选择更改 Program Adress Offset 为0x0,这样设置的话,可以通过USB下载程序一次,程序可以运行,但是这样的话就不能再次在设备管理器中找到Stellaris Device Firmware Upgrade,即不能再次用USB下载程序了;此时,通过JTAG擦除芯片则又能找到Stellaris Device Firmware Upgrade。

    PS:在Tiva C LaunchPad 进行上述操作得到的现象完全一样,我保证自己的电路板没有硬件问题,电脑的驱动应该也没有问题。

    我想知道怎样才能一直通过LM Flash Programmer 使用USB下载程序,而且程序能运行。我试过把boot_usb例程通过仿真器下载到芯片,但是电脑并不能找到Stellaris Device Firmware Upgrade这个设备。

  • 楼主你好,我也遇到类似问题,电脑看不见USB端口,是经过一番程序调试以后。我用的是TM4C123GH6PZ,在CCSv5通过JTAG,XDS100v2做程序调试,由于所调试的程序是用USB端口与电脑连接,电脑看不见USB,就不能调试下去,所以很是烦恼。

    有人建议用UNIFLASH软件来做芯片擦除,我尝试下载了好几次,都不成功,在此借你宝贴,问一下TI的员工,是不是TI的下载网页最近出了问题。

    我用LM Flash Programmer Build 1572连接,显示不成功。


    希望多交流,谢谢

  • 如果使用基于Flash的bootloader,则需要将Bootloader先通过JTAG或者ROM Bootloader写入Flash的起始地址,然后这个Bootloader可以通过通信接口把应用程序写入Flash中。注意这个时候应用程序的起始地址不是“0”了。我们的例程做的是0x2800.

    应用程序编译的时候,cmd文件需要设置Flash的起始地址对应为0x2800才行。

    我们的例程中,C:\ti\TivaWare_C_Series-2.1.0.12573\examples\boards\dk-tm4c123g\boot_usb这个例程是基于Flash的Bootloader。

    C:\ti\TivaWare_C_Series-2.1.0.12573\examples\boards\dk-tm4c123g\boot_demo1

    C:\ti\TivaWare_C_Series-2.1.0.12573\examples\boards\dk-tm4c123g\boot_demo2

    这两个例程是基于Flash Bootloader的应用程序,它们的cmd文件,Flash起始地址为0x2800。详细信息请仔细阅读他们的readme文件。

    回过头来说一下ROM Bootloader。当Flash为空时,上电后会自动进入ROM Bootloader,所以可以通过USB写程序。

    如果Flash不为空,则执行应用程序。

    在Flash中有应用程序的情况下,使用ROM Bootloader有两个办法,一个是调用ROM_**Update函数直接跳到ROM Bootloader代码区。

    或者修改BOOTCFG寄存器,指定一个GPIO,复位时用这个GPIO来控制强制进入ROM Bootloader。

    详细信息请查看BOOTCFG寄存器定义和ROM Bootloader相关的内容。

  • lung tat ng 说:

    楼主你好,我也遇到类似问题,电脑看不见USB端口,是经过一番程序调试以后。我用的是TM4C123GH6PZ,在CCSv5通过JTAG,XDS100v2做程序调试,由于所调试的程序是用USB端口与电脑连接,电脑看不见USB,就不能调试下去,所以很是烦恼。

    有人建议用UNIFLASH软件来做芯片擦除,我尝试下载了好几次,都不成功,在此借你宝贴,问一下TI的员工,是不是TI的下载网页最近出了问题。

    我用LM Flash Programmer Build 1572连接,显示不成功。


    希望多交流,谢谢

    首先要确定XDS100V2仿真器的驱动正常。安装CCS的时候,默认会安装它的驱动。如果没有就手动下载并安装。驱动正常后在设备管理器里面能够看到对应的设备。

    驱动好了之后才可以使用CCS来调试或者使用Uniflash来下载程序。

    另,LMFlashProgrammer只可以配合ICDI仿真器(Tiva的开发板都集成了这个仿真器)来使用。

  • 谢谢您的解答。

    看完您的回复我总结一下,有误的地方还请斧正。

    首先,通过JTAG口把boot_usb这个例程(一般不用修改,需要的话更改bl_config.h里面 #define APP_START_ADDRESS       0x2800 这个宏定义)下载进目标板。

    这样的话,板上就有了基于Flash的bootloader,可以实现通过这个bootloader 自己的实现应用程序的重复下载升级。

    其次,在编译自己的应用程序时,需要把cmd文件的Flash的其实地址修改为0x2800.

    最后,编译完的应用程序(.bin文件)可以用LM Flash Programmer 通过USB下载进目标板,其中Program Adress Offset 设置为0x2800.

    问题1:“如果使用基于Flash的bootloader,则需要将Bootloader先通过JTAG或者ROM Bootloader写入Flash的起始地址”,这和Flash的起始地址是0x0吧?

    下载由boot_usb这个例程的过程可不可以如下所述:

    1、用LM Flash Programmer 使用ICDC将目标板的Flash 完全擦除,这样就能使用基于ROM的bootloader通过USB下载程序boot_usb.bin文件,其中Program Adress Offset 设置为0x0,到此boot_usb就应该能支持用户的应用程序的重复下载了。

    至此,下载用户自己的应用程序(.bin)可以直接使用USB了,只要在LM Flash Programmer里面更改Program Adress Offset 为0x2800即可?

    问题2:您提到“cmd文件需要设置Flash的起始地址对应为0x2800才行”,编写这个文件有没有指导文档?

    到目前为止,我还是没有实现使用基于Flash的boot_usb重复通过USB下载应用程序,请您继续给予帮助,谢谢。用LM Flash Programmer 使用ICDC将目标板的Flash 完全擦除,使用基于ROM的bootloader通过USB下载程序boot_usb.bin文件后,就在LMFlash Programmer的interface选项中看不到USB DFU设备了。

  • Michael Sun 你好,

    有幸顺利安装了UNIFLASH,刷新flash后,USB端口立马出现在PC的device manage table里,但是,在CCS5.4的调试模式里下载程序后,它立马消失了。

    这与楼主的情况很相似,无法做调试。

    关于ROM_UpdateUSB,具体怎么用呢?能给个具体的例子吗?

    另,把flash地址改到0x2800,后果惨不忍睹,跟当机一样,程序不知跑哪去了,

    应该是哪里出错了,请指点一下。

    在CCS送去调试的文件是 .out格式,请教如何变成 .bin格式,本人想尝试在UNIFLASH下载程序到芯片。

    谢谢。

  • 在工程的 Properties 的点击build,然后选择Steps,在Post-build steps 的编辑框中填入一下内容:

    "${CCS_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin" "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" "${CG_TOOL_ROOT}/bin/armofd" "${CG_TOOL_ROOT}/bin/armhex" "${CCS_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin"

    请完整复制,包括 “” 。 希望能帮你解决生成.bin的问题。

  • 谢楼主,本人正在看关于Boot Loader的内容,相信是地址指针的问题。

  • 针对ROM_UpdateUSB的用法:

    unsigned char pui8USBBootROMInfo[]=
    {
    0xbe, 0x1c, // Stellaris VID
    0xff, 0x00, // Stellaris DFU PID
    0x00, 0x02, // USB version 2.0
    0x00, // 0mA of Bus power
    0xC0, // Self powered using no bus power
    //0 // Address of the string table
    (1 * 2) + 2, // One Language (1 * 2) + 2
    USB_DTYPE_STRING,
    0x09, 0x04, // Language code for US English.
    (17 * 2) + 2, // Size of Manufacturer String.
    // "Texas Instruments"
    USB_DTYPE_STRING,
    'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0,
    's', 0, 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0,
    's', 0,
    (23 * 2) + 2, // Size of Product String.
    USB_DTYPE_STRING,
    // "Device Firmware Upgrade"
    'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, ' ', 0, 'F', 0,
    'i', 0, 'r', 0, 'm', 0, 'w', 0, 'a', 0, 'r', 0, 'e', 0, ' ', 0,
    'U', 0, 'p', 0, 'g', 0, 'r', 0, 'a', 0, 'd', 0, 'e', 0,
    (3 * 2) + 2, // Size of Serial Number.
    USB_DTYPE_STRING,
    // "1.0"
    '1', 0, '.', 0, '0', 0
    };

    然后想要跳转的时候,执行如下语句:

    IntMasterDisable();
    SysTickIntDisable();
    SysTickDisable();
    HWREG(NVIC_DIS0) = 0xffffffff;
    HWREG(NVIC_DIS1) = 0xffffffff;

    SysCtlPeripheralDisable(SYSCTL_PERIPH_USB0);
    SysCtlPeripheralReset(SYSCTL_PERIPH_USB0);

    SysCtlDelay(SysCtlClockGet() / 3);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    GPIOPinTypeUSBAnalog(GPIO_PORTD_BASE, GPIO_PIN_4 | GPIO_PIN_5);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0);
    SysCtlUSBPLLEnable();

    IntMasterEnable();

    ROM_UpdateUSB(pui8USBBootROMInfo);

    就可以跳转到ROM的USB Bootloader执行了。


    另,应用程序如果从0x2800开始执行,则需要先下载基于Flash的Bootloader,这个Bootloader设置中断向量表寄存器后,再跳转到0x2800地址执行就可以了。

  • Michael Sun你好,

    本人的问题不是DFU方面,我在自己板子上测试修改过的“usb_dev_bulk.c”时,第一次很顺利,PC设备管理显示"Stellaris Device Firmware Upgrade",运行程序后,PC设备管理显示改变为"Generic Bulk Device",这是由“usb_bulk_structs.c”所提供的信息,而且PC与板子之间能够进行资料传送。

    对程序进行修改再测试,问题就出现了,PC设备管理不再显示相关的USB端口信息,因此不能联机,继续操作下去,这点和楼主的基本相似。而且再上电效果也一样。

    我正在尝试你提供的ROM boot loader 的方法(这好像是给DFU用的),请问上述小段程序是放在main.c 开始的地方吗?之前不需要指定USB port 吗?

    谢谢

  • Hi lung tat ng,

    修改的代码是基于哪个例程,想要实现什么功能? 基于Flash的Bootloader,我们有做好的例程。

    ROM Bootloader的方法是说不用基于Flash的Bootloader,应用程序运行时,进入程序升级状态后,执行上面的代码,直接跳转到ROM 的Bootloader中,通过USB接口进行程序升级。

    程序放在哪里,取决于你的应用程序向怎么做。

    不需要指定USB Port。 M4只有一个USB口。

  • Michael Sun你好,

    我要做的是基于MCU的设备与PC通过USB口交换资料,所以参考 "usb_dev_bulk"的例程,就是很普通的PC是主,设备从的一个联系。

    我在开发板上重复"usb_dev_bulk"的例程(TivaWare_C_Series-2.1.0.12573版本),用CCSv5,XDS100v2做调试

     

     

    留意观察PC设备管理的变化。

    1. 装载了该例程的情况。

    2. Erase 之后。

    3. 重装例程,并随意通,断电源。

    PC设备管理一直表示这个USB口存在,只要你上电了。我要的是,我的板子只要上电了, PC就会看见,这样程序才可以走下去。

    另,根据要求,UDB0ID和USB0VBUS也接了,不知道对不。

    MCU TM4C123GH6PZ连接USB口没有多少接线,为什么我的板子不行,应该程序方面的问题吧。

    请指点,谢谢

     

     

  • 看你贴的图是对的呀,写入bulk例程后就识别为bulk设备。

    芯片被擦除后,上电后会自动进入ROM Bootloader,USB被初始化为DFU类用于程序升级。

    没有啥不对的呀

  • Michael Sun你好,

    这个当然的,这是TI的开发板,在前面的帖子有提到,我自己的板子在断电再通电后,PC的设备管理就不再出现这个USB口了,不过我的程序还在运行,所设的“等待主机回应”的LED一直亮着,只是PC没有回应它

    下面是我上午的帖子,请多多帮忙。

    Michael Sun你好,

    本人的问题不是DFU方面,我在自己板子上测试修改过的“usb_dev_bulk.c”时,第一次很顺利,PC设备管理显示"Stellaris Device Firmware Upgrade",运行程序后,PC设备管理显示改变为"Generic Bulk Device",这是由“usb_bulk_structs.c”所提供的信息,而且PC与板子之间能够进行资料传送。

    对程序进行修改再测试,问题就出现了,PC设备管理不再显示相关的USB端口信息,因此不能联机,继续操作下去,这点和楼主的基本相似。而且再上电效果也一样。

    我正在尝试你提供的ROM boot loader 的方法(这好像是给DFU用的),请问上述小段程序是放在main.c 开始的地方吗?之前不需要指定USB port 吗?

    谢谢

    Ng

  • 下图是我的板子通过USB与PC连接着,上了电,程序在跑着,不过PC设备管理看不见。

     

     

     

    Erase 后,PC设备管理立马显示出来。

     

  • Hi lung tat ng,

    M4的芯片擦除后,上电后芯片会自动进入ROM Bootloader。因此,

    你自己做的板子,擦除Flash后,PC能正确识别到Stellaris Device Firmware Update设备,可以证明你的硬件是没有问题的。

    写入你自己修改的bulk程序,PC端识别不到bulk设备,是软件的问题了。建议参考我们的C:\ti\TivaWare_C_Series-2.1.0.12573\examples\boards\ek-tm4c123gxl\usb_dev_bulk这个例子来排查问题。

  • 请问,C:\ti\TivaWare_C_Series-2.1.0.12573\examples\boards\ek-tm4c123gxl\usb_dev_bulk 与ek-tm4c123g的usb_dev_bulk 有什么不同?我主要是参考ek-tm4c123g的。

    请指点,谢谢。

  • 楼主和Michael Sun  你们好,

    仔细比较后,发现就差这一句:USBStackModeSet(0, eUSBModeForceDevice, 0);

    放上去就正常了,现在上电和"reset"都没问题了,我可以继续走下去了。

    谢谢Michael Sun的帮忙。

    谢谢楼主让我在这里提问。

    Ng


  • 回头我也试试,现在出来玩了。我也是新手,现在也没明白怎么使用Flash 的bootloader升级程序。如果你已经解决问题了,请指点一二,我之前一直直接用LaunchPad上的仿真器下载程序,这样的话到调试现场就很不方便了,还是希望能用USB升级程序。麻烦Ng了。邮件bitjiangchenglong@126.com .  很多个谢谢。

  • 楼主你好,这个MCU对我来讲也是新手,望日后多多切磋,共同进步。

  • NG你好,能否给我你修改的bootloader的源码?还有,能否细说一下下载程序时(包括bootloader和用户程序)的软件配置,比如工具是什么?offset地址是多少?谢谢!可以的话请发送邮件至bitjiangchenglong@126.com。

  • Michael Sun 您好,到现在为止还是没有在LaunchPad上实现USB 升级我自己的应用程序。以下是我的操作流程,敬请指正。

    首先,下载基于Flash 的 bootloader。我直接用安装Tivaware 里面自带的示例程序(C:\ti\TivaWare_C_Series-2.1.0.12573\examples\boards\dk-tm4c123g\boot_usb)已经编译好的boot_usb.bin 。用ICDC擦除芯片后,LM Flash Programmer可以找到DFU设备,如下图

    下载是的配置如下图所示:

    注意:offset 为 0x0

    下载成功后,DFU消失了,如图:

    我的理解是,既然下载进去是基于Flash 的bootloader,那么就应该在LM Flash Programmer(或者在PC的设备管理器)中找到DFU,可实际上没有。请问Michael Sun,原因是什么?

    带着疑问继续。然后,我用CCS 下载示例程序boot_demo1。boot_demo1的主函数文件(boot_demo1.c)做了如下修改:

    定义:

    #define USB_DTYPE_STRING 0x03

    unsigned char pui8USBBootROMInfo[]=
    {
              0xbe, 0x1c, // Stellaris VID
              0xff, 0x00, // Stellaris DFU PID
              0x00, 0x02, // USB version 2.0
              0x00, // 0mA of Bus power
              0xC0, // Self powered using no bus power
              //0 // Address of the string table
              (1 * 2) + 2, // One Language (1 * 2) + 2
              USB_DTYPE_STRING,
              0x09, 0x04, // Language code for US English.
              (17 * 2) + 2, // Size of Manufacturer String.
              // "Texas Instruments"
              USB_DTYPE_STRING,
              'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0,
              's', 0, 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0,
              's', 0,
              (23 * 2) + 2, // Size of Product String.
             USB_DTYPE_STRING,
             // "Device Firmware Upgrade"
             'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, ' ', 0, 'F', 0,
             'i', 0, 'r', 0, 'm', 0, 'w', 0, 'a', 0, 'r', 0, 'e', 0, ' ', 0,
             'U', 0, 'p', 0, 'g', 0, 'r', 0, 'a', 0, 'd', 0, 'e', 0,
             (3 * 2) + 2, // Size of Serial Number.
             USB_DTYPE_STRING,
             // "1.0"
             '1', 0, '.', 0, '0', 0
    };

    更改函数SetupForUSB为:

    void
    SetupForUSB(void)
    {
              //
              // The USB boot loader takes care of all required USB initialization so,
              // if the application itself doesn't need to use the USB controller, we
             // don't actually need to enable it here. The only requirement imposed by
             // the USB boot loader is that the system clock is running from the PLL
             // when the boot loader is entered.
             //

            IntMasterDisable();
            SysTickIntDisable();
            SysTickDisable();
            HWREG(NVIC_DIS0) = 0xffffffff;
            HWREG(NVIC_DIS1) = 0xffffffff;

            SysCtlPeripheralDisable(SYSCTL_PERIPH_USB0);
            SysCtlPeripheralReset(SYSCTL_PERIPH_USB0);

            SysCtlDelay(SysCtlClockGet() / 3);

            SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
            GPIOPinTypeUSBAnalog(GPIO_PORTD_BASE, GPIO_PIN_4 | GPIO_PIN_5);

            SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0);
            SysCtlUSBPLLEnable();

            IntMasterEnable();

            ROM_UpdateUSB(pui8USBBootROMInfo);
    }

    下载修改后的boot_demo1后可以在LM Flash Programmer(或者PC的设备管理器)中重新找到DFU。

    奇怪的是,不管是将boot_demo1的.cmd 文件中的程序APP_BASE 定义为 0x00002800还是 0x00000000 ,通过CCS下载该程序后都能找到DFU。我分析主函数文件boot_demo1.c  有一条语句  JumpToBootLoader();   是不是与这个有关? 为什么 0x00002800还是 0x00000000 都可以找到DFU?

    我还注意到:直接用ICDC擦除芯片后,LM Flash Programmer显示的是Stellaris Device Firmware Update,而下载boot_demo1后显示的是Device Firmware Update。

    #define APP_BASE 0x00002800
    #define RAM_BASE 0x20000000

    /* System memory map */

    MEMORY
    {
             /* Application stored in and executes from internal flash */
             FLASH (RX) : origin = APP_BASE, length = 0x0003d800
            /* Application uses internal RAM for data */
            SRAM (RWX) : origin = 0x20000000, length = 0x00008000
    }

    最后,既然下载 boot_demo1后能够使PC识别DFU,我尝试用LM Flash Programmer 下载应用程序,配置如下:

    下载完毕后,程序不运行(LED.bin的功能是使LED闪烁)。此时,电脑还是能够识别DFU。注:编译LED.bin时已经将.cmd文件做了如下定义

    #define APP_BASE 0x00002800
    #define RAM_BASE 0x20000000

    将LM Flash Programmer的offset改为0x 00 后再下载LED.bin ,此时程序运行,但是电脑不再识别DFU。

    敬请指教,我不知道在这个问题上卡了多久了。谢谢!!!

  • Jiang chenglong 你好,楼主你好,首先说明一点,我提供的只是用在我这里具体项目的资料,只可以作为参考用。

    1. USB 设备设置,主要源自EK-TM4C123GXL的usb_dev_bulk.c,我原来引用的是EK-TM4C123G的 usb_dev_bulk.c,其最大差别就是少了强制USB作为设备而且监测USBvbus。

    //USB bulk device setting

    MAP_FPULazyStackingEnable();

    // Set the clocking to run from the PLL at 50MHz //USB <-> UART
    //
    ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
    SYSCTL_XTAL_16MHZ);

    //*******************************

    // Enable the GPIO module for LED1, 2 and 3.
    //
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); //(SYSCTL_PERIPH_GPIOA)
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);

    // Configure PB4, PB5 and PE7 as an output for LED.
    //
    MAP_GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_5); //LED1, LED2,
    MAP_GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_7); //LED3

    // Not configured initially.
    //
    g_bUSBConfigured = false;

    //********************
    // Enable the GPIO peripheral used for USB, and configure the USB
    // pins.
    //
    // ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);
    // ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    ROM_GPIOPinTypeUSBAnalog(GPIO_PORTJ_BASE, GPIO_PIN_0 | GPIO_PIN_1);

    //
    // Enable the system tick.
    //
    #define SYSTICKS_PER_SECOND 100
    ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / SYSTICKS_PER_SECOND);
    ROM_SysTickIntEnable();
    ROM_SysTickEnable();

    // Initialize the transmit and receive buffers.
    //
    USBBufferInit(&g_sTxBuffer);
    USBBufferInit(&g_sRxBuffer);

    //
    // Set the USB stack mode to Device mode with VBUS monitoring.
    //
    USBStackModeSet(0, eUSBModeForceDevice, 0);

    // Pass our device information to the USB library and place the device
    // on the bus.
    //
    USBDBulkInit(0, &g_sBulkDevice);

    // Wait for initial configuration to complete.
    MAP_GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_4, 0x10);

    //Orther setting, ...

    2. 硬件上配合监测USBvbus。

    3. TM4C123GH6PZ。cmd 没变化。

    --retain=g_pfnVectors

    #define APP_BASE 0x00000000 //0x00002800
    #define RAM_BASE 0x20000000

    MEMORY
    {
    /* Application stored in and executes from internal flash */
    FLASH (RX) : origin = APP_BASE, length = 0x00040000 //0x0003d800
    /* Application uses internal RAM for data */
    SRAM (RWX) : origin = 0x20000000, length = 0x00008000
    }

    /* The following command line options are set as part of the CCS project. */
    /* If you are building using the command line, or for some reason want to */
    /* define them here, you can uncomment and modify these lines as needed. */
    /* If you are using CCS for building, it is probably better to make any such */
    /* modifications in your CCS project and leave this file alone. */
    /* */
    /* --heap_size=0 */
    /* --stack_size=256 */
    /* --library=rtsv7M4_T_le_eabi.lib */

    /* Section allocation in memory */

    SECTIONS
    {
    .intvecs: > APP_BASE
    .text : > FLASH
    .const : > FLASH
    .cinit : > FLASH
    .pinit : > FLASH
    .init_array : > FLASH

    .vtable : > RAM_BASE
    .data : > SRAM
    .bss : > SRAM
    .sysmem : > SRAM
    .stack : > SRAM
    }

    __STACK_TOP = __stack + 1024;

    强调一点,我不是在试DFU,而是USB bulk device,本人很想尝试DFU功能,无奈项目很赶,已经致后了很多时间,只能看你们玩了。

    希望能够帮上忙。

    Ng

  • lung tat ng 说:

    楼主和Michael Sun  你们好,

    仔细比较后,发现就差这一句:USBStackModeSet(0, eUSBModeForceDevice, 0);

    放上去就正常了,现在上电和"reset"都没问题了,我可以继续走下去了。

    谢谢Michael Sun的帮忙。

    谢谢楼主让我在这里提问。

    Ng


    补充一点,eUSBModeForceDevice这个参数不使用VBUS和ID这两个脚。这也是LaunchPad和DK-TM4C123G的区别。

    如果是eUSBModeDevice,则VBUS需要接5V,ID脚悬空。

  • 原来如此,难怪我去掉设置bp1的语句也没问题,那么说来在硬件那里pb1不用接USBvbus也没问题了。

    有空试试。

  • 请问你用USB下载硬件是怎么链接的?电脑能找到这个USB的?有没有驱动?

  • DK-TM4C123G开发板上的硬件手册上有原理图。

    驱动在这里下载:

    http://www.ti.com/tool/stellaris_icdi_drivers

  • PC找到这个USB,如果没有驱动,它会放个问号,你只要补上驱动就可以了。我用的驱动是TivaWare_C_Series-2.1.0.12573带来的,要找也不难,关键是PC能看见它。我当时的问题就是自己的板子的USB没有向PC发出呼叫(本人理解),所以PC不知这个USB存在。