STM32F407单片机编程入门(二十四) USB口介绍及CDC类虚拟串口通讯详解及源码

news2024/11/15 11:46:58

文章目录

    • 一.概要
    • 二.USB2.0基本介绍及虚拟串口介绍
    • 三.STM32F407VET6单片机USB模块框图
    • 四.STM32单片机USB从机模式
    • 五.STM32F407VET6 USB设备CDC类
    • 六.CubeMX配置一个USB虚拟串口收发例程
    • 七.CubeMX工程源代码下载
    • 八.小结

一.概要

STM32F407VET6 USB虚拟串口是一种采用STM32F407VET6单片机,通过USB接口连接电脑,将电脑的USB接口转换成串口接口,实现与电脑的通信的一种转换器。它可以实现与电脑的通信,还可以实现与外部设备的通信,广泛应用于工业控制、智能家居、智能硬件等领域。

本文介绍了STM32单片机USB口的基本概念,内部结构,以及用USB虚拟串口进行数据通讯的例程。

二.USB2.0基本介绍及虚拟串口介绍

USB2.0使用一对差分信号传输数据,并可以为USB设备提供电源。差分信号名称一般标示为“D+”和“D-”。
USB2.0可以支持三种传输速率:低速USB设备传输速率为1.5Mbps,全速USB设备传输速率为12Mbps,高速USB设备传输速率为480Mbps。STM32F103C8T6就属于全速USB设备传输,最快12Mbps。
在硬件电路方面,全速USB设备内部的“D+”信号应该通过1.5K的电阻上拉到3~3.6V。

USB虚拟串口,简称VCP,是Virtual COM Port的简写,它是利用 USB的 CDC类来实现的一种通信接口。我们可以利用STM32自带的USB功能,来实现一个USB虚拟串口,从而通过USB,实现电脑与STM32的数据互传。

三.STM32F407VET6单片机USB模块框图

在这里插入图片描述
USB OTG FS 通过外部石英时钟从复位和时钟控制器 (RCC) 接收 48 MHz ±0.25% 的时钟,USB 时钟用于全速 (12 Mb/s) 驱动 48 MHz 域,必须在配置 OTG FS 模块前使能。
CPU 通过 AHB 外设总线对 OTG FS 模块寄存器进行读写操作,通过USB OTG 中断线接收 USB 事件通知。
CPU 通过向特定的 OTG_FS 单元(压栈寄存器)写入 32 位字来向 USB 提交数据。数据随即自动存储到 USB 数据 RAM 中配置的数据发送 FIFO 中。每个 IN 端点(从机模式)或OUT 通道(主机模式)都有一个 Tx-FIFO 压栈寄存器。
CPU 从特定的 OTG_FS 地址(出栈寄存器)读取 32 位字,以接收来自 USB 的数据。数据随即从在 1.25 KB USB 数据 RAM 内配置的共享 Rx-FIFO 中弹出。每个 OUT 端点或 IN 通道都有一个 Rx-FIFO 出栈寄存器。
USB 协议层通过串行接口引擎 (SIE) 驱动,并通过片上物理层 (PHY) 中的全速/低速收发器
模块经由 USB 进行数据的串行通信。

四.STM32单片机USB从机模式

USB一般有两种模式,主机模式,从机模式。

USB主机模式:‌在主机模式下,‌单片机能够枚举外部USB设备,‌如键盘、‌鼠标、‌闪存盘等,‌并对其进行配置和管理。‌这种模式适用于需要同时连接多个外部设备并进行数据交换的复杂应用场景。

USB设备模式:‌在从机模式下,‌单片机作为USB设备的角色,‌可以与主机进行通信。‌这包括配置USB设备描述符、‌初始化USB控制器、‌编写类处理函数等,‌以实现特定的通信需求。‌STM32支持多种USB类,‌如CDC(‌通信设备类)‌、‌HID(‌人机接口设备类)‌、‌MSC(‌大容量存储类)‌等,‌以满足不同的应用场景。

OTG(On-The-Go)技术是一种允许设备在没有主机(如电脑)的情况下,直接与其他USB设备连接并进行数据交换的技术。OTG_FS是OTG技术的一种模式,它支持USB 2.0全速通信,速度为12Mbps。这种模式使得设备能够在不需要电脑或其他主机的情况下,实现设备间的数据交换和充电功能。

STM32F407的OTG_FS 控制器是一款双角色设备 (DRD) 控制器,同时支持从机功能和主机功能,完全符合 USB 2.0 规范的 On-The-Go 补充标准。此外,该控制器也可配置为“仅主机”模式或“仅从机”模式,完全符合 USB 2.0 规范。在主机模式下,OTG_FS 支持全速(FS,12 Mb/s)和低速(LS,1.5 Mb/s)收发器,而从机模式下则仅支持全速(FS,12 Mb/s)收发器。

OTG_FS 接口在从机模式下具有以下特性:
● 1 个双向控制端点 0
● 3 个 IN 端点 (EP),可配置为支持批量传输、中断传输或同步传输
● 3 个 OUT 端点,可配置为支持批量传输、中断传输或同步传输
●管理一个共享 Rx FIFO 和一个 Tx-OUT FIFO,以高效使用 USB 数据 RAM
●管理多达 4 个专用 Tx-IN FIFO(分别用于每个使能的 IN EP),降低应用程序负荷
●支持软断开功能。

五.STM32F407VET6 USB设备CDC类

CDC(Communication Device Class)类是 USB2.0 标准下的一个子类,定义了通信相关设备的抽象集合,我们虚拟串口通信就是CDC类。USB2.0标准下定义了很多子类,有音频类,CDC类,HID,打印,大容量存储类HUB,智能卡等等,这些在urb.org 官网上有具体的定义,这里我们主要讲的是通信类CDC。

USB CDC类的通信部分主要包含三部分:枚举过程、虚拟串口操作和数据通信。其中虚拟串口操作部分并不一定强制需要,因为若跳过这些虚拟串口的操作,实际上USB依然是可以通信的,之所以会有虚拟串口操作,主要是我们通常使用PC作为Host端,在PC端使用一个串口工具来与其进行通信,PC端的对应驱动将其虚拟成一个普通串口,这样一来,可以方便PC端软件通过操作串口的方式来与其进行通信,但实际上,Host端与Device端物理上是通过USB总线来进行通信的,与串口没有关系,这一虚拟化过程,起决定性作用的是对应驱动,包含如何将每一条具体的虚拟串口操作对应到实际上的USB操作。这里需要注意地是,Host端与Device端的USB通信速率并不受所谓的串口波特率影响,它就是标准的USB2.0全速(12Mbps)速度,实际速率取决于总线的实际使用率、驱动访问USB外设有效速率(两边)以及外部环境对通信本身造成的干扰率等等因素组成。

USB CDC类实现了规范的下列方面:
• 设备描述符管理
• 配置描述符管理
• 枚举为具有2个数据端点(IN和OUT)的CDC设备和一个指令端点(IN)
• 请求管理
• 抽象控制模型兼容
• 联合体功能收集(使用1个IN端点控制)
• 数据接口类

CDC软件框架简介
在这里插入图片描述
黄色USB Device Core部分为USB设备库文件,属于中间件,它为USB协议栈的核心源文件,一般不需要修改。

黄色USB Device Class 部分为USB类文件,也属于中间件,USB设备库,目前ST DEMO中支持的类有HID, Customer HID, CDC, MSC, DFU, Audio, ST 提供了这些类的源码框架,其他的Class或者是复合设备需要自己根据实际需求情况进行扩展或定制。如果用户需求只是需要一个标准类,比如CDC通信,那么最好就使用现成的代码,不需要做任何修改就可以实现这个CDC类通信的功能。

蓝色USB Device HAL Driver为 HAL库部分,是对USB外设接口的封装,属于底层驱动,不需要修改,它分为PCD和LL Driver,PCD处于LL Driver之上。

红色USB Device Configuration 为 USB配置封装,位于USB底层HAL层驱动与中间件USB协议栈之间,一方面向上层(USB设备库)提供各种操作调用接口,另一方面,向底层USB驱动提供各种回调接口。正是由于它的存在,使得USB协议栈(USB设备库)与底层硬件完全分离,从而使USB设备库具有更加兼容所有STM32的通用性。USB Device Configuration为开放给用户的源文件,用户可以根据自己的某些特殊需要进行修改,也可以使用默认的源文件,假如没有任何特殊要求的话,我们使用默认即可。

绿色Application 为应用层,USB Device Class 有可能将自己对应该的操作接口封装在一个操作数据结构中,由应用来具体实现这些操作,在系统初始化时,由应用将已经定义好的操作接口注册到对应的USB类中,比如usbd_cdc_if, 就这样,使得应用层的应用代码与属于中间件层的USB协议栈分离。同时,USB协议栈会将一些字符串描述符放到APP中,当USB初始化时将这些已经定义好的字符串通过指针初始化到USB协议栈中,以便后续需要时获取。

工程源码文件与软件框架的对应关系
在这里插入图片描述

六.CubeMX配置一个USB虚拟串口收发例程

用STLINK下载程序,用 USB 线接开发板USB 口,再接电脑,打开电脑上串口调试器,9600 波特率,8 位数据,无校验,发送 HELLOWORLD,板子就会返回 HELLOWORLD。
在这里插入图片描述

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F407VE,再双击就创建新的工程
在这里插入图片描述

配置下载口引脚
在这里插入图片描述

配置外部晶振引脚
在这里插入图片描述

配置USB Device

在这里插入图片描述

CDC类配置
在这里插入图片描述

配置系统主频168Mhz,使用外部晶振,USB是48Mhz
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述

生成工程
在这里插入图片描述

用Keil5打开工程
在这里插入图片描述

添加代码

接收数据处理
在这里插入图片描述

发送数据处理
在这里插入图片描述

主要代码

extern USBD_HandleTypeDef hUsbDeviceFS;
extern uint32_t Recv_dlen;
extern uint8_t UserRxBuffer[1024];
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();//8M晶振,168M主频

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USB_DEVICE_Init();
  /* USER CODE BEGIN 2 */


  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if(Recv_dlen)//判断是否接收到数据,接收置位处理在static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)函数
		{
		
			USBD_CDC_SetTxBuffer(&hUsbDeviceFS, (uint8_t*)&UserRxBuffer, Recv_dlen);//把接收到的数据拷贝到发送
			USBD_CDC_TransmitPacket(&hUsbDeviceFS);//发送
			Recv_dlen=0;//长度清零
		}
		
    
		HAL_Delay(100);//等待100ms
  }
  /* USER CODE END 3 */
}
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
	memcpy(UserRxBuffer,Buf,*Len);
	Recv_dlen=*Len;
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  return (USBD_OK);
  /* USER CODE END 6 */
}

实验效果
下载完程序,用 USB 线接板子USB 口,再接电脑,打开电脑上串口调试器,9600 波特率,8 位数据,无校验,发送 HELLOWORLD,板子就会返回 HELLOWORLD。
在这里插入图片描述

七.CubeMX工程源代码下载

通过网盘分享的文件:27.USB虚拟串口通信实验.zip
链接: https://pan.baidu.com/s/1WMSHMu0hOOLlJQD2RnXvdg 提取码: ka89

如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

八.小结

USB虚拟串口可以实现与电脑的通信,还可以实现与外部设备的通信,广泛应用于工业控制、智能家居、智能硬件等领域。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2163454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【测试】什么是需求?

测试的概念:验证软件的特性是否满足用户的需求。软件测试领域:软件测试工程师、软件测试开发工程师 需求的概念 在企业中,经常会听到俩个词:用户需求和软件需求。 例如:开发人员与产品人员出现冲突... 产品同学要求开…

ROG NUC:重塑未来,从“芯”开始

ROG NUC以令人惊叹的紧凑身形、强大配置,从“芯”出发,重塑我们对科技生活的想象,让玩家感受由微缩主机带来的性能风暴。 至强“芯”脏,性能巅峰 ROG NUC至高搭载英特尔酷睿Ultra9处理器,采用先进的制程工艺&#xff…

【C++】STL详解之string类

目录 什么是STL STL的版本 STL的六大组件 STL的缺陷 一.string的定义方式 二. string的插入 1.使用push_back进行尾插 2.使用insert插入 三.string的拼接 四.string的删除 1.使用pop_back进行尾删 2.使用erase进行删除 五.string的查找 1.使用find正向搜索第一个…

设计模式 策略模式(Strategy Pattern)

策略模式简绍 策略模式(Strategy Pattern)是一种行为设计模式,它使你能在运行时改变对象的行为。该模式定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法独立于使用它的客户而变化。 …

【计网】从零开始掌握序列化 --- 实现网络计算器项目

​​​请各位保持头脑清醒, ​​​读些好书,做点有用的事, ​​​快快乐乐地生活。 ​​​ --- 斯蒂芬金 《肖申克的救赎》--- 从零开始掌握序列化 1 知识回顾2 服务器框架3 客户端框架4 运行测试 1 知识回顾 前面两篇文章学习中基础知识…

CSS 实现文本溢出省略号显示,含单行与多行文本溢出

🚀 个人简介:某大型国企资深软件研发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码喽的自我修养&#x1f9…

[翟旭发射器]python-推导式-列表list表达式练习

# 简单的列表生成 numbers00[x for x in range(1,11)] print(numbers00) # 带条件的列表生成 numbers01[x for x in range(1,11) if x%20] print(numbers01) # 带表达式的列表生成 numbers10[x**2 for x in range(1,11)] print(numbers10) # 嵌套循环的列表生成 coordinates[(x…

UE4_Niagara基础实例—使用自定义参数

实现的功能:使用自定义的参数来调整粒子远离发射器后粒子大小的变化 效果图: 操作步骤: 1、创建Niagara系统,使用Simple Sprite Burst模板作为新系统的发射器,更名为NS_Custompara。 2、双击打开Niagara系统编辑界面…

Shopee 大促想爆单如何准备?EasyBoss ERP为你准备了一份攻略!

Shopee下半年第二个大促节点——10.10品牌大促即将来到,根据Shopee的官方的数据,9.9大促当天,Shopee Mall单量增至平日4倍。 老板们,准备好自己的热卖爆款冲击10.10大促了吗? 图源:Shopee 为助力大家迎战大…

NetApp EF 系列全闪存阵列 EF600 和 EF300

功能强大且经济实惠的性能 NetApp EF600 全闪存阵列专为需要最高性能的工作负载而设计。NetApp EF300阵列专为大数据分析和数据库等混合工作负载环境而设计。这些NVMe全闪存阵列的性能是以前SAS全闪存阵列的两倍。您可以使用专为高性能工作负载打造的端到端 NVMe 存储平台来加速…

node-rtsp-stream、jsmpeg.min.js实现rtsp视频在web端播放

1. 服务地址(私有):https://gitee.com/nnlss/video-node-server 2.node-rtsp-stream 需要安装FFMPEG; 3.给推拉流做了开关,可借助http请求,有更好方式可联系; 4.存在问题: 1&…

Vue中集中常见的布局方式

布局叠加 完整代码最外层的Container设置为relative&#xff0c;内部的几个box设置为absolute <template><div class"container"><div class"box box1">Box 1</div><div class"box box2">Box 2</div><d…

导出Power bi中的Measure

工作中做交接文档时&#xff0c;有时需要导出Power BI中所有度量值&#xff0c;这时可以下载两个工具。 一 &#xff0c; 下载工具&#xff1a; 1 &#xff0c; DaxStudio&#xff1a; http://daxstudio.org/ 2&#xff0c; Vertipaq Analyzer&#xff1a; https://www.sqlbi.c…

1.1 elasticsearch分布式集群基本搭建(centos7.x + elaticsearch7.11.1)

【1】分布式分片集群基础概念 【1.1】ES的分布式集群有什么用&#xff1f; 高可用 高可用(High Availability)是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计减少系统不能提供服务的时间。如果系统每运行100个时间单位&#xff0c;会有…

半导体供应链系统在智能时代的主要作用

在智能科技日新月异的今天&#xff0c;半导体作为信息技术的基石&#xff0c;其供应链系统的稳定与高效直接关系到全球科技产业的脉动。智能时代的浪潮下&#xff0c;半导体供应链系统不仅是技术的输送带&#xff0c;更是推动产业创新、促进经济转型升级的关键力量。本文我们就…

将Uni.app打包好的apk放到IIS服务器上的详细流程

第一步&#xff1a;打开IIS服务器&#xff0c;点击MIME类型 第二步&#xff1a;点击添加 第三步&#xff1a;文件扩展名填写&#xff1a;.apk &#xff0c; MIME 类型填写&#xff1a;application/vnd.android.package-archive 第四步&#xff1a;添加成功后重启IIS服务器 第五…

【大模型实战篇】一种关于大模型高质量数据的处理方法-无标注数据类别快速识别及重复数据检测(加权向量-卷积神经网络-聚类算法结合)

1. 背景介绍 大模型的能力很大程度上依赖于高质量的数据&#xff0c;在之前的一篇文章《高质量数据过滤及一种BoostedBaggingFilter处理方法的介绍》中&#xff0c;我们介绍了大模型的数据处理链路&#xff0c;本文继续关注在高质量数据的模块。 本文所要介绍的处理方法&…

C语言课程设计题目(24个选题)

C语言课程设计题目 题目一&#xff1a;职工信息管理系统设计题目二&#xff1a;图书信息管理系统设计题目三&#xff1a;图书管理系统设计题目四&#xff1a;实验设备管理系统设计题目五&#xff1a;西文下拉菜单的设计题目六&#xff1a;学生信息管理系统设计题目七&#xff1…

R包:gplots经典热图

加载R包 # install.packages("gplots")library("gplots")数据 mat <- matrix(rnorm(1200), ncol6)画图1 heatmap.2(xmat)画图2 heatmap.2(xmat, ColvFALSE, dendrogram"row",scale"row",col"bluered",trace"non…

用Python提取PDF表格到Excel文件

在对PDF中的表格进行再利用时&#xff0c;除了直接将PDF文档转换为Excel文件&#xff0c;我们还可以提取PDF文档中的表格数据并写入Excel工作表。这样做可以避免一些不必要的文本和格式带来的干扰&#xff0c;获得更易于分析和处理的表格数据&#xff0c;并方便进行更多的格式设…