STM32使用虚拟串口CDC重定向printf

今天研究下STM32的虚拟串口的重定向用法。一开始觉得很简单,就是类似USART里面的重定向的用法。但百度了一下以后发现,很多人反应这样操作会有问题,无法发送数据。后面参考了一下几位博主的方法试了下,成功了。

步骤如下:

1、打开STM32Cube软件,进行基本配置

GPIO、RCC、SYS、Connectivity这里,和之前的STM32USB鼠标配置一样。中间件这里注意一下:Class For FS IP后面选择VPC,也就是虚拟串口。

2、时钟配置

跟前面鼠标一样,USB这里时钟设为48MHZ,别的没什么注意的。

3、生成工程

生成之前,把堆栈这里改大一些。网上普遍反映默认值对导致初始化失败,但我单独测过几次,没有影响。不过还是改大一些吧,省心。

4、修改usbd_cdc_if.c文件

也是比较核心的地方!和USART重定向到printf不一样,这里相当于自己重新了一个功能和printf函数一样的函数,代码如下:

/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */

#include <stdarg.h>
 
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 */

然后把函数声明(void usb_printf(const char *format, …))添加到usbd_cdc_if.h中。

5、修改main.c文件

添加头文件:

#include "usbd_cdc_if.h"

定义一个数组:

uint8_t UserTxBuffer[] = "STM32 Virtual COM Port Driver \r\n大家好,我是单片机爱好者MCU起航\r\n";

然后就可以在主函数中循环使用了:

  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
		
		HAL_Delay(1000);
		usb_printf("%s\r\n",UserTxBuffer);
  }

6、下载虚拟串口的驱动

驱动在ST官网,这里我已经下载好了,文章结尾分享

至此,修改完了。保存、编译、下载、上电!

可以看到电脑的设备管理器中,出现了虚拟串口。然后打开串口助手:

输出正常,打完收工!

需要相关代码或者虚拟串口驱动的,请关注公众号:单片机爱好者,回复关键词:STM32虚拟串口,即可获得下载链接。

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据