0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32F1两个USB中断入口详解

CHANBAEK 来源:一个早起的程序员 作者:一个早起的程序员 2023-07-24 11:12 次阅读

1 STM32F1两个USB中断入口

STM32中断入口有两个,分别是USB_HP_CAN1_TX_IRQHandler和USB_LP_CAN1_RX0_IRQHandler。

其中USB_Istr函数调用了CTR_LP函数,代码如下。

/*******************************************************************************
* Function Name  : USB_HP_CAN1_TX_IRQHandler
* Description    : This function handles USB High Priority or CAN TX interrupts
*                  requests.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void USB_HP_CAN1_TX_IRQHandler(void)
{
  CTR_HP();
}

/*******************************************************************************
* Function Name  : USB_LP_CAN1_RX0_IRQHandler
* Description    : This function handles USB Low Priority or CAN RX0 interrupts
*                  requests.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void USB_LP_CAN1_RX0_IRQHandler(void)
{
  USB_Istr();
}

2 CTR_LP

CTR_LP为低优先级端点传输正常时的中断服务函数,控制传输只能在CTR_LP里面处理,代码如下。

/*******************************************************************************
* Function Name  : CTR_LP.
* Description    : Low priority Endpoint Correct Transfer interrupt's service
*                  routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void CTR_LP(void)
{
  uint32_t wEPVal = 0;
  /* stay in loop while pending ints */
  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);
    if (EPindex == 0)
    {
      /* Decode and service control endpoint interrupt */
      /* calling related service routine */
      /* (Setup0_Process, In0_Process, Out0_Process) */

      /* save RX & TX status */
      /* and set both to NAK */
      SaveRState = _GetEPRxStatus(ENDP0);
      SaveTState = _GetEPTxStatus(ENDP0);
      _SetEPRxStatus(ENDP0, EP_RX_NAK);
      _SetEPTxStatus(ENDP0, EP_TX_NAK);


      /* DIR bit = origin of the interrupt */

      if ((wIstr & ISTR_DIR) == 0)
      {
        /* DIR = 0 */

        /* DIR = 0      = > IN  int */
        /* DIR = 0 implies that (EP_CTR_TX = 1) always  */


        _ClearEP_CTR_TX(ENDP0);
        In0_Process();

           /* before terminate set Tx & Rx status */
          _SetEPRxStatus(ENDP0, SaveRState);
          _SetEPTxStatus(ENDP0, SaveTState);
          return;
      }
      else
      {
        /* DIR = 1 */

        /* DIR = 1 & CTR_RX       = > SETUP or OUT int */
        /* DIR = 1 & (CTR_TX | CTR_RX) = > 2 int pending */

        wEPVal = _GetENDPOINT(ENDP0);
        if ((wEPVal & EP_CTR_TX) != 0)
        {
          _ClearEP_CTR_TX(ENDP0);
          In0_Process();
          /* before terminate set Tx & Rx status */
          _SetEPRxStatus(ENDP0, SaveRState);
          _SetEPTxStatus(ENDP0, SaveTState);
          return;
        }
        else if ((wEPVal &EP_SETUP) != 0)
        {
          _ClearEP_CTR_RX(ENDP0); /* SETUP bit kept frozen while CTR_RX = 1 */
          Setup0_Process();
          /* before terminate set Tx & Rx status */
          _SetEPRxStatus(ENDP0, SaveRState);
          _SetEPTxStatus(ENDP0, SaveTState);
          return;
        }

        else if ((wEPVal & EP_CTR_RX) != 0)
        {
          _ClearEP_CTR_RX(ENDP0);
          Out0_Process();
          /* before terminate set Tx & Rx status */
          _SetEPRxStatus(ENDP0, SaveRState);
          _SetEPTxStatus(ENDP0, SaveTState);
          return;
        }
      }
    }/* if(EPindex == 0) */
    else
    {
      /* Decode and service non control endpoints interrupt  */

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

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

      if ((wEPVal & EP_CTR_TX) != 0)
      {
        /* clear int flag */
        _ClearEP_CTR_TX(EPindex);

        /* call IN service function */
        (*pEpInt_IN[EPindex-1])();
      } /* if((wEPVal & EP_CTR_TX) != 0) */

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

  }/* while(...) */
}

3 CTR_HP

CTR_HP为高优先级端点传输正常时的中断服务函数,代码如下。

/*******************************************************************************
* Function Name  : CTR_HP.
* Description    : High Priority Endpoint Correct Transfer interrupt's service 
*                  routine.
* 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])();

    } /* 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])();


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

  }/* while(...) */
}

4 CTR_LP和CTR_HP各自处理的事务类型

这两个函数定义在usb_int.c中,用法如下。

