为什么DFU进不了USBMSC模式?

jameguom   2010-5-12 21:38 楼主


下面是MCD Application Team的DFU代码的main()里的一部分:
  1.         if (DFU_Button_Read() != 0x00)
  2.         {
  3.                 if (((*(vu32*)USBMSC_AppAddress) & 0x2FFE0000 ) == 0x20000000)
  4.                 { /* Jump to USB MSC */
  5.                         JumpAddress = *(vu32*) (USBMSC_AppAddress + 4);
  6.                         Jump_To_Application = (pFunction) JumpAddress;
  7.                         /* Initialize user application's Stack Pointer */
  8.                         __set_MSP(*(__IO uint32_t*) USBMSC_AppAddress);
  9.                         Jump_To_Application();
  10.                 }
  11.         }
复制代码
debug发现,不按按钮,第一个if也是可以进去的,但第二个if进不去,USBMSC_AppAddress是个宏,定义为:
#define USBMSC_AppAddress 0x08004000
为什么第二个if不行呢,一般什么原因会导致进不了MSC模式?该怎么分别从硬件、软件方面调试呢?
请高手指教。

回复评论 (19)

                                 请确认一下你看的是最新的版本,并说明你看的版本号。
点赞  2010-5-12 21:54
谢谢版主的关注。
  1. * File Name          : main.c
  2. * Author             : MCD Application Team
  3. * Version            : V3.0.1
  4. * Date               : 04/27/2009
  5. * Description        : Device Firmware Upgrade(DFU) demo main file
复制代码
点赞  2010-5-12 22:00
对不起,我没有看到有任何关于USBMSC_AppAddress的引用或定义,你搞错了吧。

DFU_Demo_main.gif (10.48 KB)

点赞  2010-5-12 22:07
                                 没见过啊
点赞  2010-5-12 22:08


我的刚好和你的岔开了,奇怪
2个宏:
#define ApplicationAddress 0x08010000
#define USBMSC_AppAddress 0x08004000
点赞  2010-5-12 22:10
                                 您的ApplicationAddress是否也是0x08010000?
点赞  2010-5-12 22:11


代码可能经修改过。现在情况是PC通过USB连接板子,板子加电后,PC上不提示有新硬件,于是也就不能安装驱动,于是不能用DfuSe下载DFU文件。硬件经检查没问题,代码也不太可能有问题。郁闷……
点赞  2010-5-12 22:15
你直接从ST网站下载看看,对照一下,你的版本肯定是修改过的,至于为什么这样就要问始作俑者了。

http://www.st.com/mcu/familiesdocs-110.html
点赞  2010-5-12 22:19
我下载了几个关于DFU的,可都是0412,安装到C:\Program Files\STMicroelectronics\……
弱弱的问一句:上面那个链接打开后,页面里哪个是我们说的那版代码?
点赞  2010-5-12 22:30
我下载了几个关于DFU的,可都是0412,安装到C:\Program Files\STMicroelectronics\……
弱弱的问一句:上面那个链接打开后,页面里哪个是我们说的那版代码?
安装STM32_USB-FS-Device_Lib后找到Device_Firmware_Upgrade这个例子。

STM32_Docs.gif (108.41 KB)

点赞  2010-5-13 13:36
你在顶楼贴的那段代码的意思是

如果没有按指定按键{
       如果用户程序已经烧录到指定地点{
              运行用户烧录进去的应用程序
       }
}
否则运行dfu代码


所以如果第二个if进不去,就说明你的应用程序并没有烧录到指定地址。

但如果第二个if进不去,就应该运行了dfu代码,就应该可以执行dfu的下载,就不会出现你8楼的情况。



所以,,,,你的代码很奇怪阿。。。。。。。。
点赞  2010-5-13 13:49
谢谢版主和viqia的关注。
这个main()没几句代码,我不确定自己理解的对不对。假如我现在想烧录一个字库到片外SPI FLASH,那么是否可以这样理解:
1)楼上说的“用户应用程序”就是该字库,该应用程序先在PC端做成DFU文件,然后由PC端的DfuSe工具在下载时选中进行下载
2)楼上说的“指定地点”就是SPI FLASH的起始地址,这个地址由PC端的DfuSe工具在下载DFU文件时指定
3)如果只想板子一上电就直接进DFU模式,可以不要中间几个if()那些代码
4)现在debug发现可以跑到while(1);死循环,但PC不提示新硬件,原因肯定是硬件问题

