先介绍一下环境:
自己根据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了。 |