原创 基于STM32的USB程序开发笔记(二)

2008-11-18 21:57 10982 11 12 分类: MCU/ 嵌入式
第2篇:STM32 USB固件函数的驱动原理
首先需要了解一个概念:
USB设备(DEVICE)从来只是被动触发,USB主机(HOST)掌握主动权,发送什么数据,什么时候发送,是给设备数据还是从设备请求数据,都是由USB主机完成的,USB设备只是配合主机完成设备的枚举、数据方向和大小。根据数据特性再决定该不该回复该如何回复、该不该接收该如何接收这些动作。
了解这些,再仔细查看STM32的参考手册USB部分以及STM32的中断向量表,从中可以找到两个中断:
/*******************************************************************************
* Function Name  : USB_HP_CAN_TX_IRQHandler
* Description    : This function handles USB High Priority or CAN TX interrupts
*                  requests.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void USB_HP_CAN_TX_IRQHandler(void)
{
  USB_HPI();
}

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

即USB的高、低优先权中断处理函数,这也是整个STM32 USB的事件驱动源,USB_HPI()与USB_LPI()既而转向usb_core(.c,.h)进行相关处理。中断传输(interrupt)、控制传输(control)、大流量传输(bulk)由USB_LPI()响应,大流量传输(bulk)同样可能响应USB_HPI(),同步传输(isochronous)只响应USB_HPI()。

这样响应USB的所有请求只需要关注usb_core.c文件中的USB_LPI()与USB_HPI()函数。由于本人也是对USB刚刚有所了解,因而在本例笔记中USB_HPI()函数未做任何处理,在此开源希望大家能完善与纠正错误并能共享喜悦。以下是USB_LPI()函数:
// *****************************************************************************
// Function Name  : USB_LPI.
// Description    : Low Priority Interrupt's service routine.
// Input          :
// Output         :
// Return         :
// *****************************************************************************
void USB_LPI(void)
{
  unsigned short wValISTR = GetISTR();

#if(CNTR_MASK & ISTR_RESET)   // Reset
  if(wValISTR & ISTR_RESET & vwInterruptMask)
  {
    SetISTR(CLR_RESET);
    INT_ISTR_RESET();
  }
#endif

#if(CNTR_MASK & ISTR_DOVR)   // DMA Over/Underrun
  if(wValISTR & ISTR_DOVR & vwInterruptMask)
  {
    SetISTR(CLR_DOVR);
    INT_ISTR_DOVR();
  }
#endif

#if(CNTR_MASK & ISTR_ERR)   // Error
  if(wValISTR & ISTR_ERR & vwInterruptMask)
  {
    SetISTR(CLR_ERR);
    INT_ISTR_ERROR();
  }
#endif

#if(CNTR_MASK & ISTR_WKUP)    // Wakeup
  if(wValISTR & ISTR_WKUP & vwInterruptMask)
  {
    SetISTR(CLR_WKUP);
    INT_ISTR_WAKEUP();
  }
#endif

#if(CNTR_MASK & ISTR_SUSP)   // Suspend
  if(wValISTR & ISTR_SUSP & vwInterruptMask)
  {
    INT_ISTR_SUSPEND();
    SetISTR(CLR_SUSP);     // must be done after setting of CNTR_FSUSP
  }
#endif

#if(CNTR_MASK & ISTR_SOF)   // Start Of Frame
  if(wValISTR & ISTR_SOF & vwInterruptMask)
  {
    SetISTR(CLR_SOF);
    INT_ISTR_SOF();
  }
#endif

#if(CNTR_MASK & ISTR_ESOF)   // Expected Start Of Frame
  if(wValISTR & ISTR_ESOF & vwInterruptMask)
  {
    SetISTR(CLR_ESOF);
    INT_ISTR_ESOF();
  }
#endif

#if(CNTR_MASK & ISTR_CTR)   // Correct Transfer
  if(wValISTR & ISTR_CTR & vwInterruptMask)
  {
    INT_ISTR_CTR();
  }
#endif
}

// *****************************************************************************
// Function Name  : USB_HPI.
// Description    : High Priority Interrupt's service routine.
// Input          :
// Output         :
// Return         :
// *****************************************************************************
void USB_HPI(void)
{
 
}

可以看出,在USB_LPI()函数中,根据STM32 USB的中断状态寄存器(ISTR)的标志位的状态以及定义的USB控制寄存器中断事件屏蔽码,响应各自的中断事件,比如INT_ISTR_RESET()响应USB的复位中断,一般可在此函数内进行USB的寄存器的初始化;INT_ISTR_CTR()响应一次正确的数据传输中断,故名思意,在完成一次正确的数据传输操作后,就会响应此函数。
具体含义请仔细查阅STM32参考手册,下篇将针对这些响应函数进行逐一的详细介绍。



PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1241316 2008-11-20 13:26

您好,我是WWW.STMFANS.COM的站长。 我们是专业讨论stm32 的论坛。 看了你的文章写的不错。 邀请你一起加入我们这个团体。 期待您的原创作品能到我们的网站上面也抄送一份。
相关推荐阅读
用户1206224 2010-11-22 08:05
基于STM32的智能交通信号机
基于STM32的智能交通信号机,有兴趣探讨的朋友可以跟我联系...
用户1206224 2010-03-26 21:30
STM32 USB 源代码及笔记下载 修复贴
今年比较忙,很少来空间,看到大家的留言,故发布此STM32 USB 源代码及笔记下载修复贴STM32 USB固件以及上位机驱动、应用程序源程序:笔记:...
用户1206224 2010-03-26 21:28
STM32 SD卡FATFS移植
最近试玩了STM32用SPI方式操作SD卡,这样就涉及到文件系统,搜索到几种支持FAT16/32的文件,综合考虑,最后选择了完全开源、免费的FATFS,版本是R0.07e,该版本支持长文件名:Wind...
用户1206224 2009-06-02 08:53
基于STM32的USB程序开发笔记(一)
第一篇:需要准备的一些资料1:STM32的参考手册,这对于设备底层USB的硬件配置以及事件驱动机制的了解尤为重要,你需要了解各个寄存器的功能以及如何操作,比如CNTR、ISTR、EPnR、DADDR等...
用户1206224 2009-06-02 08:51
STM32的16路ADC的USB高速采集
STM32的16路ADC的USB高速采集前提:本例基于STM32F103VBT6平台功能说明:16路AD转换并将结果通过USB发送至PC,PC端驱动为定制编写,并附带一款测试软件。附件说明:1:STM...
用户1206224 2009-03-28 09:50
第二版STM32F103ZET6最小系统板实物照片
第二版STM32F103ZET6最小系统板实物照片,PCB工艺不是好,手工焊接后也很脏。第二版硬件上没有问题,各项都调试通过,但综合多种因素,该套小板原则上不会制作并对外,但还是非常感谢大家这段时间对...
EE直播间
更多
我要评论
1
11
关闭 站长推荐上一条 /3 下一条