基于STM32的USB程序开发笔记
基于STM32F103芯片的USB接口的研究与实现

基于STM32F103芯片的USB接口的研究与实现一、本文概述随着科技的飞速发展,USB接口作为一种便捷、高效的数据传输方式,在电子设备中得到了广泛应用。
STM32F103芯片作为STMicroelectronics公司推出的一款基于ARM Cortex-M3内核的32位微控制器,具有高性能、低功耗、易于编程等优点,被广泛应用于各种嵌入式系统中。
本文将围绕STM32F103芯片的USB接口展开研究,详细探讨其原理、设计与实现方法。
本文首先介绍了STM32F103芯片的基本特性和USB接口的基本原理,包括USB协议栈、数据传输方式等。
接着,对STM32F103芯片的USB 接口硬件设计进行了详细描述,包括硬件电路的选择、接口电路设计、电源管理等。
在软件设计方面,本文详细介绍了USB驱动程序的开发过程,包括驱动程序的架构、主要功能实现以及关键技术的处理等。
为了实现STM32F103芯片与USB设备之间的数据传输,本文还设计了基于USB HID类设备的通信协议。
该协议利用USB HID类设备的通用性,实现了STM32F103芯片与USB设备之间的无缝连接和数据传输。
本文还通过实验验证了USB接口设计与实现的正确性,并分析了在实际应用中的性能表现。
本文总结了STM32F103芯片USB接口的研究与实现过程,指出了其中存在的不足之处,并对未来的研究方向进行了展望。
通过本文的研究,旨在为嵌入式系统开发人员提供一种基于STM32F103芯片的USB接口设计与实现方案,推动嵌入式系统中USB接口技术的进一步发展。
二、STM32F103芯片USB接口基础知识STM32F103芯片是STMicroelectronics公司生产的一款基于ARM Cortex-M3核心的微控制器,它集成了丰富的外设接口,其中包括USB 接口。
对于STM32F103来说,其USB接口主要基于USB 0标准,提供了高速的数据传输能力。
STM32F103的USB接口主要由以下几个部分构成:USB外设控制器、USB收发器以及USB的电源管理。
一种基于STM32的USB接口数据通信方法研究

STM32USB摘要随着USB 接口的普及,USB 接口在各种数据传输时使用越来越广泛。
而STM32 芯片作为一种低成本、高性能的嵌入式芯片,其内置的USB 接口功能能够帮助设计者实现USB 设备,从而实现主机与设备的数据通信。
本文将介绍一种基于STM32 芯片的USB 接口数据通信方法,包括USB 的软件架构设计、USB 的硬件电路设计以及数据传输流程的实现。
关键词:STM32,USB,数据通信,软件设计,硬件设计一、引言USB ( Universal Serial Bus)接口已经成为现代计算机中最通用和流行的接口之一,几乎所有的个人电脑、笔记本电脑、智能手机和其他电子设备都带有USB 接口。
USB 通信可以用于设备与计算机之间的数据传输、信息采集、控制等领域。
而STM32 芯片又是目前市面最为流行的一款嵌入式芯片,其内置的USB 接口功能在数据通信技术中发挥着重要的作用。
本文将介绍一种基于STM32 芯片的USB 接口通信方法,包括软件与硬件两方面的设计。
二、USB 的软件架构设计在STM32 芯片上实现USB 功能,需要先对其软件架构进行设计。
USB 软件的设计涉及到3 个方面的问题:USB 设备、USB 接口驱动和USB 协议栈。
1、USB 设备:USB 设备是USB 设备架构的核心,它需要满足USB 的规格要求,并且包含了数据缓存区、寄存器和其他关键的USB 接口组件。
因此,实现USB 设备需要编写驱动程序和数据传输协议,主机端调用该接口完成数据传输,向USB 设备发送数据时称之为OUT 端点,从USB 设备接收数据时称之为IN 端点。
2、USB 接口驱动:USB 接口驱动是用于与USB 设备进行通信的软件,它支持各种不同的USB 设备、USB 总线和USB 主控芯片,能够完成设备的初始化、寄存器的读写以及数据的发送和接收。
3、USB 协议栈:USB 协议栈是实现USB 协议必要的软件,是独立存在的USB 软件单元。
STM32-USB讲解

IN 令牌包来的时候,SIE 负责把它返回给主机。 主要代码如下: UserToPMABufferCopy(Mouse_Buffer, GetEPTxAddr(ENDP1), 4); //从用户复制四个字节到端点1缓冲区,控制端点的输入缓冲区。 SetEPTxValid(ENDP1);/* enable endpoint for transmission */ 4、中断处理过程大致理解 (1)usb_istr()函数中的中断处理简单分析 有用的代码大概以下几段,首先是处理复位的代码,调用设备结构中的复位处 理函数。 wIstr = _GetISTR(); if (wIstr & ISTR_RESET & wInterrupt_Mask) { _SetISTR((u16)CLR_RESET); //清复位中断
复位中 挂起中 断允许 断允许 位。 位。 RESET SUSPM M。1有 ,1有效,效,软件 当总线 强制复 挂起标 位和总 志置位 线复位 时,发生 信号,都 挂起中 能触发 断。 复位中
断。
帧首中 断允许 位
期望帧 首中断 允许位。 ESOFM。 它的含 义是没 有收到 帧首信 号,允许 发生中 断。
if (fSuspendEnabled) /* check if SUSPEND is possible */ { Suspend(); } else { /* if not possible then resume after xx ms */
Resume(RESUME_LAT ER); } /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */ _SetIST R((u16)CLR_SUSP); } 处理端点传输完成的代码,这段是最重要的,它调用底层 usb_int.c()文件中 的 CTR_LP()函数来处理端点数据传输完成中断。 if (wIstr & IST R_CT R & wInterrupt_Mask) { CTR_LP();/* servicing of the endpoint correct transfer interrupt */ }
STM32 USB设计单片机程序篇

STM32 USB设计单片机程序篇首先,我们来看看usb的工作过程。
当usb设备接入到主机时,主机开始枚举usb设备,并向usb设备发出指令要求获取usb 设备的相关描述信息,其中包括设备描述(device descriptor)、配置描述(configuration descriptor)、接口描述(interface descriptor)、端点描述(endpoint descriptor)等。
这些信息是通过端点0(endpoint 0)传送到主机的。
获取各种描述信息后,操作系统会为其配置相应的资源。
这样主机就可以与设备之间进行通信了。
usb通讯有四种通讯方式控制(control)、中断(interrupt)、批量(bulk)和同步(synchronous)。
usb通讯是通过管道(pipe)实现的。
管道是一个抽象的概念,指的是主机与设备之间通讯的虚拟链路。
不如说一个usb通讯主机A和设备B,其中有bulk in(批量输入)、bulk out(批量输出)、control out(控制输出)三种通讯方式,那么A与B之间的通讯管道就有三个。
(这里明确一个概念,在usb通信中数据流向都是相对设备来说的,in表示设备向主机传送数据,out表示表示主机箱设备传输数据)。
在设备一端,每个管道对应一个端点,端点配置相关的寄存器和缓冲区。
在通讯之前需对端点进行相关设置。
在通信中,只需向缓冲写或读数据,并置位相关比特位即可。
下面具体从usb的中断输入输出来讲述基于keil C mdk开发环境的stm32的USB接口单片机程序设计。
值得一提的是,st或相关公司给我们提供许多封装函数和相关例子,我们可以根据其中的例子并进行修改即可实现我们自己需要的usb通讯程序。
b描述符配置从上面的讲述可以看出,usb描述符是usb通讯的前提。
主机必须先了解设备后才能与其进行通讯。
在st提供的例子中,描述符都在usb_des.c文件进行定义,下面就其中的Joystick例子说明usb描述负的配置。
基于STM32的USB程序开发笔记

基于STM32的USB程序开发笔记(一、二)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文件后进行测试。
下载该文件请参阅:/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的高速USB通信模块设计与实现USB(Universal Serial Bus)是一种通用串行总线标准,可用于连接计算机与外部设备,例如打印机、键盘、鼠标等。
STM32是一种基于ARM Cortex-M内核的单片机系列,具有高性能和丰富的外设。
本文将介绍基于STM32的高速USB通信模块的设计与实现。
首先,我们需要选择一个适合的STM32单片机型号。
在选择时,我们应考虑USB的速度要求、外设的功能要求以及单片机的处理能力和资源。
在高速USB通信中,我们可以选择STM32F4系列,因为它具有高速USB2.0 OTG(On-The-Go)接口和丰富的外设,适合高速数据传输。
接下来,我们需要设计硬件电路。
在设计过程中,我们需要包括STM32单片机、USB接口芯片、时钟电路、电源电路、外设等。
其中,USB接口芯片起着桥接STM32和USB总线的作用,负责协议转换和数据传输。
时钟电路为单片机提供稳定的时钟信号。
电源电路为单片机和外设提供适当的电源供应。
完成硬件设计后,我们需要进行软件编程。
首先,我们需要在STM32单片机上配置USB外设,并初始化必要的寄存器。
接下来,我们需要编写USB协议栈的驱动程序,实现设备枚举和数据传输。
在数据传输方面,我们可以选择使用Bulk传输方式,它适用于大容量数据传输,且具有较高的效率。
在软件编程过程中,我们还需要编写应用层代码,实现与外部设备的通信。
例如,我们可以编写一个USB打印机驱动程序,实现打印机的功能。
在编写驱动程序时,我们需要根据USB设备类的规范进行开发,以确保驱动程序与外部设备兼容。
在实现阶段,我们需要对硬件电路进行布线和焊接,以及对软件进行调试和优化。
在调试过程中,我们可以使用调试器和示波器等工具进行实时监测和调试。
最后,我们可以进行性能测试和稳定性测试,以验证设计的可靠性和性能。
在测试过程中,我们可以使用基准测试工具和负载测试工具,以模拟实际应用场景,并检查系统的数据传输速度和稳定性。
STM32 USB HID

void USB_Reset (void) { /* Double Buffering is not yet supported */
ISTR = 0; /* Clear Interrupt Status */ //:CNTR_RESETM 在使能连接时被中断使能 //:CNTR_CTRM 此处添加(正确传输中断使能==>某个端点成功完成一次传输.) //:下一次事件中断将检测 CNTR_CTRM 中断 // 究竟是哪个端点成功传输(ISTR:EP_ID[3:0]),数据方向(ISTR:DIR) CNTR = CNTR_CTRM | CNTR_RESETM | (USB_SUSPEND_EVENT ? CNTR_SUSPM : 0) | (USB_WAKEUP_EVENT ? CNTR_WKUPM : 0) | (USB_ERROR_EVENT ? CNTR_ERRM : 0) | (USB_ERROR_EVENT ? CNTR_PMAOVRM : 0) | (USB_SOF_EVENT ? CNTR_SOFM : 0) | (USB_SOF_EVENT ? CNTR_ESOFM : 0); FreeBufAddr = EP_BUF_ADDR; BTABLE = 0x00; /* Setup Control Endpoint 0 */ pBUF_DSCR->ADDR_TX = FreeBufAddr; //: FreeBufAddr += USB_MAX_PACKET0; //: pBUF_DSCR->ADDR_RX = FreeBufAddr; //: FreeBufAddr += USB_MAX_PACKET0; //: if (USB_MAX_PACKET0 > 62) { pBUF_DSCR->COUNT_RX = ((USB_MAX_PACKET0 << 5) - 1) | 0x8000; } else { pBUF_DSCR->COUNT_RX = USB_MAX_PACKET0 << 9; } //配置端点 0: //1: EP_CONTROL(控制端点) bit[10:9](EP_TYPE[1:0]) //自由缓冲区地址 /* set BTABLE Address */
基于stm32f103的usb2.0代码

基于STM32F103的USB2.0代码一、简介STM32F103是意法半导体推出的一款基于ARM Cortex-M3内核的微控制器,具有丰富的外设功能和较高的性能。
USB(Universal Serial Bus)是一种通用串行总线,广泛应用于计算机和其他电子设备之间的数据传输和连接。
基于STM32F103的USB2.0代码即指针对STM32F103微控制器开发的支持USB2.0标准的代码。
二、USB2.0USB2.0是Universal Serial Bus的第二代标准,具有高速传输和广泛兼容的特点。
USB2.0可以实现最高480Mbps的数据传输速度,是USB1.1标准的40倍。
在电脑外设、数字相机、移动设备等领域得到了广泛的应用。
三、基于STM32F103的USB2.0代码开发1. 硬件支持在使用STM32F103微控制器开发USB2.0代码时,首先需要确保硬件的支持。
STM32F103系列微控制器内部集成了USB OTG(On-The-Go)功能,支持USB2.0协议。
通过配置GPIO端口和时钟等硬件资源,可以实现与USB外设的连接。
2. USB Library意法半导体提供了相应的USB库,用于快速开发基于STM32F103的USB2.0代码。
该库包括了USB设备协议栈(Device stack)和USB主机协议栈(Host stack),可以根据实际应用选择相应的协议栈进行开发。
USB库还提供了丰富的例程和示例代码,便于开发者进行参考和调试。
3. USB协议栈在开发基于STM32F103的USB2.0代码时,需要了解USB协议栈的原理和实现。
USB协议栈主要包括物理层(Physical Layer)、传输层(Transport Layer)、设备层(Device Layer)和应用层(Application Layer)等,开发者需要对每一层的功能和接口进行深入理解,以便进行代码的开发和调试。
基于STM32的USB枚举过程学习笔记(四)

基于STM32的USB枚举过程学习笔记(四)前几篇介绍中,USB 主机完成了获取设备的描述符,现在进入第二步,设置设备的地址阶段。
该阶段是一个无数据过程的控制传输。
首先,在建立过程中USB 主机往设备的端点0 发出一个设置地址的请求,新地址在建立过程的数据包中。
该事务的结构包括:SETUP0 令牌包+SET_ADDRESS 数据包+ 握手包。
在建立过程之后直接进入到的状态过程,因为设置地址阶段是一个无数据过程的控制传输。
在状态过程,设备等待主机请求状态返回(即等待主机发送一个IN 令牌包),收到IN 令牌包后,设备就返回一个0 长度的数据包,如果主机确认该数据包已经正确收到,就会发送应答包ACK 给设备,设备收到ACK 之后,就要启动新的设备地址,这样设备就分配到了一个唯一的设备地址。
接下来将这段设置地址的过程通过USB 分析仪捕捉分析如下接着分析STM32 USB_HID 例子中的枚举过程的设置地址阶段。
同样在接收到主机的setup0 令牌后,STM32 USB 进入中断处理函数Setup0_Process(),由于是没有数据过程的控制传输,接着进入NoData_Setup0()函数,函数最后通过USB_StatusIn()等待主机的IN 令牌,即状态阶段。
主机发IN 令牌进入到状态阶段,USB 中断函数中执行In0_Process()函数,该函数把在建立过程函数Setup0_Process()中保存在pInformation 的地址信息,通过SetDeviceAddress()函数,配置新的设备地址。
串口的调试信息如下至此,设备新的地址设置成功,这里设置成0x6,之后的过程将使用这个新。
5 我的基于STM32的USB学习笔记

对USB的初步了解:1、USB的优点:可以热插拔,即插上后可以自动识别;系统总线供电,USB共有四根线,一根电源线,一根地线,一根D+线,一根D-线,D+和D-线是差分输入线;可以支持多种设备,且扩展容易,通过HUB可以再一个主机上连接多个设备传输数据的速度快,最快可达480Mbit/s方便的设备互联:在没有主机的情况下,实现点到点的通信(还可以实现主从互换)(USB OTG)2、USB的基本规范:USB1.0/1.1 低速情况下1.5Mbit/s:键盘、鼠标等全速情况下12Mbit/s:U盘、CD-ROMUSB2.0 高速达到480Mbit/s:音频设备、显示器等USB OTG 设备到设备的传输3、USB设备类规范:大容量存储设备类(Mass Storage Device)U盘、CD-ROM等人机交互设备类(Human Interface Device)键盘、鼠标、游戏手柄语音设备类(Audio Device)麦克风、音响等通信设备类(Communication Device)电话、调制解调器等打印机设备类(Printer Device)打印机监视设备类(Monitor Device)显示器、摄像头等4、USB逻辑上分为3:信号层,协议层,数据传输层协议层:包是USB系统中信息传输的基本单位,所有的数据都是经过打包后在总线上传输的。
包由6部分组成:同步字段(SYNC);包标识符(PID);地址字段(ADDR);数据字段(DA TA);检验字段(CRC);包结束(EOP)包标识符(PID):令牌包(Token)(输出,输入,帧起始,建立),数据包(DA TA)(数据,数据1),握手包(Handsnake)(确认,不确认,停止),专用包(Special)(前同步)5、USB协议提供4种数据传输方式:控制传输:突发,非周期性,由主机发起,用于命令和状态的传输同步传输:周期性,持续性的传输,用于传输与时效相关的信息,并且在数据中保存时间戳的信息中断传输:周期性,低频率,允许有限延迟的通信大容量的数据传输:非周期性,大容量突发数据的通信6、USB描述符:1)设备描述符:描述设备的类型、厂商信息、USB的协议类型、端点的报数据的最大长度等,每个USB设备只有一个Device Descriptor2)配置描述符:每个配置描述符提供了设备特定的配置,描述了设备的接口和端点的性质、供电模式、设备的耗电3)接口描述符:描述了设备的不同接口的特性,例如,一个设备U盘的功能,又有键盘的功能,用两个接口描述符分别描述两个功能4)字符串描述符:描述了设备制造商、设备名称、何序列号等信息基于STM32制作USB的过程STM32的USB模块特性:遵循USB2.0全速设备标准支持双向8个端点,8个IN端点和8个OUT端点(每个端点最大可使用512字节)[ 每个端点都有一个缓冲区描述块,描述该端点使用的缓冲区地址、大小和需要传输的字节数]硬件实现CRC自动生成/校验,NRZI编码/解码和bit-stuffing(位插入,位填充)支持控制传输、中断传输、大容量传输和同步传输四种传输方式支持USB的挂起和/唤醒***USB设备的实现过程***一、系统初始化1、初始化系统时钟,设置USB时钟2、配置USB中断,选择通道,设置优先级,使能中断3、配置GPIO4、USB的初始化,对描述符、设备的端点接口等的初始化5、FLASH的初始化二、USB的枚举枚举过程就相当于主机和设备建立连接的过程(接头),Host向Device询问一些东西,Device将自身的设备类型,如何进行通信报告给Host,这样,Host就知道怎么对Device 进行操作。
基于STM32的USB通信程序设计

基于STM32的USB通信程序设计一、概述随着USB接口在各种设备中的广泛应用,基于STM32的USB通信程序设计变得越来越重要。
本文将介绍如何使用STM32开发板实现USB通信功能。
二、STM32USB库STM32官方提供了一个USB库,通过这个库可以方便地实现USB通信。
首先需要将该库添加到STM32的开发环境中,然后按照官方提供的文档来进行配置和使用。
三、USB通信原理USB通信一般分为两部分:主机端和设备端。
主机端通常指的是电脑或者其他设备,设备端就是STM32开发板。
在USB通信中,主机端包括主机控制器和主机驱动程序,设备端包括设备控制器和设备固件。
主机控制器负责管理USB总线上的设备并与设备进行通信。
主机驱动程序负责与主机控制器进行通信,将收到的数据传递给相应的应用程序。
设备控制器负责将设备固件的数据传送到USB总线上,并接收来自主机的数据。
设备固件负责将来自设备控制器的数据交给相应的应用程序处理。
四、USB通信程序设计步骤1.硬件连接:根据实际情况将STM32开发板与主机进行连接。
2.导入USB库:在STM32的开发环境中添加STM32USB库。
3.配置USB库:根据实际需求,在STM32的开发环境中配置USB库。
4.编写主机驱动程序:在主机上编写一个驱动程序,用于与STM32设备进行通信。
5.编写设备固件:在STM32开发板上编写一个固件程序,用于与主机进行通信。
6.测试:将开发板连接到主机上,运行主机驱动程序和设备固件,测试USB通信功能的可靠性和稳定性。
五、常见问题解决办法B通信中断问题:在USB通信过程中,由于硬件和软件的原因,可能会出现通信中断的情况。
解决该问题需要仔细检查硬件连接和对USB 库的配置。
2.数据传输错误:在USB通信过程中,可能会出现数据传输错误的情况。
解决该问题需要仔细检查数据传输的流程和数据处理的逻辑。
3.设备识别问题:在USB通信过程中,可能会出现设备无法被主机识别的情况。
STM32学习之USB深入浅出(四)

