STM32 usb_init.c和usb_int.c文件分析

发布者:温柔心绪最新更新时间:2016-12-20 来源: eefocus关键字:STM32  usb_init.c  usb_int.c  文件分析 手机看文章 扫描二维码
随时随地手机看文章

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(...) */

}


关键字:STM32  usb_init.c  usb_int.c  文件分析 引用地址:STM32 usb_init.c和usb_int.c文件分析

上一篇:STM32 usb_core.c分析
下一篇:STM32 DMA 应用之(一)SRAM 与flash 间数据传输

推荐阅读最新更新时间:2024-03-16 15:26

STM32之NVIC学习
NVIC_InitTypeDef NVIC_InitStructure; /* Configure the NVIC Preemption Priority Bits */ /* Configure one bit for preemption priority */ /* 优先级组说明了抢占优先级所用的位数,和子优先级所用的位数 在这里是1, 7 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /* Enable the USART1 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = UA
[单片机]
STM32最小系统硬件组成部分
STM32最小系统硬件组成 最小系统为单片机工作的最低要求,不含外设控制,原理简单,分析最小系统是STM32入门的基础。 组成: 电源 复位 时钟 调试/下载接口 启动 电源 3.3V的电源从这里接入,其中电容起到滤波的作用。 复位电路 当RESET引脚被拉低产生外部复位时,产生复位脉冲,从而使系统复位。 有三种复位方式: 上电复位 手动复位 程序自动复位 上电复位,在上电瞬间,电容充电,RESET出现短暂的低电平,该低电平持续时间由电阻和电容共同决定,需求的复位信号持续时间约在1ms左右,计算方式如下: t = 1.1RC(固定计算公式) 1.1*10K*0.1uF=1.1ms 手动复位:按键按下时,RESET与地导
[单片机]
<font color='red'>STM32</font>最小系统硬件组成部分
STM32安全固件更新的额外设计
为了安全的额外设计 我们要让一般的固件更新变成安全的固件更新。体现在: a. 固件是保密的 b. 固件是完整的 c. 固件是可靠的 固件的保密,在传输过程中是通过加解密技术保证的;在设备更新过程中的保密,则是通过STM32 安全启动所提供的安全机制来保证。 而固件的完整性,传输过程中的完整性则通过加密技术中的哈希函数 SHA256 或者 AESGCM 来保证。当然 ,单独谈完整性,在有攻击的情况下 ,是没有意义的 。哈希函数一般都是结合加密技术来保证完整性。在安全启动里,我们需要验证该固件是否可靠。在那时 ,我们需要重新计算该哈希值或者认证码,我们要进行比较,只有完全相等,才认为该固件没有被破坏。 固件的来源可靠性,则通过加
[单片机]
stm32专题十八:stm32读写SPI FLASH
直接上代码: bsp_spi_flash.c /** ****************************************************************************** * @file bsp_spi_flash.c * @author STMicroelectronics * @version V1.0 * @date 2019 * @brief SPI FLASH(W25Q64)应用函数bsp ****************************************************************************** */
[单片机]
STM32基本系统主要几个部分
STM32基本系统主要有下面几个部分: 电源 无论是否使用模拟部分和AD部分,MCU外围出去VCC和GND,VDDA、VSSA、Vref(如果封装有该引脚)都必需要连接,不可悬空。 对于每组对应的VDD和GND都应至少放置一个104的陶瓷电容用于滤波,并接该电容应放置尽量靠近MCU。 用万用表测试供电电压是否正确,调试时最好用数字电源供电,以便过压或过流烧坏板子,电压最好一步一步从进线端测试到芯片供电端。 复位、启动选择 Boot引脚与JTAG无关。其仅是用于MCU启动后,判断执行代码的起始地址 在电路设计上可能Boot引脚不会使用,但要求一定要外部连接电阻到地或电源,切不可悬空;STM32三种启动模式对应的存储介质均
[单片机]
<font color='red'>STM32</font>基本系统主要几个部分
STM32学习笔记(2)外部中断
一、中断 1.什么是中断 操作系统需要管理外设,但是外设的速度远远低于CPU的速度,所以我们需要一种机制来弥补这种速度鸿沟,提高CPU的效率。 为此我们引入了中断机制,让外设在需要操作系统处理外设相关事件的时候,能够主动通知操作系统,即当CPU收到中断或者异常的事件时,打断操作系统和应用的正常执行,暂停执行当前的程序或任务,让操作系统完成外设的相关处理,在完成对这个事件的处理后,再恢复操作系统和应用的正常执行。 举个栗子,当你在读文章时忽然来了一个电话,你会先去接电话,等电话挂断后你又接着回来读文章,接电话这一过程就是执行中断。 正是由于中断机制,计算机系统才能有条不紊地“同时”完成多个任务,中断机制实质上帮助提高了并
[单片机]
<font color='red'>STM32</font>学习笔记(2)外部中断
stm32系统时钟详解&&移植
写作原由:今日接手用stm32f100xx芯片开发的项目,以前用的是stm8s 和stm32f103xx芯片;因为在别人的项目代码的基础上做2次开发,但是发现那个代码main函数中没有对系统时钟的设置的相关函数,一直纳闷,但也没有深究,直至昨日 调试时出现串口收发数据出错,源代码在原项目的板子上串口发送、接收数据正常,同样程序在项目板子上收发的数据不正确, 两块板子芯片一样,串口收发管脚一样,最后发现原来板子外部晶振是8MHZ ,新板子外部晶振是12MHZ; 而在STM32固件库中,默认的外部晶振是8MHZ,由于时钟源不正确,导致波特率不正确,当然收发的数据也不正确了.....我勒个去!都怪自己平时看问题“不求甚解”。 (波特
[单片机]
<font color='red'>stm32</font>系统时钟详解&&移植
在单片机上实现动态加载功能
本项目是一个在单片机(如:STM32)上实现动态加载功能的函数库,与Windows中的dll,Linux中的so类似,可以将代码动态地从其他的存储介质,动态加载到RAM中。 软件架构 本项目文件夹有三个,其中common存储了用于生成可重定位的.axf文件的工程与动态加载器工程交互用的函数,src提供动态加载器的源码,rel_axf_project_template提供了一个简单的可重定位的.axf文件的工程示例,example.c是一个简单的使用示例,所有文件的主要功能如下: /common/dl_extern_lib.h 描述了app程序用于调用host程序的函数向量表的基地址,以及相关的一些宏定义 /common/dl_
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved