STM32 USB学习笔记1

发布者:炉火旁的Yye最新更新时间:2019-03-11 来源: eefocus关键字:STM32  USB 手机看文章 扫描二维码
随时随地手机看文章

主机环境:Windows 7 SP1


开发环境:MDK5.14


目标板:STM32F103C8T6


开发库:STM32F1Cube库和STM32_USB_Device_Library


之前在STM32论坛里领取过一块STM32开发板,本来以为是带有USB模块接口的,最后发现NUCLEO里是没有把USB模块外接出来的,所以就自个儿掏钱买了一块单板,如下图所示:



单板很简单,单纯是为了学习一下STM32的USB模块,之所以选择这个是因为它便宜,而且ST官方有提供USB模块库方便开发。


USB开发博大精深,比之串口,SPI,I2C来说多了很多东西,一个很简单的例子就是串口,SPI,I2C都可以使用通用IO口来模拟实现,但USB却很少有人这么做。学习USB模块就要学习USB协议,USB协议从1.1到2.0再到3.0,现在貌似到3.1版本了都,版本更替了这么多但不影响我们学习,因为USB协议都是向后兼容的,学习了一个就够了。


STM32F103C8T6的USB模块实现了USB2.0全速总线,符合USB2.0全速设备的计数规范,支持8个双向端点等。


USB总线使用两根线实现差分传输D+、D-,这跟485总线类似。因此,在USB总线上同一时刻只能有一个方向上的传输。


有关USB2.0协议规范可以从USB官网上下载,重点看第9章节即可,600多页的文档从头看到尾是很枯燥的。当然如果有精力的话,整个规范都看完也是很有好处的。跟USB2.0规范相关的还有很多类规范,在开发时如果有需要再看就可以了。


一、USB器件库概述


ST官网提供的USB文档有STM32Cube USB器件库,以及USB培训的一些文档,重点看USB器件库文档就好了,因为我们是把STM32的USB模块当作从设备,当然如果STM32支持USB主机的话还有另外一个主机库(不在这里讨论)。通过查看STM32Cube USB器件库,可以帮助我们快速理解USB模块的架构,简化应用开发。STM32CubeUSB设备库在Cube中所处位置如下:



USB设备库位于HAL驱动层之上,在开发中我们只需关注USB设备库即可,不必关注USB设备的HAL驱动,不然USB设备库就没有存在的意义了。而且USB设备库代码是只读的,不需要修改。


设备库中使用的主要结构体为设备句柄,其类型为USBD_HandleTypeDef,我们不必刻意关注USB HAL驱动中USB所使用的数据结构,因为它们对于我们来说是隐藏的,只需关注设备库曝露给我们的接口即可,设备库是和USB2.0协议密切相关的,因此需要熟悉USB2.0文档有助于我们理解设备库的工作流程。


USB设备库目录分为两层:一层为Core(核心层);另一层为Class(类层),目录结构如下:



结构比较清晰,核心层是不需要动的,类层是扩展用的。


USB设备库中核心层的usbd_conf文件是需要用户自己实现的,用来配置USB的属性,其各个文件的作用如下:



其中usbd_req改为了usbd_ioreq。由表7就可以看出USB2.0规范中第9章很重要。USB器件库文档还详细说明了一下控制端点0,这在USB开发中是一个重要的端点。其作为默认的控制端点用于接收主机发来的各种请求,请求作为Setup包发送到设备,请求又分为标准请求和非标准请求,标准请求在控制端点0上就可处理了,对于非标准请求通过回调函数传递给特定类进行进一步处理。


USB设备库的类层中各个文件作用如下:



其中的usbd_xxx_if_template文件需要由用户实现,目前跟USB设备库相关的文件有两个需要用户去实现即usbd_conf文件和usbd_xxx_if_template文件。至此USB器件库的概述说明就完毕了,更多详细情况查看USB器件库文档即可。


二、USB协议概述


USB协议中用到的一些逻辑部件:


端点:数据传输的最终对象


管道:主机和设备端点之间数据传输的模型


接口:用于描述特定的功能(有一组端点组成)


设备:由一个或多个接口组成


USB传输分为了3层:Packet、Transaction、Transfer,三者是由小到大,关系如下图:



一次Transfer传输分为几个Transaction,一次Transaction由几次Packer组成。


Packet包格式如下:



所有的USB传输都是由USB主机发起,这点跟I2C通信有些类似。


USB的传输分为4类:控制传输、中断传输、同步传输、批量传输,由此引申出4类端点类型:控制端点、中断端点、同步端点、批量端点。



控制传输是双向的,须有IN和OUT两个方向上的端点号。其他类型的传输是单向的。各类传输差别不是很大,只是对时间的要求不同。


有关USB协议的大概情况就介绍到这,更多详情请查阅USB2.0规范以及STM32F103的参考手册。后面将通过VCP具体示例来分析USB开发。


关键字:STM32  USB 引用地址:STM32 USB学习笔记1

上一篇:STM32 USB学习笔记2
下一篇:STM32 TFT学习笔记——触摸屏

推荐阅读最新更新时间:2024-03-16 16:25

