STM32 USB设计

STM32官方所有USB例程笔记 写本文时正在寻找STM32F429 VCP例程,想起之前调试过的F103和F407,记录一下 STM32F1~F4的官方例程,偏爱官方例程,因为比较规范,原机汁原味 官方地址:http://www.st.com/en/embedded-software/stsw-stm32046.html 或者官方网站搜索:host-device_lib 以上例程是官方的,基于IAR 然后还需要 阅读详情

首先,我们来看看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通讯程序。


1.usb描述符配置


从上面的讲述可以看出,usb描述符是usb通讯的前提。主机必须先了解设备后才能与其进行通讯。在st提供的例子中,描述符都在usb_des.c文件进行定义,下面就其中的Joystick例子说明usb描述负的配置。


1.1设备描述符
const u8 Joystick_DeviceDescriptor[JOYSTICK_SIZ_DEVICE_DESC] =
{
    0x12,                                                        /*本描述长度*/
    USB_DEVICE_DESCRIPTOR_TYPE,        /*指明为设备描述符*/
    0x00,                                                        
    0x02,
    0x00,                                                        
    0x00,                                                      
    0x00,                                                       
    0x40,                                                        /*最大数据包大小为64字节(对于端点0而言)*/
    0x84,                                                         /*生产商ID*/
    0x19,
    0x06,                                                        /*产品ID*/
    0x04,
    0x00,                                                        
    0x02,
    1,                                                              
    2,                                                             
    3,                                                             
    0x01                                                         /*配置描述符数目*/
}


设备描述符两个重要参数是生产商ID和产品ID,主机将根据以上两个ID为设备选择相应驱动程序。在我们的应用中,我们一般只需修改例子中的这儿两个参数即可完成设备描述符的设置。


1.2配置描述符
const u8 Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC] =
{
    0x09,
    USB_CONFIGURATION_DESCRIPTOR_TYPE,
    JOYSTICK_SIZ_CONFIG_DESC,
     0x00,
    0x01,                      /*接口数目*/
    0x01,                       /*Set_Configuration命令所需要的参数值*/
    0x00,                       /*描述该配置的字符串的索引值*/
    0xE0,                       /*供电模式的选择,bus供电、自供电、支持wakeup*/
    0x32,                       /*最大供电电流*/
/************** 接口1配置****************/
    0x09,        
    USB_INTERFACE_DESCRIPTOR_TYPE,
    0x00,                      /*接口编号*/
    0x00,         
    0x02,                      /*端点数*/
    0x00,        
    0x00,         
    0x00,        
    0,                            /*接口描述符索引值*/
    /******************** 端点1输出描述********************/
    0x07,         
    USB_ENDPOINT_DESCRIPTOR_TYPE,
    0x81,                       /*端点地址,b.7表示方向(1为in,0为out)b.0-b.3为端点标号*/
    0x03,                       /*端点数据传输方式*/
    0x08,                      /*最大数据包大小*/
    0x00,
    0x20,  
   /******************** 端点1输入描述********************/      
    0x07,         
    USB_ENDPOINT_DESCRIPTOR_TYPE,
    0x01,                     /*端点地址*/
    0x03,                      /*端点数据传输方式*/
    0x40,                      /*最大数据包大小*/
    0x00,
    0x20,         
}


配置描述符中包括了接口、端点的配置。如果设备为HID设备,在配置描述符中还应加入HID描述,具体描述可以参照Joystick例子的配置。


还有一些其他配置可以参可相关资料与例子加以理解。


2USB通讯的执行过程。


首先,当主机数据传送到USB设备,USB怎样接收命令和数据呢?USB首先会产生一个中断,这个中断在stm32fxxx_it.c文件的USB_HP_CAN_TX_IRQHandler和USB_LP_CAN_RX0_IRQHandler中定义,一般使用USB_LP_CAN_RX0_IRQHandler。在这个函数中继续调用USB_Istr()函数,这个函数是usb通讯的关键。它接收到主机命令,指派调度相应函数进行处理。对于这一点,详细过程我现在还不是很明白。如果以后搞懂了再补述。


当USB设备接入主机时,主机要枚举该USB设备,他将要求USB设备提供自身相关信息,这是通过endpoint0实现的。endpoint0是一个特殊的端点,每一个接口(interface)必须有endpoint0。一般情况下,我们需要使用多个端点(如前所述,配置描述符定义了端点的数目、类型、传输数据大小等)。在使用端点前需对端点进行初始化。这个过程在usb_prop.c文件中的xxx_reset()函数定义。如我定义端点1的两种传输方式:


/* Initialize Endpoint 1 */
SetEPType(ENDP1, EP_INTERRUPT);
SetEPRxAddr(ENDP1, ENDP1_RXADDR);
SetEPRxCount(ENDP1, 8);
   SetEPRxStatus(ENDP1, EP_RX_VALID);



/* Initialize Endpoint 1 */
SetEPType(ENDP1, EP_INTERRUPT);
SetEPTxAddr(ENDP1, ENDP1_TXADDR);
SetEPTxCount(ENDP1, 64);
SetEPTxStatus(ENDP1, EP_TX_NAK);


在定义完端点后,我们就可以使用端点进行数据传输了。


向主机输入数据(in):IN传输过程是


1.向缓冲区填入数据;
2.设定USB数据计数器:
3.设置USB输出有效。


XXX_send()
{


/*copy mouse position info in ENDP1 Tx Packet Memory Area*/
UserToPMABufferCopy(sendBuffer, ENDP1_TXADDR, 2); /*sendBuffer为要输出的数据,ENDP1_TXADDR端点1的向外传输缓冲区,2为数据大小byte为单位*/
    SetEPTxCount(ENDP1, 2);
/* enable endpoint for transmission */
SetEPTxValid(ENDP1);
}
注意一般情况下,端点的输入输出缓冲区地址没有定义,须在usb_conf.h中定义具体定义可以参考端点0的定义。


读从主机输出的数据(out):out传输过程是


1.定义out回调函数;
2.从缓冲区读出数据:
3.设置USB输入有效。


void EP1_OUT_Callback(void)
{
u8 DataLen;  
DataLen = GetEPRxCount(ENDP1);
PMAToUserBufferCopy(rcvData, ENDP1_RXADDR, DataLen);
SetEPRxValid(ENDP1);
}
注意在一般情况下,EPX_OUT_Callback()回调函数的申明为空执行函数。需将usb_conf.h中#define EPX_IN_Callback   NOP_Process隐掉。再在合适的地方从新定义void EP1_OUT_Callback(void)(合适的位置是指定义之后运行不会出现EP1_OUT_Callback为申明的错误就行)。

PCB设计教程【大师篇】STM32开发板原理图设计(接口部分) 本教程基于B站Expert电子实验室的PCB设计教学的整理,为个人学习记录,旨在帮助PCB设计新手入门。所有内容仅作学习交流使用,无任何商业目的。若涉及侵权,请随时联系,将会立即处理。 阅读详情

相关推荐

基于STM32的CAN转USB模块的PCB设计

1. 项目的文件结构 设计PCB项目时,文件结构主要分为四个模块 第一个文件夹用来存放设计PCB时用到芯片的数据手册。 第二个文件夹用来存放设计PCB时用到的参考设计,包括所用芯片最小系统电路图,各种规范手册,别人设计的PCB等。 第三个文件夹用来存放原理图库和封装库。 第四个文件夹用来存放AD的project文件,最好在每做一些修改时,就保存为一个版本。 2. 原理图设计 首先进行原理图设计。 在此之前提一下,芯片的原理图库可以从立创商城下载,使用立创EDA的导出功能就能完成原理图库的下载。 2.1

sally的jerry 4604

stm32 usb 使用typec接口电路

stm32的usb做了阻抗匹配,然后内部也有相应的上下拉电阻。所以信号线直接连就可以,但是配置的时候上下拉电阻要自己设置。stm32 cubemx配置usb加cdc模式,在dp引脚配置为上拉。烧写代码后就可以看到一个虚拟串口设备了。芯片:stm32f411ret6。电路图:只是device模式。这是f411的数据手册。

qq_45746363的博客 1万+

基于STM32的USB接口温度控制器设计

本文设计了一款基于STM32微控制器的USB接口温度控制器,能够通过USB与PC端进行通信,实时获取温度数据并调整输出设备(如加热器、冷却器等)以维持指定温度。该系统采用温度传感器(如DS18B20)进行温度采集,控制算法采用PID控制,USB通信采用虚拟串口(CDC协议)。本文设计并实现了基于STM32的USB接口温度控制器,具有温度采集、PID控制和USB通信功能。未来可以进一步拓展功能,例如支持多种传感器、支持Wi-Fi或蓝牙无线通信、增加界面友好的图形化PC软件等。⬇帮大家整理了单片机的资料。

stm32d1219的博客 1023

2021-08-12

