0%

stm32 103c8t6实现USB虚拟串口笔记

参考:
https://blog.csdn.net/vonlycn/article/details/103280073

前言:

以前有块STM32的板子,想试试HAL库的功能,经典的点灯程序试验完毕。再搞个串口试验想,通过CUBEMX配置后,简单测试后发现从STM32串口乱码,即从STM32串口发送出来的数据,在PC端的串口调试助手一直乱码。

网络搜索一下,有说是板子晶振问题,这确实是乱码产生的一个因素。但是,经过仔细确认,我的板子不存在这个问题。经仔细看了原理图,是MINI板的问题,串口的RX,TX确实引出来了,但是没有232的电平转换,因此直接用杜邦线将排针上的RX,TX直接与PC的串口对应线连接是不能正确的,必须乱码!

总得通信起来吧,那就USB虚拟串口方式了,于是就有了这篇笔记。

CubeMX配置:

根据选择的芯片,逐步完成配置即可,首先配置debug
示例

时钟:

选中前两个圈后,在第三个圈直接填写板子支持的最大时钟:72MHz即可自动完成配置。

USB:

这个地方可以都是设置0x400,也可以到代码工程里修改。

最后点击:

即可生成工程。

开始添加代码

打开工程

注:添加代码时,贴出代码,方便浏览者复制,同时,给出截图,方便浏览者对照在自己工程中找位置。

首先,在usbd_cdc_if.h 文件添加如下代码:

#define APP_RX_DATA_SIZE 1000            //至43都是自己添加的内容
#define APP_TX_DATA_SIZE 1000
typedef struct 
{
    volatile uint8_t RecFlag;
    volatile uint16_t RecLen;
}RxDef;
extern RxDef USB_COM;
extern uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];//接收缓存
extern uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];//发送缓存

接着,在usbd_cdc_if.c 文件添加如下代码:

USB_COM.RecLen=*Len;    // 添加自己
USB_COM.RecFlag=1;        //添加自己

最后,在main.c文件添加代码:

#include "usbd_cdc.h"        //添加两个头文件
#include "usbd_cdc_if.h"

添加发送数据代码

 while (1)
  {
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
    if(USB_COM.RecFlag==1)
    {
        HAL_Delay(500);
        USB_COM.RecFlag=0;
        CDC_Transmit_FS("ABCDE",5);
    }
  }
  /* USER CODE END 3 */

测试:

PC端随意发数据,每发一次则SMT32回应固定的字符串“ABCDE”,说明通信OK。当然,可以实现自定义协议,来控制板子上做一些操作。

比如PC发一串命令包下来,板子端可以解析PC来的命令包,控制关LED,开LED等等。

备注问题:

USB无法识别:

即cubeMX配置完成时,且未添加任何代码,直接编译,下载到板子后,接USB线后,无法识别。

1、查一下说堆和栈太小了,要大一点,修改堆和栈大小的两种方法:

A、MX时,直接都搞成0x400

B、修改启动汇编代码startup_stm32f103xb.s文件中直接修改

    Stack_Size        EQU     0x400
    Heap_Size      EQU     0x400

2、PC安装虚拟USB串口

我试验过程中没有安装,插好USB线后就识别一个COM6出来:

而安装虚拟USB串口在设备管理上识别出来的是:

至此,笔记完成!