【HAL库】STM32CubeMX开发----STM32F407----USB实验(CDC虚拟串口)

STM32CubeMX 下载和安装 详细教程
【HAL库】STM32CubeMX开发----STM32F407----目录

STM32F407-HAL库:USB实验(CDC虚拟串口)- 程序源码


前言

本次实验以 STM32F407VET6 芯片为MCU,使用 25MHz 外部时钟源。
USB通信引脚MCU引脚 对应关系如下:

USB通信引脚MCU引脚
DM(D-)PA11
DP(D+)PA12

原理图

在这里插入图片描述

一、使用STM32CubeMX----新建USB实验工程

步骤1:打开 STM32CubeMX 软件

具体 STM32CubeMX 界面如下:

在这里插入图片描述

步骤2:选择 从MCU开始我的项目

在这里插入图片描述

步骤3:选择MCU芯片

我们本次实验选择 STM32F407VET6 芯片做 MCU

在这里插入图片描述

进入工程编辑,具体界面如下:

在这里插入图片描述

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

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

STM32烧写程序连接方式详解

在这里插入图片描述

步骤5:设置时钟源

设置外部晶振为芯片系统时钟源。

在这里插入图片描述

步骤6:USB通信配置

激活 USB 设备

在这里插入图片描述

选择CDC模拟串口

在这里插入图片描述

步骤7:设置时钟

因为USB的时钟需要 48MHz,所以时钟配置如下:
在这里插入图片描述

步骤8:项目编辑

堆设置大一点,否则识别不到USB。

在这里插入图片描述

步骤9:代码生成编辑

在这里插入图片描述

步骤10:点击 GENERATE CODE 生成代码

在这里插入图片描述
新建的工程,已经生成,接下来就是对工程代码的编辑。

二、使用keil5----编辑程序

想要使用keil5打开工程,需要电脑先安装 keil5编译环境,具体操作流程。
可以点击下方文章链接:Keil5编译环境搭建流程

步骤1:使用keil5打开工程

点击工程文件中的MDK-ARM 文件

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

步骤2:用户代码编辑位置

用户代码 要写在 USER xxxx BEGIN xxxUSER xxxx END xxx 之间。
这样下次使用 STM32CubeMX 重新生成代码后,自己写的代码不会被删除。

在这里插入图片描述

步骤3:查看USB虚拟串口的端口

首先编译程序,然后烧录程序到开发板,具体步骤如下:
文章链接:
【STM32】烧写程序:ST-link V2调试下载器实物和连接方式
【STM32】烧写程序:ST-link驱动下载和安装
【STM32】烧写程序:Keil5使用ST-link下载程序
资源链接:ST-link驱动链接----点击下载

烧写完程序后,连接开发板和PC端电脑,然后在设备管理器中查看USB虚拟串口的端口
有以下端口,就说明USB虚拟串口功能实现了。

在这里插入图片描述

步骤4: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 中。

在这里插入图片描述
在 main主函数循环中添加 USB虚拟串口发送函数

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_USART1_UART_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 */
	CDC_Transmit_FS("工欲善其事,必先利其器。",strlen("工欲善其事,必先利其器。"));
	HAL_Delay(500);
  }
  /* USER CODE END 3 */
}

其中的strlen()函数详解:C语言:strlen() — 计算字符串长度

使用串口助手打印数据如下:

在这里插入图片描述

步骤5: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);,将接收到的数据发送出去。

在这里插入图片描述

使用串口助手调试如下:

在这里插入图片描述


串口调试助手下载链接 点击下载


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