logo资料库

基于STM32的USB程序开发笔记.pdf

第1页 / 共66页
第2页 / 共66页
第3页 / 共66页
第4页 / 共66页
第5页 / 共66页
第6页 / 共66页
第7页 / 共66页
第8页 / 共66页
资料共66页,剩余部分请下载后查看
基于STM32的USB程序开发笔记
基于STM32 的USB程序开发笔记 以前一直就有打玩 USB 的想法,最近时间充足于是决心打玩 STM32 的 USB,购买的是万利的 STM3210B-LK1 板,琢磨 USB 已有半个 多月,在固 件、上位机驱动以及应用程序的访问这三方面终于有所突破,这期间通过网络上授寻了许多相关资料,主要来自 ST 提供 的 USB 固件,以及圈圈 (computer00)提供的一些关于 USB 驱动开发的资料,通过这段时间的学习,了解到学习 USB 对于未接触过的朋 友来说确实存在许多的知识壁垒,本 着开源精神,在此对 STM32 的 USB 固件程序的编写、DriverStudio + WindowsXP DDK + VC6 驱 动开发以及应用程序做了一些介绍,为更好理解,请仔细学习 STM32 USB 的参考手册以及 USB 协议,如果对 VC6 下开发还不是太熟悉 或者说不曾学过,那么如果想理解有些问题,就必须学习 VC6 了。本套笔记是基于我编写的程序进行说明的,请配合该程序进行学习。 第一篇:需要准备的一些资料 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()等等,在此 说明不支持非故意如此,而是还没去更仔细深入编写完善,目前这些不被支持的部分目前不被使用到。 下载链接:http://blog.ednchina.com/lbxxx
如果你使用的是万利的 STM3210B-LK1 开发板,则可以烧写 hex 文件后直接进行测试。以下一组图片说明的 XP 下驱动的安装过程以及 测试软件打开后的情形,仅参考。
测试软件:控制万利 STM3210B-LK1 开发板的 4 个 LED,并定时读取 Joystick 状态
第 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);
分享到:
收藏