STM32 USB部分中断函数简要分析
2016-08-27 17:16
489 查看
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])();//调用此函数
。。。。。。
}
}
{
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])();//调用此函数
。。。。。。
}
}
相关文章推荐
- mysql 列转行,合并字段
- 关于css3中的flex
- Xtreme ToolkitPro v15.3.1中SkinBuilder.exe皮肤编辑工具的使用
- C++11中的std::bind
- LFM隐语义模型
- 异常e.printStackTrace();这个方法与e.getMessage();有什么区
- STM32F USB中断分析
- 字符串全排列
- 【 D3.js 入门系列 --- 3 】 做一个简单的图表!
- 整数规划(蒙特卡洛)
- 关于Scoket的一些愚见
- Qt安装及交叉编译环境设置
- hdu4812-D Tree (树的点分治)
- 轻松掌握:JavaScript状态模式
- BSOJ4835刷漆(Codechef October Challenge 2014:Remy paints the fence)
- oracle数据库的七个压缩包
- Unity4.6 UI按钮绑定事件(一)
- ionic组件ion-tabs选项卡切换效果实例
- [完]Linux下安装Java环境
- HashMap和Hashtable的区别