STM32CubeMX学习笔记(43)——USB接口使用(CDC虚拟串口)

这篇具有很好参考价值的文章主要介绍了STM32CubeMX学习笔记(43)——USB接口使用(CDC虚拟串口)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、USB简介

USB(Universal Serial BUS)通用串行总线,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在 PC 领域的接口技术。USB 接口支持设备的即插即用和热插拔功能。USB 是在 1994 年底由英特尔、康柏、IBM、Microsoft 等多家公司联合提出的。

USB 发展到现在已经有 USB1.0/1.1/2.0/3.0 等多个版本。目前用的最多的就是 USB1.1 和 USB2.0,USB3.0 目前已经开始普及。STM32F103 自带的 USB 符合 USB2.0 规范,不过 STM32F103 的 USB 都只能用来做设备,而不能用作主机。

标准 USB 共四根线组成,除 VCC/GND 外,另外为 D+,D-; 这两根数据线采用的是差分电压的方式进行数据传输的。在 USB 主机上,D-和 D+都是接了 15K 的电阻到低的,所以在没有设备接入的时候,D+、D-均是低电平。而在 USB 设备中,如果是高速设备,则会在 D+上接一个 1.5K 的电阻到 VCC,而如果是低速设备,则会在 D-上接一个 1.5K 的电阻到 VCC。这样当设备接入主机的时候,主机就可以判断是否有设备接入,并能判断设备是高速设备还是低速设备。

STM32F103 的 MCU 自带 USB 从控制器,符合 USB 规范的通信连接;PC 主机和微控制器之间的数据传输是通过共享一专用的数据缓冲区来完成的,该数据缓冲区能被 USB 外设直接访问。这块专用数据缓冲区的大小由所使用的端点数目和每个端点最大的数据分组大小所决定,每个端点最大可使用 512 字节缓冲区(专用的 512 字节,和 CAN 共用),最多可用于 16 个单向或 8 个双向端点。USB 模块同 PC 主机通信,根据 USB 规范实现令牌分组的检测,数据发送/接收的处理,和握手分组的处理。整个传输的格式由硬件完成,其中包括 CRC 的生成和校验。

二、新建工程

1. 打开 STM32CubeMX 软件,点击“新建工程”
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口

2. 选择 MCU 和封装
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口

3. 配置时钟
RCC 设置,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口
选择 Clock Configuration,配置系统时钟 SYSCLK 为 72MHz
修改 HCLK 的值为 72 后,输入回车,软件会自动修改所有配置
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口

4. 配置调试模式
非常重要的一步,否则会造成第一次烧录程序后续无法识别调试器
SYS 设置,选择 Debug 为 Serial Wire
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口

三、USB

3.1 参数配置

Connectivity 中选择 USB 设置,并勾选 Device(FS) 激活 USB 设备。
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口

Parameter Settings 进行具体参数配置。
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口

  • Speed: Full Speed 12MBit/s(固定为全速)
  • Low Power: 默认 Disabled(在任何不需要使用usb模块的时候,通过写控制寄存器总可以使usb模块置于低功耗模式(low power mode ,suspend模式)。在这种模式下,不产生任何静态电流消耗,同时usb时钟也会减慢或停止。通过对usb线上数据传输的检测,可以在低功耗模式下唤醒usb模块。也可以将一特定的中断输入源直接连接到唤醒引脚上,以使系统能立即恢复正常的时钟系统,并支持直接启动或停止时钟系统。)

3.2 引脚配置

USB 的 DP 引脚必须上拉 1.5K 欧的电阻,电脑才能检测到 USB,否则检测不到。
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口
查看野火指南者开发板原理图可知,需要将 PD6 配置为低电平使能 USB。
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口
在右边图中找到 PD6 引脚,选择 GPIO_Output
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口
GPIO output level 中选择 Low 输出低电平。
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口

3.3 配置时钟

选择 Clock Configuration,USB 时钟配置为 48MHz,且来源最好是外部晶振分频得到。
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口

3.4 USB Device

USB有主机(Host)和设备(Device)之分。一般电脑的USB接口为主机接口,而键盘、鼠标、U盘等则为设备。

