您的位置 首页 发布

STM32 USB部分中止函数扼要剖析

在stm32f10x_itc中有下面这个函数voidUSB_LP_CAN1_RX0_IRQHandler(void){USB_Istr();}可见USB_Istr()是处理USB_LP_CAN1_RX

在”stm32f10x_it.c”中有下面这个函数

void USB_LP_CAN1_RX0_IRQHandler(void)
{
USB_Istr();
}

可见USB_Istr()是处理USB_LP_CAN1_RX0_IRQHandler中止的,而这个中止办理的是操控传输、中止传输、批量传输(单缓冲区)。

下面对此函数中要害部分进行剖析

wIstr = _GetISTR();这句说白了便是获取ISTR寄存器的值,从usb_regs.h中这个宏界说#define _GetISTR() ((uint16_t) *ISTR)中便知

#define IMR_MSK (CNTR_CTRM | CNTR_WKUPM | CNTR_SUSPM | CNTR_ERRM | CNTR_SOFM
| CNTR_ESOFM | CNTR_RESETM )这个宏界说便是声明下这些位的调集,估量要跟什么&下

ISTR_CTR是寄存器USB_ISTR中的CTR位,标明端点一次正确的传输

wInterrupt_Mask这个可能是表明答应CNTR中的哪些位中止

if (wIstr & ISTR_CTR & wInterrupt_Mask)那么这句话就简单理解了,便是说某位中止了并且是正确的传输,意思是咱们能够来处理了

ISTR_EP_ID是端点号

CTR_LP()这个函数是真实的中止服务函数,大致上的结构是这样的

EPindex = (uint8_t)(wIstr & ISTR_EP_ID);这句是读取端点号,下面分端点是否为0打开

if (EPindex == 0)

{//端点是0

if ((wIstr & ISTR_DIR) == 0)

{//获取方向标志,如果是0表明主机要“IN”数据

。。。。。。

In0_Process();//调用此函数

。。。。。。

}

else

{//方向标志为1,有两种状况,可能是主机要“OUT”也可能是在“SETUP”

if ((wEPVal &EP_SETUP) != 0)

{//在被主机setup

。。。。。。

Setup0_Process();//调用此函数

。。。。。。

}

else if ((wEPVal & EP_CTR_RX) != 0)

{//主机在out

。。。。。。

Out0_Process();//调用此函数

。。。。。。

}

}

}

else

{//端点非0

wEPVal = _GetENDPOINT(EPindex);

if ((wEPVal & EP_CTR_RX) != 0)

{//设备接纳完结

。。。。。。

(*pEpInt_OUT[EPindex-1])();//调用此函数

。。。。。。

}

if ((wEPVal & EP_CTR_TX) != 0)

{//设备发送完结

。。。。。。

(*pEpInt_IN[EPindex-1])();//调用此函数

。。。。。。

}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/260350.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部