STM32F103 USB接口电路 USB一般有4个引脚,VCC、GND、D+、D-。VCC一般是5V左右,D+和D-是通信用的数据线。 USB有主从机之分,USB主机,最常见的就是我们的电脑。USB主机端的D+和D-两个引脚上分别接了15K的下拉电阻。 STM32F103C8T6的USB做从机的USB口,有高速和低速之分,如果在D+接了1.5K的上拉电阻,就是高速设备,如果是在D-接了1.5K的上拉设备,就是低速设备。 所以,STM32F103的USB接口电路,是这个样的。 ...

Lonecheat的博客 4096

基于STM32 USB接口的温度控制器设计

本文设计了一种基于STM32微控制器的USB接口温度控制器,通过USB接口进行数据传输和控制,可以方便地与计算机或其他设备进行通信,实现温度的实时监控与控制。通过USB接口与计算机进行通信,系统具备灵活的远程控制功能,适用于家庭、实验室及工业温控应用。温度控制模块根据读取到的温度与设定温度之间的差值,控制温控设备(如继电器、加热器、制冷设备等)。使用PWM控制调节输出,保持目标温度。本系统的核心是STM32F103单片机,结合温度传感器、USB接口通信模块、电源模块、控制执行机构等组成一个完整的温控系统。

stm32d1219的博客 1014

STM32 USB接口引脚选型设计指南

搞懂STM32的USB接口怎么接?从D+、D-到VBUS、GND,每根线的作用和电气要求都得门儿清。结合常见芯片封装与USB协议规范,手把手讲透USB接口定义引脚说明,避开悬空、误接、ESD防护缺失等典型坑。

weixin_34064233的博客 257

STM32 USB设计原理

