打印

为什么DFU进不了USB MSC模式?

[复制链接]
6060|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 huhu2009 于 2010-5-12 21:52 编辑

下面是MCD Application Team的DFU代码的main()里的一部分:
        if (DFU_Button_Read() != 0x00)
        {
                if (((*(vu32*)USBMSC_AppAddress) & 0x2FFE0000 ) == 0x20000000)
                { /* Jump to USB MSC */
                        JumpAddress = *(vu32*) (USBMSC_AppAddress + 4);
                        Jump_To_Application = (pFunction) JumpAddress;
                        /* Initialize user application's Stack Pointer */
                        __set_MSP(*(__IO uint32_t*) USBMSC_AppAddress);
                        Jump_To_Application();
                }
        }
debug发现,不按按钮,第一个if也是可以进去的,但第二个if进不去,USBMSC_AppAddress是个宏,定义为:
#define USBMSC_AppAddress 0x08004000
为什么第二个if不行呢,一般什么原因会导致进不了MSC模式?该怎么分别从硬件、软件方面调试呢?
请高手指教。
沙发
香水城| | 2010-5-12 21:54 | 只看该作者
请确认一下你看的是最新的版本,并说明你看的版本号。

使用特权

评论回复
板凳
huhu2009|  楼主 | 2010-5-12 22:00 | 只看该作者
谢谢香主的关注。
* File Name          : main.c
* Author             : MCD Application Team
* Version            : V3.0.1
* Date               : 04/27/2009
* Description        : Device Firmware Upgrade(DFU) demo main file

使用特权

评论回复
地板
香水城| | 2010-5-12 22:07 | 只看该作者
对不起,我没有看到有任何关于USBMSC_AppAddress的引用或定义,你搞错了吧。

DFU_Demo_main.gif (10.48 KB )

DFU_Demo_main.gif

使用特权

评论回复
5
司徒老鹰| | 2010-5-12 22:08 | 只看该作者
没见过啊

使用特权

评论回复
6
huhu2009|  楼主 | 2010-5-12 22:10 | 只看该作者
本帖最后由 huhu2009 于 2010-5-12 22:36 编辑

我的刚好和你的岔开了,奇怪
2个宏:
#define ApplicationAddress 0x08010000
#define USBMSC_AppAddress 0x08004000

使用特权

评论回复
7
huhu2009|  楼主 | 2010-5-12 22:11 | 只看该作者
您的ApplicationAddress是否也是0x08010000?

使用特权

评论回复
8
huhu2009|  楼主 | 2010-5-12 22:15 | 只看该作者
本帖最后由 huhu2009 于 2010-5-12 22:35 编辑

代码可能经修改过。现在情况是PC通过USB连接板子,板子加电后,PC上不提示有新硬件,于是也就不能安装驱动,于是不能用DfuSe下载DFU文件。硬件经检查没问题,代码也不太可能有问题。郁闷……

使用特权

评论回复
9
香水城| | 2010-5-12 22:19 | 只看该作者
你直接从ST网站下载看看,对照一下,你的版本肯定是修改过的,至于为什么这样就要问始作俑者了。

http://www.st.com/mcu/familiesdocs-110.html

使用特权

评论回复
10
huhu2009|  楼主 | 2010-5-12 22:30 | 只看该作者
我下载了几个关于DFU的,可都是0412,安装到C:\Program Files\STMicroelectronics\……
弱弱的问一句:上面那个链接打开后,页面里哪个是我们说的那版代码?

使用特权

评论回复
11
香水城| | 2010-5-13 13:36 | 只看该作者
我下载了几个关于DFU的,可都是0412,安装到C:\Program Files\STMicroelectronics\……
弱弱的问一句:上面那个链接打开后,页面里哪个是我们说的那版代码?
huhu2009 发表于 2010-5-12 22:30


安装STM32_USB-FS-Device_Lib后找到Device_Firmware_Upgrade这个例子。

STM32_Docs.gif (108.41 KB )

STM32_Docs.gif

使用特权