STM32学习之USB深⼊浅出(四)⼀、STM32 的USB结构框图USB模块为PC主机和微控制器所实现的功能之间提供了符合USB规范的通信连接。
PC主机和微控制器之间的数据传输是通过共享⼀专⽤的数据缓冲区来完成的,该数据缓冲区能被USB外设直接访问。
这块专⽤数据缓冲区的⼤⼩由所使⽤的端点数⽬和每个端点最⼤的数据分组⼤⼩所决定,每个端点最⼤可使⽤512 字节缓冲区,最多可⽤于16个单向或8 个双向端点。
USB 模块同PC主机通信,根据USB规范实现令牌分组的检测,数据发送/ 接收的处理,和握⼿分组的处理。
整个传输的格式由硬件完成,其中包括CRC的⽣成和校验。
每个端点都有⼀个缓冲区描述块,描述该端点使⽤的缓冲区地址、⼤⼩和需要传输的字节数。
当USB模块识别出⼀个有效的功能/ 端点的令牌分组时,( 如果需要传输数据并且端点已配置) 随之发⽣相关的数据传输。
USB模块通过⼀个内部的16位寄存器实现端⼝与专⽤缓冲区的数据交换。
在所有的数据传输完成后,如果需要,则根据传输的⽅向,发送或接收适当的握⼿分组。
⾸先在总线端(与D+、D-相连的那⼀端),通过模拟收发器与SIE连接。
SIE使⽤48MHz的专⽤时钟。
与SIE相关的的有三⼤块:CPU内部控制、中断和端点控制寄存器,挂起定时器(这个好像是USB协议的要求,总线在⼀定时间内没有活动,SIE模块能够进⼊SUSPEND状态以节约电能),还有包缓冲区接⼝模块。
说到包缓冲区接⼝模块,这个对应的含义是,USB设备应该提供USB包缓冲区。
这块缓冲区同时受到SIE和CPU核⼼的控制,⽤于CPU与SIE共享达到数据传输的⽬的。
所以CPU通过APB1总线接⼝访问,SIE通过包缓冲区接⼝模块访问,中间通过Arbiter来协调访问。
当然我们关注的中⼼点是控制、中断和端点控制寄存器。
我们通过这些寄存器来获取总线传输的状态,控制各个端点的状态,并可以产⽣中断来让CPU处理当前的USB事件。
基于STM32的USB枚举过程学习笔记(一)

基于STM32的USB枚举过程学习笔记(一)之前使用ST 官方的库以及网络的资料,完成了使用USB HID 类进行STM32 和PC 机的通讯。
由于其他原因并没有深入的分析,虽然实现了功能,但是关于USB 设备的枚举,以及具体的通讯方式都没有清晰的概念,所以现在回头重新学习USB 相关知识。
主要参考资料是《圈圈教你玩USB》、USB 枚举过程图解,ST 官方的USB HID 例程。
一,USB 数据包 B 数据包分类USB 总线上的数据传输以包为基本的单位。
USB 协议规定了四种包:令牌包、数据包、握手包、特殊包。
不同的包通过包中的8 位PID 域区分。
令牌包令牌包用于启动一次USB 传输,USB 的数据传输必须由主机发起。
令牌包有四种:输出令牌包(OUT):用来通知设备将要输出一个数据包。
数据方向主机--> 设备输入令牌包(IN):用来通知设备将要返回一个数据包。
数据方向设备-->主机建立令牌包(SETUP):通知设备将要输出一个数据包,类似OUT 包。
不过SETUP 包只能往端点0 发包,只用在控制传输中。
帧起始包(SOF):用于帧计数,USB 全速设备每毫秒产生一帧,USB 高速设备每125μS 产生一帧。
OUT , IN, SETUP 包的结构:同步域+8 位PID+7 位地址+4 位端点号+5 位CRC 校验+包结束符EOP数据包数据包用来传输数据,分成DATA0. DATA1 。
数据格式如下同步域+8 位PID+N 个字节的数据+CRC16 校验+包结束符EOP握手包握手包用来表示一个传输是否被对方确认,有。
基于STM32的USB枚举过程学习笔记(三)

基于STM32的USB枚举过程学习笔记(三)上一篇介绍到了主机上电复位USB 设备,在控制传输的建立过程,发送了8 个字节的数据给设备,这8 个字节为0x80 0x06 0x00 0x01 0x00 0x00 0x40 0x00,该请求为USB 标准设备请求中的GET_DESCRIPTOR 请求。
0x80 表示标准设备请求,数据方向是设备到主机。
0x60 表示请求类型GET_DESCRIPTOR。
0x01 表示描述符类型是设备描述符。
0x40 表示描述符长度。
设备在收到该请求以后,首先进行解析,根据请求中的0x40 表示该控制传输有数据过程,因此进入到Data_Setup0()函数。
该函数根据请求的不同描述符,执行不同的回调函数CopyRoutine(),并在DataStageIn()函数中把要发送给主机的描述符填入USB 缓冲区,等待USB 主机发送IN 令牌包。
主机在建立过程最后收到ACK 以后,发送IN 令牌包,从而进入到数据过程。
在CTR_LP()函数中判断是IN0 中断后,进入In0_Process()函数。
在数据过程将之前填在USB 缓冲器的设备描述符发给主机,并等待主机的应答。
主机在确认接收到的设备描述符没有出错后,就会返回一个0 数据长度的确认包,即控制传输的状态过程。
在CTR_LP()函数中判断是OUT0 中断,进入Out0_Process()函数,由于在状态过程,所以调用回调函数Process_Status_OUT()。
下面和上篇一样,对照着USB 分析仪捕捉的数据分析获取设备描述符这次控制传输的数据过程和状态过程。
下面通过串口打印信息查看获取设备描述符控制传输过程中的数据包的数据。
打印信息如下至此,USB 主机成功获取到设备描述符。
打印信息最后可以看。
基于STM32的USB通信程序设计

