STM32H750 USBCDC配置与使用

news2024/11/4 19:55:42

STM32H750 USBCDC配置与使用


  • 📍相关参考文章:《STM32 USB CDC VPC》

STM32H750VB有2个USB OTG接口(1FS,1HS/FS)无晶振型解决方案,带有LPM和BCD。

  • 🔖本次使用USB-PTG-FS作为测试
    在这里插入图片描述

  • 🌿时钟源选择内部RC振荡器
    在这里插入图片描述

  • 🌿中间件和软件配置选择
    在这里插入图片描述

  • 🌿STM32CubeMX生成的目录和文件
    在这里插入图片描述

📗USBCDC配置功能函数配置

  • 🌿实现类似printf打印函数:在usbd_cdc_if.c中添加实现,将实现方法函数添加到对应的usbd_cdc_if.h,供外部调用
/* 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 */
  • 🌿实现接收超过64字节以上数据实现

同样在usbd_cdc_if.c中添加如下内容:

/* USER CODE BEGIN PRIVATE_VARIABLES */
USBD_CDC_LineCodingTypeDef USBD_CDC_LineCoding =
{
		115200,      // 默认波特率
		0X00,        // 1位停止位
		0X00,        // 无奇偶校!
		0X08,        // 无流控,8bit数据位4
};

uint8_t Rx_Buffer[Rx_Buffer_Len];//全局变量,添加到usbd_cdc_if.h中
__IO uint8_t DataReceive_Flag;//全局变量,添加到usbd_cdc_if.h中
uint32_t SinglePackLength;
uint8_t *p_TempBuf;
uint8_t Num_Packet;
uint32_t Rx_Data_Len;//全局变量,添加到usbd_cdc_if.h中

/* USER CODE END PRIVATE_VARIABLES */
  • 🌿函数:CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length),主要是实现监听虚拟端口波特率的变化。
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)
{
  /* USER CODE BEGIN 5 */
  switch(cmd)
  {
    case CDC_SEND_ENCAPSULATED_COMMAND:

    break;

    case CDC_GET_ENCAPSULATED_RESPONSE:

    break;

    case CDC_SET_COMM_FEATURE:

    break;

    case CDC_GET_COMM_FEATURE:

    break;

    case CDC_CLEAR_COMM_FEATURE:

    break;

  /*******************************************************************************/
  /* Line Coding Structure                                                       */
  /*-----------------------------------------------------------------------------*/
  /* Offset | Field       | Size | Value  | Description                          */
  /* 0      | dwDTERate   |   4  | Number |Data terminal rate, in bits per second*/
  /* 4      | bCharFormat |   1  | Number | Stop bits                            */
  /*                                        0 - 1 Stop bit                       */
  /*                                        1 - 1.5 Stop bits                    */
  /*                                        2 - 2 Stop bits                      */
  /* 5      | bParityType |  1   | Number | Parity                               */
  /*                                        0 - None                             */
  /*                                        1 - Odd                              */
  /*                                        2 - Even                             */
  /*                                        3 - Mark                             */
  /*                                        4 - Space                            */
  /* 6      | bDataBits  |   1   | Number Data bits (5, 6, 7, 8 or 16).          */
  /*******************************************************************************/
    case CDC_SET_LINE_CODING:
						USBD_CDC_LineCoding.bitrate = (pbuf[3] << 24) | (pbuf[2] << 16) | (pbuf[1] << 8) | pbuf[0];
            USBD_CDC_LineCoding.format = pbuf[4];
            USBD_CDC_LineCoding.paritytype = pbuf[5];
            USBD_CDC_LineCoding.datatype = pbuf[6];
//		huart1.Init.BaudRate = USBD_CDC_LineCoding.bitrate;
//      HAL_UART_Init(&huart1);
    break;

    case CDC_GET_LINE_CODING:
						pbuf[0] = (uint8_t)(USBD_CDC_LineCoding.bitrate);
            pbuf[1] = (uint8_t)(USBD_CDC_LineCoding.bitrate >> 8);
            pbuf[2] = (uint8_t)(USBD_CDC_LineCoding.bitrate >> 16);
            pbuf[3] = (uint8_t)(USBD_CDC_LineCoding.bitrate >> 24);
            pbuf[4] = USBD_CDC_LineCoding.format;
            pbuf[5] = USBD_CDC_LineCoding.paritytype;
            pbuf[6] = USBD_CDC_LineCoding.datatype;

    break;

    case CDC_SET_CONTROL_LINE_STATE:

    break;

    case CDC_SEND_BREAK:

    break;

  default:
    break;
  }

  return (USBD_OK);
  /* USER CODE END 5 */
}
  • 🌿接收数据函数:CDC_Receive_FS补充:
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);
//	CDC_Transmit_FS(Buf, *Len);  //将接收到的数据,从USB串口 再发送出去
  p_TempBuf = Buf;
  SinglePackLength = *Len;
  if (SinglePackLength == CDC_DATA_FS_MAX_PACKET_SIZE)
  {
    memcpy((Rx_Buffer + (CDC_DATA_FS_MAX_PACKET_SIZE * Num_Packet)), Buf, SinglePackLength);
    Rx_Data_Len = (CDC_DATA_FS_MAX_PACKET_SIZE * Num_Packet) + SinglePackLength;
    Num_Packet++;
  }
  else
  {
    memcpy((Rx_Buffer + (CDC_DATA_FS_MAX_PACKET_SIZE * Num_Packet)), Buf, SinglePackLength);
    Rx_Data_Len = (CDC_DATA_FS_MAX_PACKET_SIZE * Num_Packet) + SinglePackLength;
    DataReceive_Flag = 1;
    Num_Packet = 0;
  }
	return (USBD_OK);
  /* USER CODE END 6 */
}
  • 🌿对从虚拟端口接收到的数据处理内容:
if(DataReceive_Flag){
			 DataReceive_Flag =0;
//	printf("cdc rece:%s",Rx_Buffer);
						SCB_CleanDCache_by_Addr((uint32_t *)Rx_Buffer, Rx_Buffer_Len);
			//		SCB_CleanInvalidateDCache_by_Addr ((uint32_t *)UART_RX_STA, UART_RX_LEN);//或者
			HAL_UART_Transmit_DMA(&huart1,(uint8_t *)Rx_Buffer, Rx_Data_Len);//配合上面的函数一起使用
//HAL_UART_Transmit(&huart1, Rx_Buffer, Rx_Buffer_Len, 100);
}
  • 📜测试效果:
    在这里插入图片描述

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

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

相关文章

引领数字时代:万码优才如何变革IT人才招聘新体验(这里有更精准的推荐)

目录 引领数字时代&#xff1a;万码优才如何变革IT人才招聘新体验引领未来科技&#xff0c;精准链接IT精英精准匹配&#xff0c;高效对接海量资源&#xff0c;覆盖广泛优化体验&#xff0c;简化流程 全面升级&#xff1a;AI赋能数字人才职业成长AI模拟面试职场千问智能简历评估…

网络安全法详细介绍——爬虫教程

目录 [TOC](目录)一、网络安全法详细介绍1. 网络安全法的主要条款与作用2. 网络安全法与爬虫的关系3. 合法使用爬虫的指南 二、爬虫的详细教程1. 准备环境与安装工具2. 使用requests库发送请求3. 解析HTML内容4. 使用robots.txt规范爬虫行为5. 设置请求间隔6. 数据清洗与存储 三…

vscode插件-08 Golang

文章目录 Go安装其他必须软件 Go Go语言环境&#xff0c;只需安装这一个插件。然后通过vscode命令下载安装其他go环境需要的内容。 程序调试&#xff0c;需要创建.vscode文件夹并编写launch.json文件。 安装其他必须软件 ctrlshiftp&#xff0c;调出命令面板&#xff0c;输入…

ConnectX-7 25/50/100/200/400G NIC

ConnectX-7 25/50/100/200/400G NIC ConnectX-7提供了广泛的软件定义、硬件加速的网络、存储和安全功能&#xff0c;使组织能够现代化和保护他们的IT基础设施。此外&#xff0c;ConnectX-7还支持从边缘到核心数据中心到云的敏捷和高性能解决方案&#xff0c;同时增强网络安全性…

windows在两台机器上测试 MySQL 集群实现实时备份

在两台机器上测试 MySQL 集群实现实时备份的基本步骤&#xff1a; 一、环境准备 机器配置 确保两台机器&#xff08;假设为服务器 A 和服务器 B&#xff09;能够互相通信&#xff0c;例如它们在同一个局域网内&#xff0c;并且开放了 MySQL 通信所需的端口&#xff08;默认是 …

uniapp实现中间平滑凸起tabbar

uniapp实现中间平滑凸起tabbar 背景实现思路代码实现尾巴 背景 在移动端开发中&#xff0c;tabar是一个使用频率很高的组件&#xff0c;几乎是每个APP都会用到。今天给大家分享一个中间平滑凸起的tabbar组件&#xff0c;有需要的可以做下参考。先上图镇楼&#xff1a; 实现思…

java版询价采购系统 招投标询价竞标投标系统 招投标公告系统源码

在数字化时代&#xff0c;企业需要借助先进的数字化技术来提高工程管理效率和质量。招投标管理系统作为企业内部业务项目管理的重要应用平台&#xff0c;涵盖了门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理等…

