首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >STM32F103-CubeMX-USB学习--虚拟com口

STM32F103-CubeMX-USB学习--虚拟com口

作者头像
战神伽罗
发布2021-04-14 14:32:35
9450
发布2021-04-14 14:32:35
举报

STM32-CubeMX USB学习

STM32-CubeMX USB学习 1. 虚拟com学习 1.1 开发环境 1.2 使用STM32CubeMX配置代码 1.3 串口自发自收 1.4 串口定向printf

STM32-CubeMX USB学习 1. 虚拟com学习 1.1 开发环境

软件环境: STM32CubeMX 版本:SetupSTM32CubeMX-6.0.1.exe Firmware:STM32Cube FM_F1 V1.8.0

keil 5 V5.29—支持并行编译,可以加速编译效率(最新的版本就可以) keil的固件包版本: Keil.STM32F1xx_DFP.2.0.0.pack keil相关资料的下载 https://www.cnblogs.com/armfly/p/12564643.html

java版本–有遇到过java版本太新导致出问题的 jre-8u201-windows-x64.exe 以下版本亲测有问题,请勿使用 jdk-14.0.2_windows-x64_bin.exe

版本的差异会导致各种报错,切记核对相关版本.

路径中不能出现中文空格,出现会报错.

版本问题导致的报错之一 Error: L6218E: Undefined symbol USB_FlushRxFifo (referred from stm32f1xx_hal_pcd.o).

硬件环境 Stm32F103c8t6–淘宝上最便宜的开发板 在这里插入图片描述

1.2 使用STM32CubeMX配置代码

选择芯片型号,我这边是C8t6 在这里插入图片描述

debug选择 SW模式 在这里插入图片描述

配置外部时钟输入 在这里插入图片描述

配置USB device的功能 在这里插入图片描述

将USB的模式配置成COM口的功能在这里插入图片描述

时钟树配置,如果前面没有配置外部晶振输入,这边无法配置成功。正常的话自动会配置成功 在这里插入图片描述

工程配置,配置成对应keil的版本

在这里插入图片描述 框出来的位置有时候因为尺寸太小会出错,有人说默认的也可以,反正我改了,如下图 在这里插入图片描述

第一栏里面选择第一个和第二个都一样的,有问题的话可以换了试一下 第二栏里勾选将文件分为.c和.h

在这里插入图片描述

生成工程文件 在这里插入图片描述

1.3 串口自发自收

实现串口输出ABCD,需要更改的部分

//1.添加头文件 /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "usb_device.h" #include "gpio.h" #include "usbd_cdc_if.h"

1 2 3 4 5 6

更改main函数

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_USB_DEVICE_Init(); /* USER CODE BEGIN 2 */ //2.添加数组 unsigned char buff[4] = {"abcd"}; /* USER CODE END 2 */

/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */

/* USER CODE BEGIN 3 */ //3. 在while循环中添加如下代码 HAL_Delay(1000); CDC_Transmit_FS(buff,sizeof(buff)); //USB 串口发送数据 } /* USER CODE END 3 */ }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

串口助手 在这里插入图片描述

读取输入的值和上一次是否相同,从而输出不同的值 首先需要将main函数恢复成初始的状态 更改下面的函数 CDC_Receive_FS();这个函数在usbd_cdc_if.c的文件下面的位置 初始代码

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) { /* USER CODE BEGIN 6 */ USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]); USBD_CDC_ReceivePacket(&hUsbDeviceFS); return (USBD_OK); /* USER CODE END 6 */ }

1 2 3 4 5 6 7 8

将代码改成如下的样子

uint8_t a=0,a1=1; unsigned char buff1[4] = {"abcd"}; static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) { a = *Buf;

if(a == a1) CDC_Transmit_FS(Buf,*Len);//自收自发 else { CDC_Transmit_FS(buff1,sizeof(buff1)); a1 = a; } /* USER CODE BEGIN 6 */ USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);

USBD_CDC_ReceivePacket(&hUsbDeviceFS); //CDC_Transmit_FS(Buf,*Len);//自收自发

return (USBD_OK); /* USER CODE END 6 */

}

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

会对比此次的和上一次的差异,如果一样则输出 接收到的值,如果不一样则输出abcd

PS:有一个BUG,数字大了后识别会出错,只能识别发送的第一个数据的差异 在这里插入图片描述 1.4 串口定向printf

参考文档: 文件的配置教程 https://www.jianshu.com/p/579783d28044

1.驱动下载链接 https://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-utilities/stsw-stm32102.html 2. 代码操作 https://blog.csdn.net/u010779035/article/details/104369515

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档