[STM32F4] STM32CubeMX开发(STM32F407)学习笔记 USB实验(CDC虚拟串口)

[复制链接]
1110|1
 楼主| Haizangwang 发表于 2025-7-7 21:01 | 显示全部楼层 |阅读模式
一、使用STM32CubeMX----新建USB实验工程

步骤1:打开 STM32CubeMX 软件

具体 STM32CubeMX 界面如下:

18060686b6801bf3ee.png

2. 选择 MCU 和封装
我们本次实验选择 STM32F407ZGT6 芯片做 MCU。

37373686b67fbde66b.png

3. 配置时钟
RCC 设置,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)

90367686b67f7c56b7.png

选择 Clock Configuration,配置系统时钟 SYSCLK 为 168MHz
修改 HCLK 的值为 72 后,输入回车,软件会自动修改所有配置

USB的时钟需要 48MHz

27849686b67f38f232.png

步骤4:设置烧写方式为 SWD模式

这一步必须选择一种烧写方式,否则烧写一次程序后,芯片中就没法再次烧写程序了。需要硬件重启才可以重新烧写程序

步骤5:USB通信配置
激活 USB 设备

81042686b67ef62f80.png

选择CDC模拟串口

65622686b67e914618.png

如果你使用的是STM32F103那么USB 的 DP 引脚需需要上拉 1.5K 欧的电阻,电脑才能检测到 USB,否则检测不到,具体操作可以参考这篇文章:STM32CubeMX学习笔记-USB接口使用(CDC虚拟串口)_stm32 usb虚拟串口-CSDN博客

STM32F407不需要,具体可以参考这篇文章:

STM32 USB DP/DM内置的上下拉电阻阻值_usb dp上拉-CSDN博客

步骤6:项目编辑
堆设置大一点,否则识别不到USB。

75083686b67e3b84e0.png

每个外设生成独立的 ’.c/.h’ 文件
不勾:所有初始化代码都生成在 main.c
勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。

85192686b67df8feca.png

点击 GENERATE CODE 生成代码

22454686b67db9f53e.png

82043686b67d86a421.png

步骤7、查看端口
有博主说Win10系统下不需要装任何驱动就能使用USB虚拟串口,但我还是下载了。

首先我们得下载STM32官方虚拟串口驱动

STM32官方虚拟串口驱动下载地址:
https://www.st.com/en/development-tools/stsw-stm32102.html

安装教程参考:【免费下载】 STM32 USB虚拟串口驱动(支持Win10)-CSDN博客

这里我选择W8_x64

75299686b67d4117cb.png

在编译之前我们先点击魔术棒,进入页面选择Flash Download选项,如下图勾选选项。

这是为了烧录程序到单片机中仍要手动点复位,可以参考这篇文章:

【STM32】新版本MDK点 Reset and Run 烧录程序到单片机中仍要手动点复位解决方案_stm32 设置了reset and run 不起作用-CSDN博客

90701686b67ce446c0.png

正常烧录程序,点击编译,下载。下载成功后可以在设备管理器看到虚拟串口了

5514686b67caa54ac.png

如果还是看不到,那就下完驱动后重启电脑,或者按板子上的reset键。

步骤8:USB虚拟串口发送数据
在 usbd_cdc_if.c 文件中有 USB虚拟串口发送函数:

/** USB虚拟串口发送函数
  * 参数1:Buf 要发送的数据缓存区
  * 参数2:Len 要发送的数据个数
  * 返回值:USBD_OK-成功,USBD_BUSY-忙碌, USBD_FAIL-失败
  */
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);



将头文件 #include "usbd_cdc_if.h" 添加到 main.c 中。

78977686b67b5d16ef.png

在 main主函数循环中添加 USB虚拟串口发送函数,

使用系统函数 uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)进行通讯

83364686b67afb872c.png

查看打印:

1659686b67aa41c1b.png

步骤9:USB虚拟串口接收数据

在 usbd_cdc_if.c 文件中,有 USB虚拟串口接收函数:

/** USB虚拟串口接收函数
  * 参数1:Buf 要接收的数据缓存区
  * 参数2:Len 要接收的数据个数
  * 返回值:USBD_OK-成功,USBD_FAIL-失败
  */
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len);



在USB虚拟串口接收函数中添加 CDC_Transmit_FS(Buf,*Len);,将接收到的数据发送出去。

13054686b67a4664d2.png

这里应该是成功接收了,但我不清楚为什么没打印出来。各位大佬解释一下。

79000686b67a073cd7.png

步骤10:虚拟串口重定向
打开 usbd_dcd_if.c 文件

添加以下代码:

/* 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() 函数。

    usb_printf("\r\n****** 庆祝中国共产党成立104周年 ******\r\n\r\n");
    HAL_Delay(1000);


查看打印:

91260686b679979e57.png

最后申明:
本文章我只是顺手学习记录一下,只用于学习交流,如有侵权多多冒犯,还请联系本人。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_52613947/article/details/149067642

LOVEEVER 发表于 2025-7-29 23:52 | 显示全部楼层
USB实验了解一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

240

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部