YOLOV8目标检测C++推理问题总结

背景 数据集有限&#xff0c;使用paddleOCR直接识别准确率无法达到99%&#xff0c;这里尝试用目标检测对识别得分比较低的图片进行二次处理&#xff1b; 类别数目&#xff1a;数字&#xff08;10&#xff09;字母&#xff08;26&#xff09;字符&#xff08;2&#xff09; 38 …

Python毕业设计选题:基于Hadoop的租房数据分析系统的设计与实现

开发语言&#xff1a;Python框架&#xff1a;flaskPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页 房屋信息详情 个人中心 管理员登录界面 管理员功能界面 用户管理界面 房屋信…

CSRF与SSRF

csrf(跨站请求伪造)的原理: csrf全称是跨站请求伪造(cross-site request forgery)&#xff0c;也被称为one-click attack 或者 session riding scrf攻击利用网站对于用户网页浏览器的信任&#xff0c;劫持用户当前已登录的web应用程序&#xff0c;去执行分用户本意的操作。 利…

Rust 力扣 - 1984. 学生分数的最小差值

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 原数组 nums 排序&#xff0c;遍历nums中下标为[0, nums.len() - k]的学生分数 假设当前遍历的下标为i则&#xff0c;以 i 下标为最小值的学生分数的最小差值为nums[i k - 1] - nums[i] 取最小差值的最小值即…

前端笔试新问题总结

记录总结下最近遇到的前端笔试新问题 目录 一、操作数组方法 1.Array.isArray(arr) 2.Object.prototype.toString.call(arr) "[object Array]" 3.arr instanceof Array 1&#xff09;跨帧问题 2&#xff09;修改Array.prototype 3&#xff09;模拟数组的对象…

HTML 基础标签——结构化标签<html>、<head>、<body>

文章目录 1. <html> 标签2. <head> 标签3. <body> 标签4. <div> 标签5. <span> 标签小结 在 HTML 文档中&#xff0c;使用特定的结构标签可以有效地组织和管理网页内容。这些标签不仅有助于浏览器正确解析和渲染页面&#xff0c;还能提高网页的可…

跳表原理笔记

课程地址 跳表是一种基于随机化的有序数据结构&#xff0c;它提出是为了赋予有序单链表以 O(logn) 的快速查找和插入的能力 创建 首先在头部创建一个 sentinel 节点&#xff0c;然后在 L1 层采用“抛硬币”的方式来决定 L0 层的指针是否增长到 L1 层 例如上图中&#xff0c;L…

Vision - 开源视觉分割算法框架 Grounded SAM2 配置与推理 教程 (1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/143388189 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Ground…

3674矢量网络分析仪-003噪声系数测量选件

3674X-003 噪声系数测量选件 3674系列矢量网络分析仪 综述 3674X-003噪声系数测量一次连接&#xff0c;可同时测试S参数、噪声系数、噪声参数、增益压缩和变频增益等多种参数。基于冷源噪声系数测试方法&#xff0c;可进行精确的噪声系数和噪声参数测试。 •特点 • 3674X…

DDRPHY数字IC后端设计实现系列专题之后端设计导入,IO Ring设计

本章详细分析和论述了 LPDDR3 物理层接口模块的布图和布局规划的设计和实 现过程&#xff0c;包括设计环境的建立&#xff0c;布图规划包括模块尺寸的确定&#xff0c;IO 单元、宏单元以及 特殊单元的摆放。由于布图规划中的电源规划环节较为重要&#xff0c; 影响芯片的布线资…

如何将MySQL彻底卸载干净

目录 背景&#xff1a; MySQL的卸载 步骤1&#xff1a;停止MySQL服务 步骤2&#xff1a;软件的卸载 步骤3&#xff1a;残余文件的清理 步骤4&#xff1a;清理注册表 步骤五:删除环境变量配置 总结&#xff1a; 背景&#xff1a; MySQL卸载不彻底往往会导致重新安装失败…

Vue生成名片二维码带logo并支持下载

一、需求 生成一张名片&#xff0c;名片上有用户信息以及二维码&#xff0c;名片支持下载功能&#xff08;背景样式可更换&#xff0c;忽略本文章样图样式&#xff09;。 二、参考文章 这不是我自己找官网自己摸索出来的&#xff0c;是借鉴各位前辈的&#xff0c;学以致用&am…

【AIGC】深入探索『后退一步』提示技巧:激发ChatGPT的智慧潜力

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;“后退一步”技巧介绍技巧目的 &#x1f4af;“后退一步”原理“后退一步”提示技巧与COT和TOT的对比实验验证 &#x1f4af;如何应用“后退一步”策略强调抽象思考引导提…