STM32 USB如何配置多个CDC设备---5个CDC设备

发布者:xi24最新更新时间:2022-07-15 来源: csdn关键字:STM32  USB  配置  CDC设备 手机看文章 扫描二维码
随时随地手机看文章

1. 背景

由于项需求,在STM32F072中需实现5个CDC设备,折腾了很久分享出来,希望能帮助别人少踩一些坑.USB2.0全速,该款单片机支持8个输出和8个输入端点


2.USB CDC设备

2.1 它是什么?需要使用到什么?

它是USB设备类型的一种,如U盘插入电脑时,电脑会知道其是U盘,是一个存储设备,那么它就属于USB MCU存储设备。USB协议中对设备进行了分类.它在stm32上叫虚拟串口设备,当将其链接电脑后,可以把它当成串口使用,如使用windows的串口工具打开它,设置波特率等等,这是我的理解。


它需要两个接口,三个端点


InterFace 0:第一个接口,其包括一个端点,和Functional_Destriptcrs,该端点为控制接口(输入型端点(IN)),Functional_Destriptcrs则是一些描述符。先不管这个

InterFace 1:第二接口,其包括两个端点,endpoint In 和endpoint out端点,IN为stm32数据输出端点,OUT为stm32数据输入端点,随便提下,在STM32 HAL库中,USB的IN,OUT是相对于主机而言的,如:上诉的IN是指主机的输入,主机的输入(IN),对于设备来说就是OUT,数据的输出端点,IN OUT都是相对于主机而言

由此可见,正常情况下,一个CDC需要三个端点,其中两个IN端点,一个OUT端点


3.配置过程

3.1 配置流程

在STM32CubeIDE的帮助下,生成一个CDC的代码,这里没什么坑,点几下就成功了,注意的是可能需要将Heap设置大一点

修改设备描述符

分配端点和修改配置描述符

分配PMA端点缓存地址

修改HAL库关于CDC部分函数接口的参数,以适配多CDC设备的情况


3.2 使用STM32CubeIDE生成一个CDC程序的代码

根据下面的文件操作即可,文件会介绍USBCDC的知识,在PDF的最后会说怎么使用cubeIDE配置,很简单没什么坑(注意的是可能需要将Heap设置大一点) USB CDC类入门培训.pdf


3.3 分配端点和修改配置描述符

此时问题来了,CDC要求3个端点,其中2个输入1个输出,而stm32F072只支持8个输入端点,8个输出端点,2x5>8,正常情况下是不够的,这里就需要将IN端口中的控制端口省略,也就是第一幅图中的Interface 0中的endpoint IN端点,不分配有效端点给它,在本款单片机中IN端点的有效范围(0x80-0x87),OUT(0x00-0x08)

#define CDC_IN_EP                                   0x81U  /* CDC*/

#define CDC_OUT_EP                                  0x01U  

#define CDC_CMD_EP                                  0x88U  //无效端点


#define CDC_IN_EP1                                   0x82U   /* CDC1*/

#define CDC_OUT_EP1                                  0x02U  

#define CDC_CMD_EP1                                  0x89U  //无效端点


#define CDC_IN_EP2                                   0x83U   /* CDC2*/

#define CDC_OUT_EP2                                  0x03U  

#define CDC_CMD_EP2                                  0x8AU  //无效端点


#define CDC_IN_EP3                                   0x84U   /* CDC3*/

#define CDC_OUT_EP3                                  0x04U  

#define CDC_CMD_EP3                                  0x8CU  //无效端点


#define CDC_IN_EP4                                   0x85U   /* CDC4*/

#define CDC_OUT_EP4                                  0x05U

#define CDC_CMD_EP4                                  0x8BU  //无效端点


修改配置描述符号,这里面的内容就很多了,里面涉及到USB方方面面的属性和参数,其中USB_CDC_CONFIG_DESC_SIZ是该结构体的大小,记得修改,或者直接改为最大255。

配置描述符的结构如下:


配置描述符