CTR_LP(低优先级中断Low-priority interrupt),用于控制传输、中断传输、批量传输( 单缓冲模式)。

CTR_HP(高优先级中断 High-priority interrupt),用于快速大数据量传输处理,比如同步传输、批量传输,但是都是处理双缓冲模式。

5 核心注意要点

如果把只初始化了USB_LP_CAN1_RX0_IRQn中断向量,则所有的正确传输中断只会进入USB_LP_CAN1_RX0_IRQHandler->CTR_LP,所以要想进入CTR_HP必须对其中断向量进行初始化,否则会使用默认的CTR_LP路径进行处理。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • usb
    usb
    +关注

    关注

    60

    文章

    7890

    浏览量

    263944
  • STM32
    +关注

    关注

    2265

    文章

    10870

    浏览量

    354720
  • 中断
    +关注

    关注

    5

    文章

    895

    浏览量

    41384
  • stm32f1
    +关注

    关注

    1

    文章

    56

    浏览量

    12182
收藏 人收藏

    评论

    相关推荐

    STM32f1库函数开发

    ” 的学习STM32,实际操作过程中知识盲区比想象中要多很多!只做了两个GPIO口项目。实战一 · I/O口1. 文件夹结构USERsystem_stm32f10x.c系统时钟初始化函
    发表于 08-17 06:29

    STM32F1中断线是什么?

    STM32F1中断线是什么?
    发表于 11-18 06:00

    STM32F1USB串口该怎样去使用呢

    STM32F1USB串口该怎样去使用呢?与STM32F1USB串口基本配置相关的寄存器有哪些呢?
    发表于 12-06 07:09

    stm32F1输入捕获详解

    stm32F1输入捕获详解1、问题:什么叫输入捕获回答:举个例子,比如一信号由低电平变成高电平时,cpu保存定时器的值,信号再由高电平变成低电平时,cpu又保存一次定时器的值,那么通
    发表于 12-06 06:12

    STM32F1外部中断简介

    开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、 STM32F1 外部中断简介我们首先讲解 STM32F1 IO 口中断的一些基础
    发表于 12-09 07:26

    STM32F1通用定时器示例详解--TIM15_Compleme

    STM32F1通用定时器示例详解--TIM15_ComplementarySignals
    发表于 12-07 18:15 0次下载

    STM32F1通用定时器示例讲解_Timebase

    STM32F1通用定时器示例详解—Timebase
    发表于 12-07 18:14 0次下载

    STM32F1系列芯片中文参考手册

    STM32F1系列芯片中文参考手册(嵌入式开发培训教程)-STM32F1系列芯片的中文用户手册
    发表于 07-30 09:32 215次下载
    <b class='flag-5'>STM32F1</b>系列芯片中文参考手册

    STM32F1官方手册资料(中英文)

    STM32F1官方手册资料(中英文)
    发表于 11-05 16:28 69次下载

    STM32F1F4的区别

    STM32F1F4的区别
    发表于 12-04 13:51 24次下载
    <b class='flag-5'>STM32F1</b>和<b class='flag-5'>F</b>4的区别

    AN3427_从STM32F1移植到STM32F2的应用手册

    AN3427_从STM32F1移植到STM32F2的应用手册
    发表于 11-21 17:06 10次下载
    AN3427_从<b class='flag-5'>STM32F1</b>移植到<b class='flag-5'>STM32F</b>2的应用手册

    AN4904_从STM32F1STM32F4的软件移植

    AN4904_从STM32F1STM32F4的软件移植
    发表于 11-21 17:06 3次下载
    AN4904_从<b class='flag-5'>STM32F1</b>到<b class='flag-5'>STM32F</b>4的软件移植

    UM1847_基于STM32F1系列的STM32CubeF1软件库使用入门

    UM1847_基于STM32F1系列的STM32CubeF1软件库使用入门
    发表于 11-22 08:22 4次下载
    UM1847_基于<b class='flag-5'>STM32F1</b>系列的<b class='flag-5'>STM32CubeF1</b>软件库使用入门

    STM32F1 USB外设在USB系统的位置

    STM32F1 USB外设实现了USB2.0全速总线和APB1总线间的接口。
    的头像 发表于 07-17 15:43 1786次阅读
    <b class='flag-5'>STM32F1</b> <b class='flag-5'>USB</b>外设在<b class='flag-5'>USB</b>系统的位置

    stm32f1如何将外部中断关掉hal库

    引入相关的头文件。在HAL库中,与外部中断相关的头文件是stm32f1xx_hal_exti.h和stm32f1xx_hal_gpio.h。这两个头文件提供了对外部
    的头像 发表于 12-22 13:52 3190次阅读