部分型号的STM32芯片有1~2个USB接口。像STM32F103系列的有一个USB Device接口,STM32F407系列的有2个USB接口,既可以作为HOST,又可以作为Device,还可以作为OTG接口。

Middleware 中选择 USB_DEVICE 设置,在 Class For FS IP 设备类别选择 Communication Device Class(Virtual Port Com) 虚拟串口。
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口

参数配置保持默认。
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口
设备描述符保持默认。
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口

四、生成代码

输入项目名和项目路径
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口
选择应用的 IDE 开发环境 MDK-ARM V5
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口
每个外设生成独立的 ’.c/.h’ 文件
不勾:所有初始化代码都生成在 main.c
勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口
点击 GENERATE CODE 生成代码
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口

五、查看端口

烧录默认代码,连上电脑可在电脑上看到对用的串口

stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口

Win10系统下不需要装任何驱动就能使用USB虚拟串口,但更低版本的系统比如Win7/8则必须要安装ST官方提供的VCP驱动:https://www.st.com/en/development-tools/stsw-stm32102.html

六、USB串口回环发送

6.1 虚拟串口发送

添加头文件 #include "usbd_cdc_if.h"

main() 的死循环中添加 CDC_Transmit_FS() 函数。

#include "usbd_cdc_if.h"

/**
  * @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();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

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

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    CDC_Transmit_FS("hello", 5);
    HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

查看打印:

stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口

6.2 虚拟串口接收

打开 usbd_dcd_if.c 文件
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口
找到 CDC_Receive_FS()函数,这个函数如果USB虚拟串口数据收到就会被调用,我们在这个函数中将收到的数据在发回去,只需要添加 CDC_Transmit_FS(Buf, *Len); 这一句即可。
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口
使用串口调试助手给它发数据:
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口

6.3 虚拟串口重定向

打开 usbd_dcd_if.c 文件
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口

添加以下代码:

/* USER CODE BEGIN INCLUDE */
#include "stdarg.h"
/* USER CODE END INCLUDE */
-------------------------------------------------------
/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */

void usb_printf(const char *format, ...)
{
    va_list args;
    uint32_t length;

    va_start(args, format);
    length = vsnprintf((char *)UserTxBufferFS, APP_TX_DATA_SIZE, (char *)format, args);
    va_end(args);
    CDC_Transmit_FS(UserTxBufferFS, length);
}

/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */

main() 的死循环中添加 usb_printf() 函数。