{

    配置描述符总概括(相当于预览:9字节)

    IAD描述符(标识接下来的接口属于一个设备,一个设备就一个IAD描述符)CDC

    {

        接口描述符1

        {

            其他描述符(ACM等)

            端点描述符(控制端点)

        }

        接口描述符2

        {

            端点描述符(IN)

            端点描述符(OUT)

        }

    }


    IAD描述符(标识接下来的接口属于一个设备,一个设备就一个IAD描述符)CDC1

    {

        接口描述符1

        {

            其他描述符(ACM等)

            端点描述符(控制端点)

        }

        接口描述符2

        {

            端点描述符(IN)

            端点描述符(OUT)

        }

    }


    IAD描述符(标识接下来的接口属于一个设备,一个设备就一个IAD描述符)CDC2

    {

        接口描述符1

        {

            其他描述符(ACM等)

            端点描述符(控制端点)

        }

        接口描述符2

        {

            端点描述符(IN)

            端点描述符(OUT)

        }

    }


    IAD描述符(标识接下来的接口属于一个设备,一个设备就一个IAD描述符)CDC3

    {

        接口描述符1

        {

            其他描述符(ACM等)

            端点描述符(控制端点)

        }

        接口描述符2

        {

            端点描述符(IN)

            端点描述符(OUT)

        }

    }


    IAD描述符(标识接下来的接口属于一个设备,一个设备就一个IAD描述符)CDC4

    {

        接口描述符1

        {

            其他描述符(ACM等)

            端点描述符(控制端点)

        }

        接口描述符2

        {

            端点描述符(IN)

            端点描述符(OUT)

        }

    }

}


配置描述符如下,下面有些字段需要修改的,都用casojie标记了,CTRL+F搜索casojie就可以方便显示;

__ALIGN_BEGIN uint8_t USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END =

{

  /*Configuration Descriptor*/

  0x09,   /* bLength: Configuration Descriptor size */

  USB_DESC_TYPE_CONFIGURATION,      /* bDescriptorType: Configuration */

  USB_CDC_CONFIG_DESC_SIZ,                /* wTotalLength:no of returned bytes */

  0x00,

  0x0A,   /* bNumInterfaces: 10 interface *///总接口大小,5个CDC*2=10=0x0A casojie

  0x01,   /* bConfigurationValue: Configuration value */

  0x00,   /* iConfiguration: Index of string descriptor describing the configuration */

  0xC0,   /* bmAttributes: self powered */

  0x32,   /* MaxPower 0 mA */


  /*------------------------CDC0--------------------------------------------------8+9+5+5+7+9+7+7-*/

  // // // IAD  Interface Association Descriptor //IAD描述符需要添加 casojie

  // 0x08,  // bLength: Interface Descriptor size //标识IAD描述符的长度,基本都是8,casojie

  // 0x0B,      // bDescriptorType: IAD            //不用管

  // 0x00,  // bFirstInterface                      //第一个接口的序号

  // 0x02,  // bInterfaceCount                      //本IDA的接口数量

  // 0x02,  // bFunctionClass: CDC                  //表明该IAD是一个CDC设备

  // 0x02,  // bFunctionSubClass                    //不用管

  // 0x01,  // bFunctionProtocol                    //控制协议等其他我也不懂,默认就行

  // 0x02,  // iFunction    


 /*Interface Descriptor */

  0x09,   /* bLength: Interface Descriptor size */

  USB_DESC_TYPE_INTERFACE,  /* bDescriptorType: Interface */

  /* Interface descriptor type */

  0x00,   /* bInterfaceNumber: Number of Interface */   //接口编号,从0开始 casojie

  0x00,   /* bAlternateSetting: Alternate setting */

  0x01,   /* bNumEndpoints: One endpoints used */       //接口内有多少个端点被使用 1个 casojie

  0x02,   /* bInterfaceClass: Communication Interface Class */

  0x02,   /* bInterfaceSubClass: Abstract Control Model */

  0x01,   /* bInterfaceProtocol: Common AT commands */

  0x00,   /* iInterface: */


  // /*Header Functional Descriptor*/

  // 0x05,   /* bLength: Endpoint Descriptor size */

  // 0x24,   /* bDescriptorType: CS_INTERFACE */

  // 0x00,   /* bDescriptorSubtype: Header Func Desc */

  // 0x10,   /* bcdCDC: spec release number */

  // 0x01,


  // /*Call Management Functional Descriptor*/

  // 0x05,   /* bFunctionLength */

  // 0x24,   /* bDescriptorType: CS_INTERFACE */

  // 0x01,   /* bDescriptorSubtype: Call Management Func Desc */

  // 0x00,   /* bmCapabilities: D0+D1 */

  // 0x01,   /* bDataInterface: 1 */


  /*ACM Functional Descriptor*/

  0x04,   /* bFunctionLength */

  0x24,   /* bDescriptorType: CS_INTERFACE */

  0x02,   /* bDescriptorSubtype: Abstract Control Management desc */

  0x0F,   /* bmCapabilities */


  /*Union Functional Descriptor*/

  0x05,   /* bFunctionLength */

  0x24,   /* bDescriptorType: CS_INTERFACE */

  0x06,   /* bDescriptorSubtype: Union func desc */

  0x00,   /* bMasterInterface: Communication class interface */ //联合描述符,与IAD功能类似,标识哪两个接口是属于一个设备的casojie

  0x01,   /* bSlaveInterface0: Data Class Interface */  //与上面一样,上面是0,这里是1,标识0号,1号接口是属于一个CDC设备的 casojie


  /*Endpoint 2 Descriptor*/

[1] [2] [3] [4] [5]
关键字:STM32  USB  配置  CDC设备 引用地址:STM32 USB如何配置多个CDC设备---5个CDC设备

上一篇:STM32的单脉冲模式实现精确个数脉冲
下一篇:stm32中断学习篇(1)——以定时器为例

推荐阅读最新更新时间:2024-11-13 17:58

KUKA ready2_grip机器人助力物料搬运:预配置且可靠的应用包
KUKA ready2_grip减少了搬运机器人的集成工作。敏捷的KUKA小型机器人在发货时就配备了先进的抓爪,因此省去了外部抓爪设备的复杂安装工作。 尽管存在需求,但市场上并没有预配置和标准化的紧凑型解决方案 - 特别是对于小型和中型制造企业而言。缺少现场支持和服务往往是最大的障碍。 每一家自动化公司自行研发自己的抓爪解决方案,因为迄今为止,都没有一个标准的解决方案。针对这种定制应用包的支持和服务在全球都是一个很大的挑战。 KUKA现在推出了一款经过预配置、标准化和验证的可靠解决方案KUKA ready2_grip,其简单性和易用性尤为突出。 Ready2_grip适用于所有将机器人用作搬运辅助的任务,例如机器的上料和卸料。 机
[机器人]
STM32中按键中断分析(附源码)
  在按键学习中,我们有用到查询的方法来判断按键事件是否发生,这种查询按键事件适用于程序工作量较少的情况下,一旦程序中工作量较大较多,则势必影响程序运行的效率,为了简化程序中控制的功能模块的执行时间,引入中断控制就很有必要,,一旦有中断时间发生,则程序立马跳转到中断向量的执行程序中,执行完成后就恢复到正常的程序状态。   在STM32F中采用中断控制器NVIC来设定中断。按照中断初始化配置的结构体文件,我们需要在NVIC初始化结构体配置如下:   void EXti_PB12_Config(void)   {   //定义结构体   GPIO_InitTypeDef GPIO_InitStructure;   EXTI_I
[单片机]
STM32复习笔记(二) 时钟系统
一、时钟系统框图: 二、时钟系统知识总结: 1. STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。   ①、HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。    ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时 钟源,频率范围为4MHz~16MHz。    ③、LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。WDG    ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。RTC    ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。 倍频可选择为2~16倍,但是其输出频
[单片机]
<font color='red'>STM32</font>复习笔记(二) 时钟系统
STM32单片机常用库函数详细介绍与程序
用STM32单片机已经很多年了,至于STM32单片机,其功能如何强大,我想不用我多说,大家都懂的。现在写一些学32的入门级的知识要点,希望对刚学32或想要学32的同学们有那么一点点的帮助。大家如果觉得好,请转发出去,让更多的人去学习单片机的开发技术。 GPIO初始化函数。所有程序必须有。用法: voidGPIO_Configuration(void) { GPIO_InitTypeDefGPIO_InitStructure;//GPIO状态恢复默认参数 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_标号|GPIO_Pin_标号; //管脚位置定义,标号可以是NONE、ALL、0至15。 GPIO_I
[单片机]
<font color='red'>STM32</font>单片机常用库函数详细介绍与程序
10大汽车技术买新车有这些配置不会落伍
随着造车技术不断进步,现在的新车在动力方面普遍都拥有不错表现,因此对于消费者来说,购车时要考虑的更倾向于各项配备,包括科技、安全等面向,对此美国最大汽车估值机构《KBB》选出最具代表性的10大汽车技术。 《KBB》列出10大汽车技术,认为现在新车都应该配有这些功能。 目前许多新车都拥有高阶主动安全防护,甚至部分高科技配备也都从豪华品牌陆续下放到平价车款上,而《KBB》列出10大汽车技术,希望消费者在购车前,确认自己想买的车是否具备这些功能,再来决定是否购买。 1.手机遥控功能 目前已经有许多车厂都有提供手机遥控功能,通过手机APP就能远端启动车辆,以及打开空调,同时还能监控车辆的胎压、油耗等,这原本是豪华品牌才会看到
[汽车电子]
10大汽车技术买新车有这些<font color='red'>配置</font>不会落伍
STM32的CustomHID的各描述符介绍
俗话说的好,看协议手册,不如看源代码来的好!在USB的工程中,USB的各描述符定义在usb_desc.c文件里面,这里就将USB的各描述符定义代码贴上来,各个数值的意义都已经详细注释。当然很细节的东西看不懂还是建议去看手册去!!! /* USB标准设备描述符*/ const uint8_t CustomHID_DeviceDescriptor = { 0x12, /*bLength:长度,设备描述符的长度为18字节*/ USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType:类型,设备描述符的编号是0x01*/ 0x00, /*bcdUSB
[单片机]
通过Linux实时处理USB大存储设备的视屛
由於非PC硬件对于USB主机功能的需求不断地增长。对於可携式消费电子产品(如手机)也一样如此,另外USB主机功能在家庭娱乐产品(如机顶盒、游戏机)中也越来越普及。以下简单实现的电路演示了如何将存储到一个闪存驱动器中的视频内容处理成可用于显示器上观看。它还详细介绍了如何克服添加支持Linux系统USB驱动的难题,从而可轻松地将不同的USB外设连接到嵌入式USB主机内 图1所示为视频处理电路的基本结构。硬件要求包括: 德州仪器基于AM3359的DevKit8600开发平台 1个VGA 8000适配器 1个桥接板 1个FTDI的FT313H EVM模块 12V供电 1个4端口的高速USB集线器 1个U
[嵌入式]
USB OTG既可以做主设备,也可以做从设备
USB OTG 想了解USB OTG的工作原理,需要知道三个协议:  ADP:Attach Detection Protocol  HNP:Host Negotiation Protocol  SRP:Session Request Protocol 2.1 ADP USB主从设备或USB OTG设备,如何知道USB总线上有没有挂接其它USB设备呢?USB设备会周期性地检测USB端口的电容值,如果USB端口电容值变化足够大,大到可以确定有新的USB设备接入了,那么USB A型设备会为USB总线提供电源,并检测设备连接;而USB B型设备则发起一个会话请求(SRP),并等待A型设备的响应。 2.2 HNP 2.2
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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