首先,我们来看看usb的工作过程。            当usb设备接入到主机时,主机开始枚举usb设备,并向usb设备发出指令要求获取usb设备的相关描述信息,其中包括设备描述(device descriptor)、配置描述(configuration descriptor)、接口描述(interface descriptor)、端点描述(endpoint descrip

* . Benirus的专栏 3032

STM32 USB通信程序设计与实战

USB作为现代嵌入式系统中最常用的串行通信接口之一,在STM32微控制器中的集成实现了高效、稳定的数据交互能力。本章将从USB协议的基本概念出发,深入剖析STM32系列芯片中USB模块的硬件架构设计,包括全速(Full-Speed)USB外设的功能组成、时钟配置要求以及与CPU核心的协同工作机制。除标准请求外,设备常需支持类专用命令(如CDC的SET_LINE_CODING)。

weixin_42298164的博客 1063

STM32 USB设备电路设计资源推荐:解决关键设计难题

STM32 USB设备电路设计资源推荐:解决关键设计难题 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在嵌入式系统设计中,STM32系列微控制器因其高性能和丰富的外设接口而广受欢迎。特别是在USB设备设计领域,STM32F105系列芯片的应用尤为广泛。然而,USB设备电路设计中的一个关键问题——PA9/OTG_FS_VBUS引脚的使用,常常被忽视,导致潜在的设计风险...

gitblog_06660的博客 864

基于STM32的触控USB鼠标设计与实现

STM32系列基于ARM Cortex-M内核(如M3、M4、M7),采用哈佛架构,支持单周期乘法与硬件除法,显著提升实时控制性能。其嵌套向量中断控制器(NVIC)支持低延迟中断响应,适用于高精度外设时序控制。// 示例:启用USB OTG FS中断代码说明:配置USB中断优先级并使能,确保数据传输及时响应。USB标准定义了一系列“设备类”(Device Class),用于描述具有相似功能特性的设备集合。

weixin_36483050的博客 1324

STM32 USB设备电路设计

当F105配置时,PA9/OTG_FS_VBUS是用来检测presenseUSB主机的。设计评估显示PA9/OTG_FS_VBUS引脚通过一个零欧姆电阻连接到5VBUS。有这种方法有两个潜在的问题。该第一电势的问题是,PA9/OTG_FS_VBUS输入,虽然它是5V容限,可能损坏(如每ST支持)如果连接到5V时的STM32F105VDD为0V。这可能发生在两个自供电和主机供电的应用。

STM32CubeIDE开发(二十三), stm32的USB从设备串口驱动设计

cubeIDE开发, stm32的USB从设备串口驱动设计

技术需要分享 6314

Qwen3-VL、Qwen3-Next与Qwen3.5多模态架构深度解剖

多模态大模型的核心不在参数规模,而在于视觉与文本如何协同建模。本文从基础概念切入,解析视觉语言模型中视觉编码器、跨模态注意力、特征对齐与token压缩等关键原理;阐述ViT、CLIP-ViT及动态压缩模块(HDTC)在语义表征、空间感知与计算效率上的技术权衡;强调结构设计如何决定模型在医学影像、工业质检、遥感分析等高要求场景中的真实能力边界;最终聚焦通义千问最新三套VL架构——Qwen3-VL、Qwen3-Next与Qwen3.5——揭示其背后迥异的融合哲学与工程取舍,为选型、微调与推理优化提供底层依据。

weixin_33778544的博客 817

基于STM32的触控USB鼠标设计

基于STM32的触控USB鼠标以“触摸输入采集-坐标转换-USB HID协议封装-即插即用”为核心,将触摸传感器(电容/电阻式)的触摸位置、手势动作转换为标准USB鼠标事件(移动、点击、滚动),实现无需驱动的即插即用触控输入设备,适用于触摸板替代、嵌入式人机交互、创意控制器等场景。

rit8432499的博客 384

格(Lattice)基础(一)

有关格的基础概念,和相关的格难题

Amire0x的小乐园 5698

实战Nocobase插件开发:如何用yarn pm命令快速创建和测试API接口插件

本文详细介绍了如何使用Nocobase插件开发工具快速创建和测试API接口插件,涵盖从环境配置、插件骨架生成到数据模型定义和接口实现的完整流程。通过yarn pm命令简化开发步骤,帮助开发者高效构建支持CRUD的API插件,适用于低代码平台开发场景。

weixin_29313239的博客 456

基于STM32的USB声卡设计资源下载介绍

基于STM32的USB声卡设计资源下载介绍 去发现同类优质开源项目:https://gitcode.com/ 资源简介 本资源库提供了一套基于STM32单片机的USB声卡设计方案。本设计利用STM32单片机,实现将电脑的音频信号转化为数字信号,并通过SPI协议发送至其他外设,为用户提供了一个高效率、低成本的USB声卡解决方案。 设计特点 基于STM32单片机:采用高性能、低成本的STM32单片机...

gitblog_06723的博客 489

JavaFx之集成FontAwesomeFX与JFoenix(十五)

本文详细介绍了如何在JavaFx项目中同时集成JFoenix和FontAwesomeFX,以创建现代化、美观的桌面应用界面。通过Maven依赖配置、动态代码创建和FXML静态声明两种方式,演示了如何将JFoenix的Material Design控件与FontAwesomeFX的丰富矢量图标完美结合,并提供了实战案例展示如何构建一个功能完善的现代化工具栏。

pepsi的博客 437

基于STM32的USB声卡设计资源下载介绍:高效率低成本声卡方案

基于STM32的USB声卡设计资源下载介绍:高效率低成本声卡方案 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在当前电子技术飞速发展的时代,USB声卡作为一种常见的音频输入输出设备,被广泛应用于电脑音乐制作、会议通信等领域。今天,我将为您介绍一款开源项目——基于STM32的USB声卡设计资源。该项目提供了一套基于STM32单片机的USB声卡设计方案,利用STM32单...

gitblog_06725的博客 845

DIY一个SM2262ENG 2TB Nvme固态硬盘,慧荣SM2262EN主控

网友订做的 材料: 慧荣科技的62en,2片1G 三星DDR4缓存,4颗PF29F04T2AOCTH1,8CE B17A。SM2262EN属于慧荣第二代PCIe SSD主控,支持PCIe G3×4通道和全新的NVMe 1.3规范、8个NAND通道设计,并提供完整固件设计,最大循序读取速度高达3.5GB/s,循序写入速度达3.0GB/s,随机读写则高达420K IOPS和420K IOPS。此外,还采用目前最先进的低功耗设计,无论是在待机还是在工作状态下,均展现超低功耗,有效减少30%的功耗,满足用户追求超

m0_55207244的博客 1万+

Hypermesh二次开发实战:从Tcl/Tk脚本到Ext API的进阶之路

本文系统介绍了Hypermesh二次开发的进阶路径,从自动化重复操作的Tcl/Tk脚本入门,到利用HMASCII接口深度读写模型数据,最终深入Ext API进行高性能计算与功能定制。通过实战案例,帮助工程师掌握从脚本录制到C++插件开发的完整技能,显著提升CAE前处理效率与自动化水平。

weixin_29306875的博客 670
上一篇: STM32 USB详细使用说明
下一篇: 如何修改STM32的USB例程为自己所用
獠
獠
博客等级 码龄16年 43粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值