数 ”这三个功能项通信数据量小 ,于是采用 了
s Co n n e c t e d 0 ) { / / 循环读取 ,直至接收完毕 同步模式 , “ 回 收 文 件 ”和 “ 回 收全 部 ”则 通 I
UC HAR u c h S e n d [ 5 0 ] =” R EAD — F I L E  ̄ r k n ”
DW ORD d wSe n d Le n= 1 1 :
/ / 省略数据 处理部分
) : : P o s t Me s s a g e ( t h i s - > m— h Wn d , O U CS B— R E CE I VE , 0 , o ) ; / / 线 程 清 理 工 作
善优 势 ,对 于 P C来 说 ቤተ መጻሕፍቲ ባይዱUS B 接 口通 常 也更
3应 用层
应用层采用 MF C开 发,主要 功能是对设 ( D W 0 RD dW B Yt eN nm , D W O RD 备进行参数配置和数据 回收 ,不 同的指令会采 d wMi l l i s e c o n d s ){ 取不同的读取模式 ,例如本应用 中 “ 读取文件
R e a d E p ( u c h Re v , 6 4 , &d wL e n g t h ,
系统软件架构
P C上软件分为三层 :
( 1 )Ap p l i c a t i o n :应 用 层 。
s l n p u t ){
d wMi l l i s e c o n d s ) ; / ! 调 用接 口读 取
STM32 USB设计--硬件篇

STM32 USB 设计--硬件篇
STM32 芯片内部集成了USB 外设,大大减轻了USB 电路的设计负担,只需设计USB 接口电路,就可以实现基于STM32 芯片的电路板的USB 通信设计。
(本文将具体讲述基于STM32F103RBT6 芯片的USB 设计)本文为硬件篇。
首先,我们来认识一下STM32F103RBT6 芯片。
其中USB 相关引脚为PA11(D-),PA12(D+)引脚。
就是通过这两个引脚实现STM32F103RBT6
的USB 通讯。
图1 STM32F103RBT6 芯片引脚图
其次,我们简单来认识一下USB 的构造(以A 型公口、B 型母口为例)
图2 USB A 型公口
图3 USB B 型母口
表1 USB 接口引脚说明
1 VCC(+5VDC)
2 D-(data-)
3 D+(data+)
4 GND(Ground)
(5.6 引脚为外壳引脚、起固定和减低干扰作用)
最后,我们来看看USB 接口电路的设计。
图4 USB 接口电路。
STM32USB协议和代码分析

STM32USB协议和代码分析⼀前⾔:usb接⼝是⼀个⾮常重要的通信接⼝,它的协议是有些复杂的。
作为⼀个⼯程师,对usb协议和代码进⾏分析,是⼀个必备的素质和技能。
最近⼀个项⽬⽤到了USB存储接⼝,花了不少时间把项⽬做完之后,还是有不少⼼得体会的。
这⾥做⼀个梳理和总结,希望能给⼈乘凉。
⼆硬件接⼝usb的硬件连线⾮常简单,GND,DP,DN和VCC,⼀般是GND和VCC可以复⽤的。
三 USB协议的描述符这个函数完成描述符的挂载if (USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS) != USBD_OK)这个结构体是对描述符的定义:⽐如,制造商,产品描述,id号什么的个性化的东西都可以在这⾥做修改。
USBD_DescriptorsTypeDef FS_Desc ={USBD_FS_DeviceDescriptor, USBD_FS_LangIDStrDescriptor, USBD_FS_ManufacturerStrDescriptor, USBD_FS_ProductStrDescriptor, USBD_FS_SerialStrDescriptor, USBD_FS_ConfigStrDescriptor, USBD_FS_InterfaceStrDescriptor#if (USBD_LPM_ENABLED == 1), USBD_FS_USR_BOSDescriptor#endif /* (USBD_LPM_ENABLED == 1) */};四 usb协议的事件类型这个函数是注册usb的事件类型:USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass)该结构体完成usb的事件的枚举和定义,可以看出,该事件主要是对usb的⽂件系统做了定义,并不是所有的都做了定义的。
【STM32F429】第8章学习USB协议栈前要了解的基础知识

【STM32F429】第8章学习USB协议栈前要了解的基础知识第8章学习USB协议栈前要了解的基础知识本章节为⼤家讲解USB基础知识点,学习USB前,⾮常有必要有个系统的认识。
8.1初学者重要提⽰8.2 USB历史8.3 USB架构8.4 USB硬件8.5 USB电流8.6 USB传输速度8.7 USB通信(重要)8.8 USB描述符8.9 USB类8.10 总结8.1 初学者重要提⽰USB1.1和USB2.0规格书以及Cypress做的中⽂版USB⽂档,⾮常推荐⼤家学习:USB初学 -- ⼊门篇(USB基础知识速览)⽂献参考:8.2 USB历史1994年,由七个公司组成的⼩组开始开发USB:Compaq,DEC,IBM,Intel,Microsoft,NEC和Nortel。
⽬标是通过替换PC背⾯的众多连接器,解决现有接⼝的可⽤性问题以及简化所有连接到USB设备的软件配置,从根本上简化外部设备连接⾄PC,并且可以为外部设备提供更⾼的数据速率。
阿杰·巴特(Ajay Bhatt)和他的团队在英特尔制定该标准。
第⼀批集成电路⽀持USB的产品由英特尔于1995年⽣产。
最初的USB 1.0规范于1996年1⽉推出,它定义了1.5 Mbit / s 低速和12 Mbit / s全速的数据传输速率。
12 Mbit / s适⽤于打印机和软盘驱动器等⾼速设备,1.5 Mbit / s适⽤于键盘,⿏标和操纵杆等低数据速率设备。
Microsoft Windows 95,OSR 2.1在1997年8⽉为设备提供了OEM ⽀持。
USB的第⼀个⼴泛使⽤的版本是1998年9⽉发布的1.1。
苹果的iMac是第⼀个带有USB的主流产品,⽽iMac的成功推⼴了USB本⾝。
在苹果公司决定从iMac上删除所有兼容端⼝之后,许多PC制造商开始构建兼容版PC,这导致使⽤USB成为PC市场标准。
USB 2.0规范于2000年4⽉发布,并在2001年底被USB-IF批准。
stm32-usb转串口笔记

Main()Set_system(); //初始化系统Set_USBClock(); //初始化usb时钟USB_Interruput_config(); //初始化usb时钟USB_Init(); //usb初始化While(1){;//发送数据{1:Set_system():使能晶振;允许flash取指缓冲Flash分频设置系统频率设置APB2时钟配置APB1时钟配置成2分频ADC时钟配置Pll配置允许pll---此后又PLL进行工作允许GPIO和串口时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DISCONNECT, ENABLE);这个叫允许USB断开线控制D+上拉将USB 的断开脚配置成上拉的。
这也就意味着在开始时,这个上拉电阻使得三极管导通,从而使这个DP 脚被加了一个1.5K 的电阻,可以开始枚举的。
接下来配置PA10 为输入浮空,配置PA9 为PP 输出。
这两个脚是串口。
这个是正确的。
我们几孚所有的板子都用UART0,它就是这两个脚的。
2:Set_USBClock()RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);/* Enable USB clock */RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);3:USB_Interruput_Config()中断函数不外于一个是串口的接收中断。
串口的发送中断是没有允许的。
USART_To_USB_Send_Data(); 表示从串口向USB 端发送数据。
输入的数据长度++ 即count_in++将收到的数据拷贝到端口1 的发送缓冲区中。
设置发送缓冲区的长度发送数据,它是从ENDP1 发送。
在EP1_IN_Callback()函数中,count_in被清零。
usb_istr.c中处理终端优先级. wIstr = _GetISTR(); 得到中断的原因,这个根本不是函数,而是得到ISTR 的值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于STM32的USB程序开发笔记第一篇:需要准备的一些资料 (1)基于STM32的USB程序开发笔记(三) ——STM32 USB固件函数的一些介绍 (4)基于STM32的USB程序开发笔记(四)——USB设备的枚举(上) (12)第五篇:USB设备的枚举(下) (15)第六篇:XP下USB驱动开发的初步准备工作 (23)第七篇:XP下USB驱动开发的最终完成 (30)第一篇:需要准备的一些资料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文件后进行测试。
下载该文件请参阅:/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) // Resetif(wValISTR & ISTR_RESET & vwInterruptMask){SetISTR(CLR_RESET);INT_ISTR_RESET();}#endif#if(CNTR_MASK & ISTR_DOVR) // DMA Over/Underrunif(wValISTR & ISTR_DOVR & vwInterruptMask){SetISTR(CLR_DOVR);INT_ISTR_DOVR();}#endif#if(CNTR_MASK & ISTR_ERR) // Errorif(wValISTR & ISTR_ERR & vwInterruptMask){SetISTR(CLR_ERR);INT_ISTR_ERROR();}#endif#if(CNTR_MASK & ISTR_WKUP) // Wakeupif(wValISTR & ISTR_WKUP & vwInterruptMask){SetISTR(CLR_WKUP);INT_ISTR_WAKEUP();}#endif#if(CNTR_MASK & ISTR_SUSP) // Suspendif(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 Frameif(wValISTR & ISTR_SOF & vwInterruptMask){SetISTR(CLR_SOF);INT_ISTR_SOF();}#endif#if(CNTR_MASK & ISTR_ESOF) // Expected Start Of Frameif(wValISTR & ISTR_ESOF & vwInterruptMask){SetISTR(CLR_ESOF);INT_ISTR_ESOF();}#endif#if(CNTR_MASK & ISTR_CTR) // Correct Transferif(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参考手册,下篇将针对这些响应函数进行逐一的详细介绍。
基于STM32的USB程序开发笔记(三) ——STM32 USB固件函数的一些介绍接着上篇,详细情况可以查看usb_core(.c/.h),STM32 USB中断事件为以下几种:void ISTR_CTR(void);void ISTR_SOF(void);void ISTR_ESOF(void);void ISTR_DOVR(void);void ISTR_ERROR(void);void ISTR_RESET(void);void ISTR_WAKEUP(void);void ISTR_SUSPEND(void);这些处理函数使能由定义CNTR_MASK决定:// CNTR mask control#define CNTR_MASK CNTR_CTRM | CNTR_WKUPM | CNTR_SUSPM | CNTR_ERRM | \CNTR_SOFM | CNTR_ESOFM | CNTR_RESETM | CNTR_DOVRM \其中着重说明的是ISTR_RESET()和ISTR_CTR()函数,ISTR_RESET()主要处理USB复位后进行一些初始化任务,ISTR_CTR()则是处理数据正确传输后控制,比如说响应主机。