历史上的今天
返回首页

历史上的今天

今天是:2024年11月04日(星期一)

正在发生

2020年11月04日 | STM32 usb_init.c和usb_int.c文件分析

2020-11-04 来源:eefocus

usb_init.c这个文件是主要是初始化。函数很简单:


/*******************************************************************************

* Function Name  : USB_Init

* Description    : USB系统初始化

* Input          : None.

* Output         : None.

* Return         : None.

*******************************************************************************/

void USB_Init(void)

{

  pInformation = &Device_Info; //注册设备信息结构体

  pInformation->ControlState = 2; //控制状态为IN_DATA

  pProperty = &Device_Property; //注册设备的常用一些函数结构体

  pUser_Standard_Requests = &User_Standard_Requests;

  /* Initialize devices one by one */

  pProperty->Init(); //注册初始化函数

}



   



   

从代码中可以看到,首先是注册了一个Device_Info结构体给USB,这个结构体保存着USB的各项信息,接着设置控制状态为IN_DATA,USB初始化只有在这个状态才能接受主机发送过来的命令,接下去注册函数常用的一些函数及标准请求,最后执行注册过的初始化函数。



usb_int.c一看就知道跟中断相关。在该文件中定义了两个函数,分别为低优先级的端点正确传输中断服务程序CTR_LP()和高优先级端点正确传输的中断服务程序CTR_HP()。

在我们的CUstomHID函数中,只用到CTR_LP()函数。该函数中在usb_istr.c中的USB_istr()函数中被调用。CTR就是正确传输,只有检测到ISTR寄存器中的CTR位置位后,才会调用CTR_LP()函数。

/*******************************************************************************

* Function Name  : CTR_LP.

* Description    : 低优先级的端点正确传输中断服务程序

* Input          : None.

* Output         : None.

* Return         : None.

*******************************************************************************/

void CTR_LP(void)

{

  __IO uint16_t wEPVal = 0;

  while (((wIstr = _GetISTR()) & ISTR_CTR) != 0) //读取中断状态寄存器的值,看是否是CRT(正确传输中断)

  {

    EPindex = (uint8_t)(wIstr & ISTR_EP_ID); //获取产生中断的端点号,

    if (EPindex == 0) //如果端点0

    {

    SaveRState = _GetENDPOINT(ENDP0); //读取端点0的状态寄存器

    SaveTState = SaveRState & EPTX_STAT; //保存端点0发送状态

    SaveRState &=  EPRX_STAT; //保存端点0接收状态


    _SetEPRxTxStatus(ENDP0,EP_RX_NAK,EP_TX_NAK); //设置端点0对主机以NAK方式响应所有的接收和发送请求

      if ((wIstr & ISTR_DIR) == 0) //如果是IN令牌

      {

        _ClearEP_CTR_TX(ENDP0); //清除端点0正确发送标志位

        In0_Process(); //处理IN令牌包


           /* before terminate set Tx & Rx status */


            _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState); //在传输之前设置端点0接收发送状态位

  return;

      }

      else //OUT令牌

      {

        wEPVal = _GetENDPOINT(ENDP0); //获取端点0的端点寄存器的值

        

        if ((wEPVal &EP_SETUP) != 0) //SETUP分组传输完成标志位

        {

          _ClearEP_CTR_RX(ENDP0); //清除端点0的接收标志位

          Setup0_Process(); //端点0建立阶段的数据处理


      _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState);//设置端点0阶接收发送标志位

          return;

        }


        else if ((wEPVal & EP_CTR_RX) != 0) //正确接收标志位

        {

          _ClearEP_CTR_RX(ENDP0); //清除端点0正确标志位

          Out0_Process(); //处理OUT令牌包

     

     _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState);//设置端点0的接收发送状态

          return;

        }

      }

    }/* if(EPindex == 0) */

    else //如果非0端点

    {

      wEPVal = _GetENDPOINT(EPindex); //获取该端点的端点寄存器的值

      if ((wEPVal & EP_CTR_RX) != 0) //正确接收标志

      {

        _ClearEP_CTR_RX(EPindex); //清除端点正确接收标志


        (*pEpInt_OUT[EPindex-1])(); //调用注册过的端点OUT处理函数


      } /* if((wEPVal & EP_CTR_RX) */


      if ((wEPVal & EP_CTR_TX) != 0) //正确发送标志

      {

        _ClearEP_CTR_TX(EPindex); //清除正确发送标志


        (*pEpInt_IN[EPindex-1])(); //调用注册过的端点IN处理函数

      } /* if((wEPVal & EP_CTR_TX) != 0) */


    }/* if(EPindex == 0) else */


  }/* while(...) */

}


/*******************************************************************************

* Function Name  : CTR_HP.

* Description    : 高优先级端点正确传输的中断服务程序

* Input          : None.

* Output         : None.

* Return         : None.

*******************************************************************************/

void CTR_HP(void)