软件经以往的实践证明没问题,硬件经检查也没问题,一时间这东西搞得我狂郁闷,又不知道怎么入手调试……请版主和viqia等高手指教。
点赞  2010-5-13 15:05


USB程序在需要与PC通信时是不能Debug的,因为你在MCU端设断点、单步走的时候,PC端可是不会等你的,PC发了数据包又得不到响应的一段时间之后,就会做超时出错处理,并退出。结果看到的现象就是PC不能识别设备。

你的问题恐怕既有软件的问题,也有硬件的问题,但根本应该是系统的问题和认知的问题。
点赞  2010-5-13 17:09
谢谢版主和viqia的关注。
这个main()没几句代码,我不确定自己理解的对不对。假如我现在想烧录一个字库到片外SPI FLASH,那么是否可以这样理解:
1)楼上说的“用户应用程序”就是该字库,该应用程序先在PC端做成DFU ...
跑到while(1);?

你确认下你的main里有没有  while (bDeviceState != CONFIGURED);这句话?
点赞  2010-5-13 17:42


[回版主]不debug也是这样,PC不提示发现新硬件。版主的意思是让我好好看看《UM0424 USB-FS-Device development kit》?
[回viqia]是while(1);呀,没有那一句,和4楼版主贴的代码几乎一样,只是多了几句,多一个if判断。有问题?

  1. int main(void)
  2. {
  3. GPIO_Configuration();
  4. if(!GPIO_ReadInputDataBit(GPIOA,USB_DET))
  5. {
  6.      if (((*(vu32*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
  7.      { /* Jump to user application */

  8.    JumpAddress = *(vu32*) (ApplicationAddress + 4);
  9.    Jump_To_Application = (pFunction) JumpAddress;
  10.    /* Initialize user application's Stack Pointer */
  11.    __set_MSP(*(__IO uint32_t*) ApplicationAddress);
  12.    Jump_To_Application();
  13.      }
  14. }
  15. if (DFU_Button_Read() != 0x00)
  16. {
  17.   if (((*(vu32*)USBMSC_AppAddress) & 0x2FFE0000 ) == 0x20000000)
  18.   { /* Jump to USB MSC */
  19.    JumpAddress = *(vu32*) (USBMSC_AppAddress + 4);
  20.    Jump_To_Application = (pFunction) JumpAddress;
  21.    /* Initialize user application's Stack Pointer */
  22.    __set_MSP(*(__IO uint32_t*) USBMSC_AppAddress);
  23.    Jump_To_Application();
  24.   }
  25. }
  26. /* Otherwise enters DFU mode to allow user to program his application */
  27.   /* Enter DFU mode */
  28.   DeviceState = STATE_dfuERROR;
  29.   DeviceStatus[0] = STATUS_ERRFIRMWARE;
  30.   DeviceStatus[4] = DeviceState;
  31.   Set_System();
  32.   LEDFillUSBCode(0);
  33.   Set_USBClock();
  34.   USB_Init();
  35.   /* Main loop */
  36.   while (1)
  37.   {}
  38. }
复制代码
点赞  2010-5-13 19:02
                                 为什么会这么肯定是硬件问题呢
点赞  2010-5-13 19:08


因为这版代码以前用过,好好的
各位兄台,我上面的1)、2)、3)、4),理解的对吗?
点赞  2010-5-13 19:10
                                 好多问号,高手请指点啊,在线等……
点赞  2010-5-13 20:14
不知道你发生了什么问题,目前唯一能建议你的是:
1)先使用ST提供的例子,不做任何修改,看看能不能正确运行,否则肯定硬件或PC端有问题。
2)请非常认真地确认你的外部晶体的频率与例程中HSE_VALUE定义的频率一致。

ST提供的例子是经过验证的,很多网友也跑通过,所以它肯定是没有问题的。

除此之外,我暂时提不出更好的意见。
点赞  2010-5-13 22:26
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复