首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32——USB详细使用说明(3)

STM32——USB详细使用说明(3)

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

}
继承事业,薪火相传
返回列表