你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32的USB程序开发笔记(一、二)

[复制链接]
乡村布拉德 发布时间:2008-12-23 11:48
lbxxx原创 

 
基于STM32的USB程序开发笔记(一)

第一篇:需要准备的一些资料

1:STM32的参考手册,这对于设备底层USB的硬件配置以及事件驱动机制的了解尤为重要,你需要了解各个寄存器的功能以及如何操作,比如CNTR、ISTR、EPnR、DADDR等等,如果你想学习USB,这个手册是必须的。
2:USB2.0 协议,这个资料同样必不可少,如果因为英语阅读能力而苦苦寻找中文版的USB2.0协议,建议不要这么做,现在网络中的所谓的中文版的USB2.0协议不是官方撰写的,大多数是一些热心朋友自己翻译的,却不是很全面,如果你在为寻找这类的资料而无所获时,建议认真塌实的看看官方英文版的USB2.0协议,官方协议阐述的十分详细,650多页,一字一句的了解全部协议不太可行,可针对性的重点理解,比如对第9章USB Device Framework的详细理解对于你的USB Device固件开发不可缺少(这里就是STM32)。
3:ST提供的USB固件库,这个类库较为散乱,但不可不参考

以下是最近这段时间的成果,包含固件、驱动以及应用程序,固件部分有些功能是不被支持的,如SR_SetDescriptor()、 SR_SynchFrame()等等,在此说明战士不支持非故意如此,而是还没时间仔细深入编写完善,因为这些目前不被支持的部分目前不被使用到。
后序将接着对各个部分进行一些说明,希望朋友们多多支持,同时欢迎朋友们讨论。
如果你使用的是万利的STM3210B-LK1开发板,则可以烧写hex文件后进行测试。

下载该文件请参阅:
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=1808061&bbs_page_no=1&bbs_id=3020


第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参考手册,下篇将针对这些响应函数进行逐一的详细介绍。
收藏 1 评论2 发布时间:2008-12-23 11:48

举报

2个回答
党国特派员 回答时间:2015-1-21 09:27:29
1.png
wxh0000mm 回答时间:2015-1-21 09:53:17
谢谢分享

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版