{

  uint32_t wEPVal = 0;


  while (((wIstr = _GetISTR()) & ISTR_CTR) != 0) //获取中断状态寄存器,且是正确传输中断

  {

    _SetISTR((uint16_t)CLR_CTR); /* clear CTR flag *///清除正确传输标志

    /* extract highest priority endpoint number */

    EPindex = (uint8_t)(wIstr & ISTR_EP_ID); //获取产生中断的端点号

    /* process related endpoint register */

    wEPVal = _GetENDPOINT(EPindex); //获取端点寄存器的值

    if ((wEPVal & EP_CTR_RX) != 0) //端点正确接收标志

    {

      /* clear int flag */

      _ClearEP_CTR_RX(EPindex); //清除正确接收标志


      /* call OUT service function */

      (*pEpInt_OUT[EPindex-1])(); //调用注册过的端点OUT函数


    } /* if((wEPVal & EP_CTR_RX) */

    else if ((wEPVal & EP_CTR_TX) != 0) //端点正确发送标志

    {

      /* clear int flag */

      _ClearEP_CTR_TX(EPindex); //清除正确发送标志


      /* call IN service function */

      (*pEpInt_IN[EPindex-1])(); //调用注册过的端点IN函数



    } /* if((wEPVal & EP_CTR_TX) != 0) */


  }/* while(...) */

}


推荐阅读

史海拾趣

台湾富晶(FORTUNE)公司的发展小趣事
使用滤波器或隔离器等设备隔离输入信号的干扰。
Avasem公司的发展小趣事

在国内市场取得一定成功后,Avasem公司开始实施国际化战略,以进一步拓展全球市场份额。公司首先在欧洲和北美等成熟市场设立了研发中心和销售网点,以便更好地了解当地市场需求和消费者偏好。随后,Avasem公司通过与当地合作伙伴建立战略联盟,共同推广其产品和技术。这一战略不仅提升了公司在全球市场的知名度,还为其带来了可观的收益增长。

富瀚(Fullhan)公司的发展小趣事
记录测试过程中的数据,包括过载电流值、保护动作时间等,以便后续分析和评估。
COMPUTAR公司的发展小趣事

随着技术的不断进步和市场需求的扩大,CBC株式会社开始寻求更广阔的发展空间。1960年,CBC香港公司成立,这标志着CBC的镜头产品开始走向国际市场。香港作为当时亚洲的金融中心和贸易枢纽,为CBC提供了宝贵的国际资源和市场机遇。通过香港公司的努力,CBC的镜头产品逐渐在国际市场上获得认可。

Electech Electronics公司的发展小趣事

Electech Electronics公司成立于XXXX年,由几位在电子行业有丰富经验的工程师共同创立。起初,公司主要专注于电子元器件的代理和销售,为本地的小型电子产品制造商提供服务。通过不懈的努力和对市场敏锐的洞察力,Electech Electronics逐渐在本地市场中建立了良好的声誉。

Equator Technologies公司的发展小趣事

在发展过程中,Equator始终注重拓展国际市场。通过与全球各地的合作伙伴建立紧密的合作关系,Equator将其产品和服务推向了世界各地。特别是在亚洲市场,Equator凭借其卓越的技术实力和优质的产品赢得了众多客户的青睐。同时,公司还积极参加国际展会和交流活动,与全球同行进行技术交流和合作,不断提升自身的国际竞争力。

问答坊 | AI 解惑

急求win 7下TC35Test测试程序

刚买了TC35开发板,系统是win 7的,配套的测试程序不能用 那位朋友有TC35Test程序啊,适合win 7的      394397573@qq.com   谢谢…

查看全部问答>

EMB-9459T的工业主板,装什么系统好?

   单位最近买了如题主板一块,配置:2G内存+4G SD卡。主频1.6Ghz。    我们先装了个XP精简版的,显然有点大材小用了,我感觉像这种配置的工控    主板是不是装个嵌入式系统比较好呢?       &nb ...…

查看全部问答>

nboot.bin运行后,EBOOT.NBO无法启动

我现在手中有五块2410板子 1)有三块nboot.bin运行后,EBOOT.NBO无法启动 2)一块nboot.bin,EBOOT.NBO运行后无法运行NK 2)一块nboot,EBOOT,NK运行正常 请各位高手指点迷津 …

查看全部问答>

小喇叭不见了,是不是驱动的问题 各位帮帮忙~

最近新装了xp系统 装好后发现右下角的小喇叭没了 进控制面板的声音选项后发现有提示 没有音频设备 在网上看了一些帖子说是没有声卡驱动 于是下了个everest查到声卡的型号是Realtek ALC650 @ Intel 82801DB ICH4 - AC\'97 Audio Controller [B-0 ...…

查看全部问答>

缺氧报警器

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 …

查看全部问答>

ZLG M0

说实话 周立功的TKSTUDIO 真的不怎么样 真的 很不爽用起来 而且载程序设置麻烦的一塌糊涂 很不人性化 经常同一个工程 过一段时间不用他 在DEBUG 他就不行了   还有各问题想请教:M0 左边一块是LPC1343 右边是LPC1114  两块是独立的吧 ...…

查看全部问答>

单片机入门,小霸王其乐无穷啊。。。

我是菜鸟。。。想入门单片机拆遍家里的东东,终于在老游戏机里找到了可以DIY一下的材料这个是8位机的卡带想来请教一下论坛里的高手1、照片里的三个芯片都有什么作用???2、有没有可能自己擦写烧录8位机的游戏进去???3、用这个入门合不合适?? ...…

查看全部问答>

cmd文件中的page0 和page1

本帖最后由 dontium 于 2015-1-23 13:23 编辑 cmd 文件中的page0和page1同地址分页中page0,page1是一会事吗? 地址分页中有page0 page1 .. page127 …

查看全部问答>

无线传感器

哪位大侠知道哪有集成声(振动)传感器、射频模块的无线传感器?谢谢!…

查看全部问答>