USB3.0的物理层发送端测试方案介绍
  USB简介   USB(Universal Serial Bus)即通用串行总线,用于把键盘、鼠标、打印机、扫描仪、数码相机、MP3、U盘等外围设备连接到计算机,它使计算机与周边设备的接口标准化,从 2000年以后,支持USB2.0版本的计算机和设备已被广泛使用,USB2.0包括了三种速率:高速480Mbps、全速12Mbps、低速 1.5Mbps。目前除了键盘和鼠标为低速设备外,大多数设备都是速率达480M的高速设备。   尽管USB2.0的速度已经相当快,对于目前高清视频和动辄GByte的数据传输还是有些慢,在2008年11月,HP、Intel、微软、NEC、ST-NXP、TI联合起来正式发布了 USB3.0的V1.0
[测试测量]
<font color='red'>USB</font>3.0的物理层发送端测试方案介绍
STM32-串口超时判断方式接收未知长度数据
usart.c串口中断处理函数: view plain copy void USART1_IRQHandler(void) { u8 res; if(USART1- SR&(1 5))//接收到数据 { res=USART1- DR; if(USART1_Recv_Len USART1_MAX_RECV_LEN) //还可以接收数据 { TIM3- CNT=0; //计数器清空 if(Rec_Over_Flag==0)TIM3_Set(1); //使能定
[单片机]
STM32的USART中RTS、CTS的作用和意义
Ⅰ、写在前面 我们都知道USART中RX和TX这两个引脚的功能,这两个引脚是USART串行通信最常见和必不可少的两个引脚。但我们在手册中会发现关于USART的其他引脚:USART_CK、USART_RTS、USART_CTS,如下图: 但我们大部分都没怎么使用过USART_RTS和USART_CTS这两个引脚。下面将给大家简单讲述一下关于USART串口拓展的知识。 Ⅱ、关于DB9串口接头 我们都听说过RS232,说232就知道DB9这个串口接头。 DB9个引脚的功能: 1 CD ← Carrier Detect 载波检测 2 RXD ← Receive Data 接收数据 3 TXD → Transmit Da
[单片机]
<font color='red'>STM32</font>的USART中RTS、CTS的作用和意义
STM32的SPI外设片选只有一个,怎么破?
之前用STM32的SPI需要控制很多外部芯片,可是一个SPI的外设只有一个片选,要实现独立片选一主多从,怎么实现呢? SPI总线拓扑 一般地,SPI总线按照下图方式进行连接,一主多从。 如上图: 每个从设备都有独立的片选引脚,主机同一时间段内,与一个从设备进行通信,也即选中一个从设备。 MOSI/MISO/SCLK并联在一起 MISO须是三态门,当从设备未选中时,该脚须设置为高阻态,而不能是输出态,否则会影响总线 ! 对于MOSI/SCLK,虽然并联在一起,但是由于仅一个输出,多输入。 但是你看STM32的SPI外设,一个SPI仅有一个NSS信号,以STM32F407的SPI2为例: 那么要实现前面说的一主多从
[单片机]
STM32使用LWIP库新建tcp_sever
main函数 区域1是lwip的初始化 void LwIP_Init(void) { struct ip_addr ipaddr; struct ip_addr netmask; struct ip_addr gw; mem_init();//内存堆初始化 memp_init();//内存池初始化 IP4_ADDR(&ipaddr, 192, 168, 16, 211); IP4_ADDR(&netmask, 255, 255 , 255, 0); IP4_ADDR(&gw, 192, 168, 16, 1); netif_add(&netif, &ipaddr, &netmask,
[单片机]
一种STM32的串口控制台的实现
一.背景 曾经玩Linux时非常喜欢这种基于出串口的控制台, 通过简单的串口TX和RX能实现嵌入式硬件的人机交互,非常实用, 那么STM32能否实现通过超级终端与用户互动的构想呢? 答案是肯定的,由于这个UART控制平台就像应用程序套上一层可访问的外科(Shell)故而我将这种基于UART的控制平台简称Shell,构架和效果如下图: 这张图箭头指向的是输入的指令,其余是STM32串口输出的信息,, 可以看到通过这些简单的指令输入我们通过Shell可以做很多事情: 1. 现场设备发生故障,可以通过Shell可以查看设备的故障状态统计信息 2. 能实现串口程序升级(需要Shell+IAP驱动程序支持) 3.
[单片机]
一种<font color='red'>STM32</font>的串口控制台的实现
STM32 GPIO 简单操作函数
STM32库函数太多,而且不能识别大小写,经常记错,GPIO简单记忆。 ---第一步--模式配置 void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //对应GPIO所在的总线时钟必须打开 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //哪个GPIO口 GPIO_InitStructu
[单片机]
使用VSCode搭建STM32开发环境
首先附上一张VS Code图一直都喜欢这种,黑色主题感觉高大上。 一、需要的软件和工具。 下载最新版VS Code: 安装好插件,具有良好的代码补全与调试功能。 “VS Code下载地址:https://code.visualstudio.com/” 下载 LLVM:用于代码补全,其实可以理解为 Clang。因为VS Code 中“C/C++”插件的自动补全功能不太好用。STM32中好多库函数都补全不出来。记得按照好之后,将路径添加到环境变量里。 “LLVM下载地址:http://releases.llvm.org/download.html” 下载安装 Git for Windows: 提供Git支持和MINGW64指令终端
[单片机]
使用VSCode搭建<font color='red'>STM32</font>开发环境
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved