STM32F103 USB实现虚拟串口

news2024/11/30 10:35:42

STM32F103 USB实现虚拟串口

最近买了一个STM32F103C8T6最小核心板,使用CubeIDE无法识别该芯片,发现该芯片的flash是128Kbytes,ST的标准库是64Kbytes,奇怪啊!也许是国产替代的,国产化太先进了,导致原厂落后了,不认识先进的东西了。
只好又在某宝买了5.5元的STM32F103C6T6最小核心板,CubeID环境下正常工作和调试。感谢万能的某宝!最便宜的东西才能工作正常,好无语啊!

实验环境

STM32F103C6T6A最小系统板, CubeIDE 1.10.1, ST-LINK;在这里插入图片描述

实验目的

实现USB的串口数据传输;

操作步骤

  1. cubeIDE建立工程并生成代码。
  2. 设置晶振RCC在这里插入图片描述
  3. 设置SYS, 调试方式在这里插入图片描述
  4. 设置USB,激活USB在这里插入图片描述
  5. 设置Middleware, USB vitrual port, 在这里插入图片描述
  6. 保存并generate code,进行编译一遍,通常是不能编译通过的。
  7. 修改usb_cdc_if.h 文件
/* USER CODE BEGIN INCLUDE */
 #define USB_REC_LEN   256 //定义USB串口接收字节数
 extern uint8_t USB_RX_BUF[USB_REC_LEN];//接收缓冲
 extern uint16_t USB_RX_STA;//接收标记
 /* USER CODE END INCLUDE */`
  1. 设修改usb_cdc_if.c文件 在这里插入图片描述
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
 uint8_t USB_RX_BUF[USB_REC_LEN];//接收缓冲,�?大USB_REC_LEN个字�?.
 uint16_t USB_RX_STA=0;//接收状�?�标记(接收到的有效字节数量�?
/* USER CODE END PV */

修改接收函数代码

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
	if(*Len<USB_REC_LEN)//判断收到数据量是否小于寄存器上限
	{
	   uint16_t i;
	   USB_RX_STA = *Len;//将数据量值放入标志位
	   for(i=0;i<*Len;i++)//循环
		   USB_RX_BUF[i] = Buf[i];//将数据内容放入数据寄存器
	}
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);  //将接收数组buff清空
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);  //再次虚拟串口接收
  return (USBD_OK);
  /* USER CODE END 6 */
}

修改发送函数代码

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
  uint8_t result = USBD_OK;
  /* USER CODE BEGIN 7 */
  uint32_t TimeStart = HAL_GetTick();
  USBD_CDC_HandleTypeDef *hcdc =  (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
  //if (hcdc->TxState != 0) return  USBD_BUSY;
  while(hcdc->TxState)
  {
     if(HAL_GetTick()-TimeStart > 10)
    	 return USBD_BUSY;
     else
    	 break;
  }
  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf,  Len);
  result =  USBD_CDC_TransmitPacket(&hUsbDeviceFS);
  TimeStart = HAL_GetTick();
  while(hcdc->TxState)
	{
		if(HAL_GetTick()-TimeStart > 10)
		return USBD_BUSY;
	}
  /* USER CODE END 7 */
  return result;
}

添加输出函数

#include <stdarg.h>
void USB_printf(const char *format, ...)//USB模拟串口的打印函�?
{
    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);
}
  1. 修改main.c
    添加include文件
	/* USER CODE BEGIN Includes */
#include "../../USB_DEVICE/App/usbd_cdc_if.h"
    /* USER CODE END Includes */ 

修改main函数的while循环

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

    /* USER CODE BEGIN 3 */
		//USB模拟串口的查寻接收处理
		if(USB_RX_STA!=0)//判断是否有
		{
			//USB_printf("USB_RX:");//向USB模拟串口发字符串
			CDC_Transmit_FS(USB_RX_BUF,USB_RX_STA);//USB串口:将接收的数据发回给电脑端
			//USB_printf("\r\n");//向USB模拟串口发(回车)
			USB_RX_STA=0;//数据标志位清0
			memset(USB_RX_BUF,0,sizeof(USB_RX_BUF));//USB串口数据寄存器清0
		}
  }
  /* USER CODE END 3 */
  1. 修改堆栈和堆;在这里插入图片描述

11.修改编译优化在这里插入图片描述

设置编译优化: Properties for F10****/ C/C++ Build / Settings / MCU GCC Compiler / Optimization \ Optimization level = “Optimize for size(-Os)”
否则会出现错误如下:

\tools\arm-none-eabi\bin\ld.exe: F103C6T6Atest.elf section .text' will not fit in region FLASH’ \tools\arm-none-eabi\bin\ld.exe: region
`FLASH’ overflowed by 1656 bytes collect2.exe: error: ld returned 1
exit status make: *** [makefile:68: F103C6T6Atest.elf] Error 1 “make
-j8 all” terminated with exit code 2. Build might be incomplete.