/**
  * @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();

  /* 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)
  {
    usb_printf("\r\n****** USB-CDC Example ******\r\n\r\n");
    HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

查看打印:
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口

七、工程代码

链接:https://pan.baidu.com/s/1cvjfMMvoDGj9Zy__BCuiEg?pwd=tllo 提取码:tllo

八、注意事项

用户代码要加在 USER CODE BEGIN NUSER CODE END N 之间,否则下次使用 STM32CubeMX 重新生成代码后,会被删除。
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口
如果USB端口出现感叹号设备无法启动的问题,可适当将堆改大,如0x400
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口
stm32 usb cdc,STM32CubeMX,stm32,STM32CubeMX,USB,USB-CDC,虚拟串口


• 由 Leung 写于 2022 年 10 月 19 日

• 参考:STM32 基础系列教程 23 - USB_cdc
    使用STM32CubeMX生成USB驱动程序 USB无法检测到的问题 生成USB驱动
    STM32Cubemx配置虚拟串口
    通过CubeMX实现STM32的USB支持文章来源地址https://www.toymoban.com/news/detail-787102.html

到了这里,关于STM32CubeMX学习笔记(43)——USB接口使用(CDC虚拟串口)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32】STM32F4中USB的CDC虚拟串口(VCP)使用方法

    最近在学习STM32的USB功能,主要是想要使用虚拟串口(VCP)功能,来解决串口传输速率较低的问题,达到于上位机高效通信的目的。 使用芯片:STM32F407ZGT6 使用函数:HAL库 使用工具:STM32CubeMX + Keil uVision5 串口工具:VOFA 主要配置内容: 调试模式为Serial; 使用外部时钟 设置为

    2024年02月21日
    浏览(64)
  • stm32 USB复合设备 cubeMX库一键生成 多路CDC串口 HID鼠标键盘 Composite Device

    最近有个需求,需要同时用usb键盘鼠标和虚拟串口等,因为平时没怎么研究过usb协议,所以自己写复合设备一直没有成功,然后正巧在github上看到了一个stm32的一个usb复合设备库,可以快速配置usb组合设备,并且支持超级多路串口 Gihub地址 https://github.com/alambe94/I-CUBE-USBD-Compo

    2024年02月09日
    浏览(55)
  • 基于STM32CubeMx配置FreeRtos以及USB虚拟串口步骤详解

       Debug:推荐选择 Serial Wire (方便使用STLink打断点在线调试) 中间两项默认Disable就好 TimeBase Source:若需要配置FreeRtos则不能选择SysTick,随机选择一个TIM定时器即可,这里我选择TIM1定时器。 (解释:裸机的时钟源默认是SysTick,但是开启FreeRtos后,FreeRtos会占用SysTick,用于任

    2024年02月05日
    浏览(65)
  • 第10课【STM32 USB通讯协议实战】HID键盘+CDC虚拟串口组合设备

    文章中的部分概念可参考第9课【USB协议】USB总线 接口 端点 管道 数据包 枚举 STM32_USB-FS-Device_Lib V4.1.0 USB协议中为了提供对多样设备的支持,定义了许多外部设备子类,常见的包括: 人机交互类设备HID(Human Interface Device) 通信类设备CDC(Communicate Device Class) 大容量存储设备

    2024年02月04日
    浏览(52)
  • 野火指南者(STM32F103VET6)应用:实现USB虚拟串口(CDC_VPC)

    MCU:STM32F103VET6 开发环境:STM32CubeMX+MDK5   实现USB的虚拟串口不需要去理解USB的底层驱动,只需要STM32CubeMX去配置生成工程即可。在野火的指南者中,是没有这一类的视频和示例的,博主使用这款开发板实现USB虚拟串口。 首先需要打开STM32CubeMX工具。输入开发板MCU对应型号,找

    2024年02月08日
    浏览(37)
  • 手把手教你使用USB的CDC+MSC复合设备(基于stm32f407)

      最近对usb有点兴趣,感觉挺好玩的,于是买了本圈圈大神的经典著作-圈圈教你玩USB,里面使用51单片机+usb芯片对usb的基本知识潺潺道来,做了十个左右的常用案例实验,很有趣,建议大家看看。   趁热打铁,拿身边的开发板来练练手,探索一下复合设备的好玩方便的

    2024年02月13日
    浏览(47)
  • STM32 USB CDC VPC

    STM32,STM32CubeMX,HAL库,USB,虚拟串口,串口不定长接收 通过使用stm32cubemx,实现USB CDC虚拟串口,并与硬件串口进行数据传输,实现了硬件串口数据的不定长接收,以及USB虚拟串口超过64字节的数据接收,最终实现了一个简单的USB转串口功能。 使用USB的CDC类来虚拟出一个串口与电脑进

    2024年02月15日
    浏览(43)
  • STM32CubeMX教程29 USB_HOST - 使用FatFs文件系统读写U盘

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 使用STM32CubeMX软件配置STM32F407开发板 USB_OTG_FS为工作在Mass Storage Host Class(大容量存储主机类)模式下的USB_HOST(USB主机),并使用FatFs文件系统对

    2024年02月19日
    浏览(40)
  • STM32CubeMX学习笔记16--- STM32内部FLASH

    1. 内部FLASH简介         之前的文章中介绍过STM32F1利用SPI与外部FLASH(W25QXX芯片)通讯的例程,本例程将介绍STM32F1的内部FLASH,通过内部FLASH实现数据读写操作。 不同型号的STM32,其FLASH容量也有所不同,最小的只有16K字节,最大的则达到了1024K字节。此处我们使用的是ST

    2024年04月09日
    浏览(37)
  • stm32 USB HID+CDC 鼠标键盘串口 组合设备配置解析

    查阅网上的博客与代码,很多都是关于USB的鼠标配置、USB的键盘配置、USB的虚拟串口配置,稍微深入一点的会将鼠标键盘合在一起,但移植起来就会报很多错误,要么是检测不到,要么是警告,这很正常,因为不理解这些数字代表着什么。但只要理解每个数字代表什么意思,

    2024年02月13日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包