打印

STM32F103VE+UCOSII+USB库枚举不成功,高手看看问题出在哪了??

[复制链接]
7878|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AB1000|  楼主 | 2010-11-7 19:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
先介绍一下环境:

自己根据ST的评估板画的,仿真器用并口的H-JTAG,调试代理软件用的H-JTAG
,开发环境是keil mdk 4.03。

UCOSII 系统:micrium公司官网上的移植例子
STMicroelectronics STM32 Processor
(Using the ST STM3210B-EVAL Evaluation Board,
ST STM3210E-EVAL Evaluation Board or the
IAR STM32-SK Evaluation Board)
版本是:
*                                                uC/OS-II
*                                          The Real-Time Kernel
*
*                           (c) Copyright 1992-2007, Jean J. Labrosse, Weston
, FL
*                                           All Rights Reserved
*
*                                  uC/OS-II Configuration File for V2.8x
*
* File    : OS_CFG.H
* By      : Jean J. Labrosse
* Version : V2.85

固件库:
ST官网的V2.0.3
/******************** (C) COPYRIGHT 2008 STMicroelectronics
********************
* File Name          : stm32f10x_adc.h
* Author             : MCD Application Team
* Version            : V2.0.3
* Date               : 09/22/2008

usb库和例程:
ST官网的UM0424

我选中的例程是um0424\USBLib\demos\Custom_HID

UCOSII移植程序原来自带的是v0.3的库,非常老,我自己给升级成v2.0.3
的库,运行我自己编的一些程序都是正常,串口、I/0、SPI、rtc
等都正常,中断也正常。前面调得还算顺利,现在卡在usb上了。

现象如下:
我用custom_hid
例程修改成适合我的硬件的程序,下载运行,可以正常枚举,驱动也自动装上了,通讯也?
!?
我把改好的程序移植到我自己的usosii程序里,把其他功能都关掉,就运行usb
程序,枚举死活都不成功。一直找不到原因。usb中断可以正常进入,中断向量表没问题。
我自己用串口把枚举过程打印出来了。这里贴上抓取方法:
抓取部分的源程序:
/******************************************************************************
*
* Function Name  : USB_Istr
* Description    : STR events interrupt service routine
* Input          :
* Output         :
* Return         :
*******************************************************************************
/
void USB_Istr(void)
{
  wIstr = _GetISTR();
#if (IMR_MSK & ISTR_RESET)
  if (wIstr & ISTR_RESET & wInterrupt_Mask)
  {
    _SetISTR((u16)CLR_RESET);
    Device_Property.Reset();
printf("\n\rRESET\n\r");//输出到串口1
#ifdef RESET_CALLBACK
    RESET_Callback();
#endif
  }
#endif
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_DOVR)
  if (wIstr & ISTR_DOVR & wInterrupt_Mask)
  {
    _SetISTR((u16)CLR_DOVR);
printf("\n\rCLR_DOVR\n\r");//输出到串口1
#ifdef DOVR_CALLBACK
    DOVR_Callback();
#endif
  }
#endif
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_ERR)
  if (wIstr & ISTR_ERR & wInterrupt_Mask)
  {
    _SetISTR((u16)CLR_ERR);
printf("\n\rCLR_ERR\n\r");//输出到串口1

#ifdef ERR_CALLBACK
    ERR_Callback();
#endif
  }
#endif
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_WKUP)
  if (wIstr & ISTR_WKUP & wInterrupt_Mask)
  {
    _SetISTR((u16)CLR_WKUP);
    Resume(RESUME_EXTERNAL);
printf("\n\rCLR_WKUP\n\r");//输出到串口1

#ifdef WKUP_CALLBACK
    WKUP_Callback();
#endif
  }
#endif
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_SUSP)
  if (wIstr & ISTR_SUSP & wInterrupt_Mask)
  {
    /* check if SUSPEND is possible */
    if (fSuspendEnabled)
    {
      Suspend();
    }
    else
    {
      /* if not possible then resume after xx ms */
      Resume(RESUME_LATER);
    }
    /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */
    _SetISTR((u16)CLR_SUSP);
printf("\n\rCLR_SUSP\n\r");//输出到串口1

#ifdef SUSP_CALLBACK
    SUSP_Callback();
#endif
  }
#endif
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_SOF)
  if (wIstr & ISTR_SOF & wInterrupt_Mask)
  {
    _SetISTR((u16)CLR_SOF);
    bIntPackSOF++;
printf("\n\rCLR_SOF\n\r");//输出到串口1
#ifdef SOF_CALLBACK
    SOF_Callback();
#endif
  }
#endif
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_ESOF)
  if (wIstr & ISTR_ESOF & wInterrupt_Mask)
  {
    _SetISTR((u16)CLR_ESOF);
    /* resume handling timing is made with ESOFs */
    Resume(RESUME_ESOF); /* request without change of the machine state */
printf("\n\rCLR_ESOF\n\r");//输出到串口1
#ifdef ESOF_CALLBACK
    ESOF_Callback();
#endif
  }
