usb_init.c文件里面的
void USB_Init(void)
{
pInformation =&Device_Info;
pInformation->ControlState =2;
pProperty =&Device_Property;
pUser_Standard_Requests =&User_Standard_Requests;
pProperty->Init();
}
***************(2)**************通过函数指针指向这个初始化函数pProperty 在usb_prop.c文件里面
void Joystick_init(void)
{
Get_SerialNum(); //得到串行号
pInformation->Current_Configuration=0; //
PowerOn(); //将USB上电 连接设备
USB_SIL_Init(); //主要是CNTR寄存器的初始化
bDeviceState =UNCONNECTED; //设备状态标志 当前状态未连接
}
hw_config.c文件里面这个和标准的不一样有改动,获取设备版本号,将其存入到版本号字符串。
voidGet_SerialNum(void) //得到串行号
{
uint32_tDevice_Serial0, Device_Serial1, Device_Serial2;
Device_Serial0 = *(__IO uint32_t*)(0x1FFFF7E8);
Device_Serial1 = *(__IO uint32_t*)(0x1FFFF7EC);
Device_Serial2 = *(__IO uint32_t*)(0x1FFFF7F0);
Device_Serial0 += Device_Serial2;
if(Device_Serial0 != 0)
{
IntToUnicode (Device_Serial0,&Joystick_StringSerial[2] , 8);
IntToUnicode (Device_Serial1,&Joystick_StringSerial[18], 4);
}
}
usb_pwr.c文件里面在这个文件里面只是使能了复位,挂起,唤醒中断,在PowerOn函数使能了复位中断以后,将进入到USB的复位中断里面去。
然后再执行函数USB_SIL_Init将所有的USB中断都打开。在D+被接通上拉以后,设备就能被主机检测到。
RESULT PowerOn(void)
{
#ifndef STM32F10X_CL
uint16_t wRegVal;
USB_Cable_Config(ENABLE); //将USB上电连接
//对USB模块强制复位,类似于USB总线上的复位信号。USB模块将一直保持在复位状态下
//直到软件清除此位。如果USB复位中断被使能,将产生一个复位中断。
wRegVal =CNTR_FRES; //强制复位
_SetCNTR(wRegVal);
wInterrupt_Mask = 0;
_SetCNTR(wInterrupt_Mask); //清除复位信号
_SetISTR(0);
//复位中断屏蔽位 挂起中断屏蔽位唤醒中断屏蔽位使能
wInterrupt_Mask = CNTR_RESETM | CNTR_SUSPM |CNTR_WKUPM; _SetCNTR(wInterrupt_Mask);
#endif
return USB_SUCCESS;
}
usb_istr.c文件里面,下面只写了进入到复位中断函数,进入到USB连接状态
void USB_Istr(void)
{
wIstr =_GetISTR();
#if (IMR_MSK &ISTR_RESET) //USB复位请求中断
if (wIstr & ISTR_RESET&wInterrupt_Mask)
{
_SetISTR((uint16_t)CLR_RESET); //清楚复位中断标志
Device_Property.Reset(); //进入到复位中断
#ifdef RESET_CALLBACK
RESET_Callback();
#endif
}
#end
} |