评论回复
12
vigia| | 2010-5-13 13:49 | 只看该作者
你在顶楼贴的那段代码的意思是

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


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

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



所以,,,,你的代码很奇怪阿。。。。。。。。

使用特权

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

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

使用特权

评论回复
14
香水城| | 2010-5-13 17:09 | 只看该作者
本帖最后由 香水城 于 2010-5-13 17:11 编辑

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

你的问题恐怕既有软件的问题,也有硬件的问题,但根本应该是系统的问题和认知的问题。

使用特权

评论回复
15
vigia| | 2010-5-13 17:42 | 只看该作者
谢谢香版和viqia的关注。
这个main()没几句代码,我不确定自己理解的对不对。假如我现在想烧录一个字库到片外SPI FLASH,那么是否可以这样理解:
1)楼上说的“用户应用程序”就是该字库,该应用程序先在PC端做成DFU ...
huhu2009 发表于 2010-5-13 15:05


跑到while(1);?

你确认下你的main里有没有  while (bDeviceState != CONFIGURED);这句话?

使用特权

评论回复
16
huhu2009|  楼主 | 2010-5-13 19:02 | 只看该作者
本帖最后由 huhu2009 于 2010-5-13 19:28 编辑

[回香版]不debug也是这样,PC不提示发现新硬件。香版的意思是让我好好看看《UM0424 USB-FS-Device development kit》?
[回viqia]是while(1);呀,没有那一句,和4楼香版贴的代码几乎一样,只是多了几句,多一个if判断。有问题?
 
int main(void)
{
GPIO_Configuration();
if(!GPIO_ReadInputDataBit(GPIOA,USB_DET))
{
     if (((*(vu32*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
     { /* Jump to user application */

   JumpAddress = *(vu32*) (ApplicationAddress + 4);
   Jump_To_Application = (pFunction) JumpAddress;
   /* Initialize user application's Stack Pointer */
   __set_MSP(*(__IO uint32_t*) ApplicationAddress);
   Jump_To_Application();
     }
}
if (DFU_Button_Read() != 0x00)
{
  if (((*(vu32*)USBMSC_AppAddress) & 0x2FFE0000 ) == 0x20000000)
  { /* Jump to USB MSC */
   JumpAddress = *(vu32*) (USBMSC_AppAddress + 4);
   Jump_To_Application = (pFunction) JumpAddress;
   /* Initialize user application's Stack Pointer */
   __set_MSP(*(__IO uint32_t*) USBMSC_AppAddress);
   Jump_To_Application();
  }
}
/* Otherwise enters DFU mode to allow user to program his application */
  /* Enter DFU mode */
  DeviceState = STATE_dfuERROR;
  DeviceStatus[0] = STATUS_ERRFIRMWARE;
  DeviceStatus[4] = DeviceState;
  Set_System();
  LEDFillUSBCode(0);
  Set_USBClock();
  USB_Init();
  /* Main loop */
  while (1)
  {}
}

使用特权

评论回复
17
hsbjb| | 2010-5-13 19:08 | 只看该作者
为什么会这么肯定是硬件问题呢

使用特权

评论回复
18
huhu2009|  楼主 | 2010-5-13 19:10 | 只看该作者
本帖最后由 huhu2009 于 2010-5-13 19:22 编辑

因为这版代码以前用过,好好的
各位兄台,我上面的1)、2)、3)、4),理解的对吗?

使用特权

评论回复
19
huhu2009|  楼主 | 2010-5-13 20:14 | 只看该作者
好多问号,高手请指点啊,在线等……:time:

使用特权

评论回复
20
香水城| | 2010-5-13 22:26 | 只看该作者
不知道你发生了什么问题,目前唯一能建议你的是:
1)先使用ST提供的例子,不做任何修改,看看能不能正确运行,否则肯定硬件或PC端有问题。
2)请非常认真地确认你的外部晶体的频率与例程中HSE_VALUE定义的频率一致。

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

除此之外,我暂时提不出更好的意见。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

163

帖子

1

粉丝