#endif
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_CTR)
  if (wIstr & ISTR_CTR & wInterrupt_Mask)
  {
    /* servicing of the endpoint correct transfer interrupt */
    /* clear of the CTR flag into the sub */
    CTR_LP();
printf("\n\rCTR_LP\n\r");//输出到串口1

#ifdef CTR_CALLBACK
    CTR_Callback();
#endif
  }
#endif
} /* USB_Istr */

抓取结果如下:
本地串口COM1:OK /*这个是系统启动时就显示一次,证明串口工作正常,下面的就是等待
usb中断后抓到的数据*/
RESET
RESET
CLR_SUSP
CLR_ESOF
CLR_ESOF
CLR_ESOF
CLR_ESOF
CLR_ESOF
CLR_ESOF
CLR_ESOF
CLR_ESOF
CLR_ESOF
CLR_ESOF
CLR_ESOF
CLR_ESOF
CLR_ESOF
CLR_ESOF
CLR_ESOF
CLR_ESOF
CLR_ESOF
CLR_ESOF
CLR_ESOF
RESET
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CTR_LP
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
RESET
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CTR_LP
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
RESET
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CTR_LP
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SOF
CLR_SUSP
CLR_SOF
CLR_ESOF

然后电脑上就显示unknown device:


同时,在电脑端用usblyzer抓到的如图,数据最后就是显示usb get node connection
information,数据上不来,估计问题就出在这里了:


本人对STM32就会用固件库,ucosii也是ucosii官方移植好的,对usb不太懂。
有没有哪位高人懂usb的,帮忙给分析一下:
为什么usb枚举不成功?现在到底卡在什么地方了?
ucosii到底怎么做才能与ST官方的usb例程和平共处?
期待高人的出现,要不就打算放弃ucosii了。
沙发
vigia| | 2010-11-8 10:54 | 只看该作者
你贴的USB抓图看不太懂

有没有USB线上直接的数据抓到了,贴上来看看

使用特权

评论回复
板凳
AB1000|  楼主 | 2011-4-30 22:20 | 只看该作者
结个贴吧,问题是这样的,我以前的程序在初始化是开启了所有的时钟,其中就包括CAN的时钟,而正是因为这个CAN的时钟与usb冲突,导致usb枚举不成功。按下下面的代码初始化各部件时钟就可以了。
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA|
        RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|
        RCC_APB2Periph_GPIOE|  
        RCC_APB2Periph_ADC1|RCC_APB2Periph_TIM1|
        RCC_APB2Periph_SPI1|RCC_APB2Periph_USART1,ENABLE);/*开启APB2时钟*/       
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3|
        RCC_APB1Periph_TIM4| RCC_APB1Periph_WWDG| RCC_APB1Periph_SPI2|
        RCC_APB1Periph_USART2|
        RCC_APB1Periph_I2C1|
        RCC_APB1Periph_I2C2| RCC_APB1Periph_USB|
        RCC_APB1Periph_BKP|
        RCC_APB1Periph_PWR|RCC_APB1Periph_DAC|
        RCC_APB1Periph_CEC, ENABLE);/*开启APB1时钟*/

使用特权

评论回复
地板
zsy_zsy| | 2011-8-18 11:07 | 只看该作者
这位大侠请问问题解决了吗?能否分享一下啊!

使用特权

评论回复
5
zsy_zsy| | 2011-8-18 11:08 | 只看该作者
谢谢!

使用特权

评论回复
6
yinyangdianzi| | 2011-8-18 15:25 | 只看该作者
太长了,,到这里都累了

使用特权

评论回复
7
火箭球迷| | 2011-8-18 22:00 | 只看该作者
楼主自我解决问题的能力不错

使用特权

评论回复
8
snowhui416| | 2011-8-21 14:56 | 只看该作者
我和你遇见了同样的问题,我觉的是启动文件的问题,但是也不知道咋么解决,希望有同样问题解决的人加QQ51039672

使用特权

评论回复
9
ayours| | 2011-11-16 16:17 | 只看该作者
不是这个问题

使用特权

评论回复
10
ayours| | 2011-11-16 16:23 | 只看该作者
不是时钟初始化的问题。有个专门叫uc/usb的code。

使用特权

评论回复
11
ayours| | 2011-11-17 11:19 | 只看该作者
原来我将系统时钟倍频到96M了。usb_istr总是出问题。使用endp1收发的。问题就在这里了。

使用特权

评论回复
12
nikita-fuck| | 2011-11-17 13:04 | 只看该作者
研究一段时间,没研究出来,那么就放一天假,再来看看,问题就清楚了

使用特权

评论回复
13
shlw0918| | 2012-8-7 11:10 | 只看该作者
3楼的经验学习了!谢谢!

使用特权

评论回复
14
caesarsong| | 2012-8-29 09:48 | 只看该作者
我的也是这样 楼上的大侠解决了吗

使用特权

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

本版积分规则

3

主题

6

帖子

0

粉丝