运行测试

1.设备管理器可以看到串口;
2.使用串口工具,发送接收数据正常。
在这里插入图片描述
CubeIDE1.10.1 环境下的源代码:https://download.csdn.net/download/qq_23313467/87824117

注意事项:STM32F103C6T6的存储容量比较小,实现USB的虚拟串口基本上用完了内存和flash,如果再添加别的复杂功能,估计存储就不够了。参看了一下生成的hex文件,已经达到38k了!

参考链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/572050.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CCIG:智能文档处理「新未来」

文章目录 ⭐️ CCIG大会简介⭐️ 领先世界的智能文档处理技术&#x1f31f; 智能图像处理&#xff1a;为文字识别 "增质提效" 筑基✨ 切边增强 - 提升文档图像质量✨ 弯曲矫正 - 解决图像畸变问题✨ 去摩尔纹 - 保证图像信息完整 &#x1f31f; 图像预处理整体效果展…

汇编基础知识

1.汇编工程流程: 汇编指令--->编译器--->机器码--->计算机 2.汇编语言组成: 1.汇编指令 2.伪指令 3.其他符号 3.存储器: 存放指令与数据的容器,也叫内存. 存储器被划分为多个单元,并且从0开始按钮顺序编号,这些编号视为存储器的存储单元的地址. 4.指令与…

《Cocos Creator游戏实战》老虎机抽奖效果实现思路

在线体验地址 Cocos Creator | SlotMachine Cocos Store 购买地址&#xff08;如果没有显示&#xff0c;那就是还在审核&#xff09;&#xff1a; https://store.cocos.com/app/detail/4958微店购买地址&#xff1a; https://weidian.com/item.html?itemID6338406353运行效果…

平板用什么远程操控电脑

现在的第三方专业远程软件大部分支持跨平台连接&#xff0c;要使用平板电脑远程控制电脑&#xff0c;还是很简单的。一般来说按照以下步骤操作即可。 确保两台设备都连接到互联网 确保您要控制的电脑和平板电脑都通过 Wi-Fi 或移动数据连接到互联网。 安装远程控制应用程序 …

设计事务所项目管理指南

在数字化的浪潮下&#xff0c;各行各业都面临着升级转型的问题。对设计团队而言&#xff0c;传统的管理方式已经无法满足日益前进的团队需求。 设计事务所可能存在的管理问题&#xff1a; 1&#xff0c;项目过程中信息流通慢&#xff0c;成员工作进度无法及时同步&#xff1b; …

结构型设计模式01-装饰模式

✨作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 装饰模式 1、 问题引入 要实现一个简单的个人形象系统&#xff0c;使用控制台输出的形式&#xff0c;简单说明搭配着装 Person pa…

【快应用】响应式布局适配横竖屏或折叠屏

【关键词】 响应式布局、折叠屏、横竖屏 【问题背景】 当前开发者在开发快应用时&#xff0c;往往将designWidth设置为设备屏幕的宽度&#xff0c;这时&#xff0c;应用的内容会随着设备宽度的变大而拉伸显示&#xff0c;导致在大屏、横屏、折叠屏展开时显示效果不好。 在折…

PMP考试应该要如何备考?如何短期通过PMP?

我从新考纲考完下来&#xff0c;3A通过了考试&#xff0c;最开始也被折磨过一段时间&#xff0c;但是后面还是找到了方法&#xff0c;也算有点经验&#xff0c;给大家分享一下吧。 程序猿应该是考PMP里面人最多的&#xff0c;毕竟有一个30大坎&#xff0c;大部分人还是考虑转型…

