今天研究下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虚拟串口,即可获得下载链接。
这个配上一个BootLoader应该很好用吧
ST的CDC驱动不是很好用,用的人还是少~~~
超好用!!!!!!!!!!
多谢捧场