微信小程序button按钮设置宽度无效

button按钮设置宽度无效 背景&#xff1a; 在开发小程序的过程中&#xff0c;遇到了button按钮设置宽度无效的问题 微信客户端 7.0 开始&#xff0c;UI 界面进行了大改版。小程序也进行了基础组件的样式升级&#xff0c;涉及的组件有 button,icon,radio,checkbox,switch,sli…

手把手教你在昇腾平台上搭建PyTorch训练环境

PyTorch是业界流行的深度学习框架&#xff0c;用于开发深度学习训练脚本&#xff0c;默认运行在CPU/GPU上。在昇腾AI处理器上运行PyTorch业务时&#xff0c;需要搭建异构计算架构CANN&#xff08;Compute Architecture for Neural Networks&#xff09;软件开发环境&#xff0c…

《花雕学AI》36:探索Aski AI——集成问答、写作和绘画功能的强大AI平台

引言&#xff1a;人工智能是当今时代的最热门和最有前途的技术之一&#xff0c;它可以帮助人类解决各种复杂和有趣的问题&#xff0c;提高生活和工作的效率和质量。然而&#xff0c;人工智能的应用还面临着许多挑战和局限&#xff0c;比如数据的稀缺和质量、算法的复杂性和可解…

CompletableFuture详解-初遇者-很细

目录 一、创建异步任务 1. supplyAsync 2. runAsync 3.获取任务结果的方法 二、异步回调处理 1.thenApply和thenApplyAsync 2.thenAccept和thenAcceptAsync 2.thenRun和thenRunAsync 3.whenComplete和whenCompleteAsync 4.handle和handleAsync 三、多任务组合处理 1…

Git的安装及基础命令

一. 安装Git 首先请前往Git官网去下载最新的安装包:https://git-scm.com/download/win 运行下载好的 .exe 文件&#xff0c;一路next即可。 右击桌面出现以下两个就算是成功。 安装完成后,需要设定用户名和邮箱来区分不同的用户。右击屏幕&#xff0c;选择“Git Bash Here”…

​Lambda表达式详解​-初遇者-很细

目录 Lambda简介 对接口的要求 Lambda 基础语法 Lambda 语法简化 Lambda 表达式常用示例 lambda 表达式引用方法 构造方法的引用 lambda 表达式创建线程 遍历集合 删除集合中的某个元素 集合内元素的排序 Lambda 表达式中的闭包问题 Lambda简介 Lambda 表达式是 JD…

骑行,为日益冷漠的人际关系加点温度

随着社会的发展和人们生活水平的提高&#xff0c;越来越多的年轻人、老年人和中年人开始关注健康和运动。而骑行作为一种健康、环保、经济实惠的运动方式&#xff0c;受到越来越多人的喜爱。本文将从社会面探讨这些话题对于不同人群的影响。 首先&#xff0c;骑行对身体有着多方…

狂飙,从功能测试转到自动化测试,我的测试之路涨了20k...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

《四》Git 中的远程仓库

SSH 登录&#xff1a; 每个远程仓库都有两种地址&#xff1a;HTTPS 和 SSH。如果是 HTTPS 的地址&#xff0c;每次 push 的时候都要输入用户名和密码以校验身份。如果 SSH 的方式&#xff0c;就不再需要每次都输入用户名和密码了。 cd ~ 进入用户的家目录&#xff0c;执行 ss…

ChatGPT在智能外呼机器人领域的应用

随着人工智能技术的不断发展&#xff0c;自然语言处理(NLP)技术也逐渐成为各行各业的热门技术。其中&#xff0c;ChatGPT技术是近年来备受关注的技术之一。ChatGPT技术是一种基于自然语言处理和深度学习的人工智能技术&#xff0c;它可以处理自然语言文本&#xff0c;实现自动化…

Maven 概述及下载安装

一、为什么要学习 Maven 我们构建一个项目需要用到很多第三方的类库&#xff0c;就需要引入大量的jar包&#xff0c;并且Jar包之间的关系错综复杂&#xff0c;缺少任何一个Jar包都会导致项目编译失败。Maven 能帮助我们下载及管理依赖。 本地项目代码开发完成后&#xff0c;我…

如何在华为OD机试中获得满分?Java实现【字母组合】一文详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…