当前位置: 首页 > article >正文

简单理解:嵌入式 USB 基础通信代码

完整 USB 虚拟串口代码带超详细注释// 包含单片机寄存器定义头文件根据你的芯片型号修改比如stm32f10x.h #include stm32f10x.h // 包含USB驱动库文件标准USB设备库 #include usb_lib.h // 包含USB配置描述符文件定义USB设备信息 #include usb_desc.h // 包含USB接口函数文件 #include usb_pwr.h // 包含串口打印调试文件可选用于调试看信息 #include stdio.h /************************************************* 函数USB_GPIO_Config 功能配置USB接口的GPIO引脚必须先配置引脚才能用USB 参数无 返回值无 *************************************************/ void USB_GPIO_Config(void) { // 定义GPIO初始化结构体用来存引脚配置参数 GPIO_InitTypeDef GPIO_InitStructure; // 1. 开启USB引脚对应的时钟时钟不开引脚无法工作 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 2. 配置USB_D引脚PA12USB通信必须用这个引脚 // 选择要配置的引脚PA12 GPIO_InitStructure.GPIO_Pin GPIO_Pin_12; // 配置为推挽输出模式 GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; // 配置速度为50MHz GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // 把配置写入寄存器 GPIO_Init(GPIOA, GPIO_InitStructure); // 3. 让USB_D引脚输出低电平USB设备必须拉低D才能被电脑识别 GPIO_ResetBits(GPIOA, GPIO_Pin_12); // 延时一小段时间让电脑识别到USB插入 Delay_Ms(100); // 4. 配置PA12为USB复用功能切换成USB通信模式 GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_Init(GPIOA, GPIO_InitStructure); } /************************************************* 函数USB_Clock_Config 功能配置USB时钟USB必须用48MHz精确时钟 参数无 返回值无 *************************************************/ void USB_Clock_Config(void) { // 开启USB时钟USB模块供电 RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5); // 使能USB时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE); } /************************************************* 函数USB_Init 功能USB总初始化函数调用它就能启动USB 参数无 返回值无 *************************************************/ void USB_Init(void) { // 1. 配置USB引脚 USB_GPIO_Config(); // 2. 配置USB时钟 USB_Clock_Config(); // 3. 复位USB设备让USB模块回到初始状态 USB_Reset(); // 4. 初始化USB设备库核心驱动初始化 USB_Init_Device(); // 5. 加载USB设备描述符告诉电脑我是USB虚拟串口 USB_SetDeviceDescriptor(USB_Device_Descriptor); // 6. 加载USB配置描述符 USB_SetConfigDescriptor(USB_Config_Descriptor); // 7. 启动USB设备开始和电脑通信 USB_Connect(ENABLE); } /************************************************* 函数USB_Send_Data 功能通过USB向电脑发送数据像串口一样发数据 参数buf要发送的数据len数据长度 返回值无 *************************************************/ void USB_Send_Data(uint8_t *buf, uint16_t len) { uint16_t i; // 定义循环变量 // 判断USB是否连接成功没连电脑就不发送避免出错 if(bDeviceState CONFIGURED) { // 循环发送每一个字节的数据 for(i 0; i len; i) { // 等待发送缓冲区为空上一个数据发完再发下一个 while(USB_TxStatus() 0); // 发送一个字节数据到电脑 USB_SendByte(buf[i]); } } } /************************************************* 函数USB_Receive_Data 功能从电脑接收数据 参数buf存接收数据的数组 返回值接收到的数据长度 *************************************************/ uint16_t USB_Receive_Data(uint8_t *buf) { uint16_t len 0; // 记录接收到的数据长度 // 判断是否有数据收到 if(USB_RxBytes() 0) { // 读取接收到的所有数据 len USB_ReceivePacket(buf); } // 返回数据长度 return len; } /************************************************* 函数main 功能主函数程序入口 *************************************************/ int main(void) { uint8_t send_buf[] Hello USB我是嵌入式USB设备\n; // 发送数据缓存 uint8_t recv_buf[64]; // 接收数据缓存 uint16_t recv_len; // 接收数据长度 // 1. 系统时钟初始化单片机最基础配置 SystemInit(); // 2. 延时函数初始化用来延时 Delay_Init(); // 3. USB初始化启动USB USB_Init(); // 4. 无限循环嵌入式程序永远在循环里运行 while(1) { // 发送数据到电脑 USB_Send_Data(send_buf, sizeof(send_buf)); // 接收电脑发来的数据 recv_len USB_Receive_Data(recv_buf); // 如果收到数据 if(recv_len 0) { // 把收到的数据发回电脑回声功能 USB_Send_Data(recv_buf, recv_len); } // 延时500毫秒 Delay_Ms(500); } }小白必看说明非常重要1. 这个代码能实现什么单片机 USB 插电脑 → 电脑会多出一个串口单片机自动发送Hello USB我是嵌入式USB设备电脑发数据给单片机 → 单片机会原样发回来回声测试2. 代码怎么用把代码复制到你的 STM32 工程里下载到单片机用 USB 线连接单片机和电脑打开电脑串口助手 → 就能看到 USB 通信数据3. 小白最容易踩的坑必须用支持 USB 的单片机STM32F103C8T6/STM32F407 都可以USB 必须接DPA12和 D-PA11电脑会自动安装驱动不需要你手动装代码里的stm32f10x.h要换成你芯片对应的头文件

相关文章:

简单理解:嵌入式 USB 基础通信代码

完整 USB 虚拟串口代码(带超详细注释)// 包含单片机寄存器定义头文件(根据你的芯片型号修改,比如stm32f10x.h) #include "stm32f10x.h"// 包含USB驱动库文件(标准USB设备库) #include…...

思维重构跨设备交互:Scrcpy-iOS如何重新定义手机远程控制体验

思维重构跨设备交互:Scrcpy-iOS如何重新定义手机远程控制体验 【免费下载链接】scrcpy-ios Scrcpy-iOS.app is a remote control tool for Android Phones based on [https://github.com/Genymobile/scrcpy]. 项目地址: https://gitcode.com/gh_mirrors/sc/scrcpy…...

张雪机车 Logo 陷抄袭争议,设计方正式回应

随着张雪机车在赛场夺冠出圈,其品牌 LOGO 一夜之间陷入抄袭争议,4 月 14 日,负责该设计的巴顿品牌设计终于公开回应,把这场持续多日的舆论风波推向了新节点。①事情起因很简单:张雪机车凭借赛事成绩走红后,…...

用Video2X自主掌控视频增强:AI超分辨率与帧插值实战指南

用Video2X自主掌控视频增强:AI超分辨率与帧插值实战指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/vid…...

基于STM32标准库SPI+DMA驱动ST7789:从阻塞刷新到流畅显示的优化实践

1. 从卡顿到流畅:为什么需要SPIDMA驱动ST7789 第一次用STM32的SPI接口驱动ST7789屏幕时,我遇到了一个尴尬的问题:明明已经将SPI时钟调到了最高频率18MHz,全屏刷新时却像幻灯片一样卡顿,实测只有每秒3帧左右。这种性能连…...

“擅自加班” 3 小时后猝死!公司不服工伤认定,反复上诉。网友:这也太狗了吧

①4 月 14 日,一则“员工下班居家工作后猝死,公司拒绝认定工伤”的案件终审判决公布,迅速冲上热搜,引发无数打工人共鸣。2023 年 3 月李某入职郑州某科技公司。2023 年 4 月 17 日下班后续工作:当日 17:00(…...

H3C交换机远程端口镜像配置详解:反射端口方式与VLAN设置

H3C交换机远程端口镜像实战指南:反射端口与VLAN的深度配置解析 在企业网络运维中,流量监控是故障排查和安全审计的重要手段。H3C交换机的远程端口镜像功能,特别是反射端口方式,为跨设备流量监控提供了灵活高效的解决方案。本文将带…...

通过IP地址查询判断网络风险,有哪些具体指标和判断方法?

在风控系统中,IP地址是最基础的判断特征之一。攻击者通过代理池、秒拨IP、云主机等方式绕过规则,如果只依赖简单的地理位置或黑名单,很容易被绕过。本文将结合实际工程经验,梳理IP风险判断的核心指标与可落地的判断方法&#xff0…...

别再乱装PyTorch了!手把手教你用conda搞定Linux下CUDA驱动、Toolkit和PyTorch的版本匹配

深度学习环境搭建避坑指南:用conda精准管理PyTorch与CUDA版本 刚拿到新显卡的兴奋,往往会被环境配置的噩梦浇灭——驱动版本不匹配、CUDA报错、PyTorch无法调用GPU...这些坑我全都踩过。今天我们就用conda这把瑞士军刀,彻底解决这个让无数开发…...

Triton实战手册---Python后端与配置精解(二)

1. Python后端开发实战 Python后端是Triton中最灵活的后端类型,特别适合需要自定义预处理/后处理逻辑的场景。与TensorRT、ONNX等静态模型不同,Python后端允许开发者完全控制推理流程。 先看一个典型的图像处理案例。假设我们需要实现一个图像分类服务&a…...

TimesFM vs 传统时间序列模型:为什么谷歌基础模型正在重塑预测范式

TimesFM vs 传统时间序列模型:为什么谷歌基础模型正在重塑预测范式 【免费下载链接】timesfm TimesFM (Time Series Foundation Model) is a pretrained time-series foundation model developed by Google Research for time-series forecasting. 项目地址: http…...

金融APP如何过等保?一份满足监管与业务安全的加固方案实战教程

对于金融APP而言,安全不仅仅是技术问题,更是生存底线和监管红线。从《个人信息保护法》到等保2.0,每一道监管要求都像悬在头上的剑。在找APK加固方案服务商时,技术负责人最怕的就是:花了大价钱做了加固,结果…...

iOS 15-16设备激活锁绕过:applera1n工具的完整技术解析与实践指南

iOS 15-16设备激活锁绕过:applera1n工具的完整技术解析与实践指南 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 在iOS设备安全研究领域,applera1n作为一款专门针对iOS 15-16.…...

持续交付流水线:从代码提交到生产发布的自动化

持续交付流水线:从代码提交到生产发布的自动化 在当今快节奏的软件开发环境中,企业需要快速、高效地将新功能交付给用户,同时确保质量和稳定性。持续交付流水线(Continuous Delivery Pipeline)正是实现这一目标的核心…...

3分钟掌握卡牌批量生成器:从零到百张的专业设计指南

3分钟掌握卡牌批量生成器:从零到百张的专业设计指南 【免费下载链接】CardEditor 一款专为桌游设计师开发的批处理数值填入卡牌生成器/A card batch generator specially developed for board game designers 项目地址: https://gitcode.com/gh_mirrors/ca/CardEd…...

怎样3分钟找回遗忘的QQ账号:手机号查询工具实战手册

怎样3分钟找回遗忘的QQ账号:手机号查询工具实战手册 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾经因为忘记QQ号而无法登录重要账号?手机号查询QQ号工具为你提供了一种高效、便捷的解决方案。这个…...

告别手动搬运:飞书文档批量导出工具的降维打击

告别手动搬运:飞书文档批量导出工具的降维打击 【免费下载链接】feishu-doc-export 飞书文档导出服务 项目地址: https://gitcode.com/gh_mirrors/fe/feishu-doc-export 还记得那些深夜加班,一个个手动复制粘贴飞书文档的日子吗?当团队…...

跨端通信实战:解锁uniapp中webview与H5/APP的高效数据交互

1. 为什么需要跨端通信? 在混合应用开发中,我们经常会遇到这样的场景:用户在内嵌的H5页面完成登录后,需要将登录状态同步到原生APP中。这时候就需要H5页面和原生APP之间进行数据交互。我遇到过不少开发者在这个环节卡壳&#xff0…...

SAP最快掌握 SAP 组织 核算要素【核心方法论】

口诀记忆(一秒分层)1 大集团 → 2 套核算 → 5 大层级 → 单向归属 → 自动集成流转对外FI 法定:做账、报税、出财报对内CO 管理:算成本、算利润、绩效考核物流业务层:管库存、生产、物料计价预算FM 基金层&#xff1a…...

如何高效使用XUnity.AutoTranslator:终极Unity游戏翻译指南

如何高效使用XUnity.AutoTranslator:终极Unity游戏翻译指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为日文或韩文Unity游戏而苦恼吗?XUnity.AutoTranslator是一款专为U…...

CheatEngine找基址实战:从‘更改数值’到理解‘偏移’的完整思路

CheatEngine找基址实战:从数值追踪到指针解析的逆向思维 当你在游戏里发现金币数值从100变成120时,CheatEngine的扫描结果可能会显示十几个内存地址。这时候新手常犯的错误是随便选一个地址修改——结果重启游戏就失效。真正稳定的修改需要找到基址偏移…...

基于 SelectDB 实现 Hive 数据湖统一分析:洋钱罐全球一体化探索分析平台升级实践

在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...

CREST终极指南:3分钟掌握分子构象搜索与化学空间探索

CREST终极指南:3分钟掌握分子构象搜索与化学空间探索 【免费下载链接】crest CREST - A program for the automated exploration of low-energy molecular chemical space. 项目地址: https://gitcode.com/gh_mirrors/crest/crest 你是否曾经为寻找分子的最佳…...

如何永久解锁Cursor Pro功能:3个核心技巧让你免费使用AI编程助手

如何永久解锁Cursor Pro功能:3个核心技巧让你免费使用AI编程助手 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reache…...

UE5动画新手上路:用ControlRig+Sequencer 10分钟搞定你的第一个角色点头动画

UE5动画新手指南:10分钟用Control Rig制作角色点头动画 第一次打开Unreal Engine 5的动画系统时,我完全被那些复杂的骨骼和参数吓到了。直到发现Control Rig这个神奇的工具,才意识到原来制作一个简单的角色动画可以如此直观。本文将带你从零开…...

LLM系列:1.python入门:7.字典型对象(dict)

字典型对象(dict) 一. 字典基础 字典(dict)是Python中无序的可变容器。它由一个个键值对(Key-Value)构成。字典也被称作关联数组或者哈希表。 1. 字典的创建 外侧使用大括号 {} 圈定,内部是由冒号 : 连接的键值对,不同键值对之间用…...

给STM32F7加把安全锁:用CubeMX、FreeRTOS和WolfSSL 4.4.0实现HTTPS客户端(附完整工程)

STM32F7安全通信实战:基于CubeMX与WolfSSL的HTTPS客户端深度优化 在物联网设备爆发式增长的今天,数据安全传输已成为嵌入式开发者的必修课。当你的智能家居设备向云端发送温度数据,或是工业传感器传输产线状态时,如何防止敏感信息…...

Intv_AI_MK11运维自动化实践:智能监控告警与故障自愈方案

Intv_AI_MK11运维自动化实践:智能监控告警与故障自愈方案 1. 运维自动化的新纪元 凌晨3点,某电商平台的数据库突然出现性能抖动。传统运维模式下,值班工程师需要手动检查十几项指标、翻阅数百条日志才能定位问题。而采用Intv_AI_MK11的智能…...

ROS多传感器数据融合:message_filters时间同步实战(附避坑指南)

ROS多传感器数据融合:message_filters时间同步实战与深度优化 当你的机器人同时搭载激光雷达、摄像头和IMU时,最头疼的莫过于这些传感器数据像不同时区的航班一样难以协调。我曾在一个自动驾驶项目中,因为5毫秒的时间偏差导致感知系统将路灯杆…...

LingBot-Depth-ViTL14部署案例:高校CV实验室Vision Transformer几何任务教学平台搭建

LingBot-Depth-ViTL14部署案例:高校CV实验室Vision Transformer几何任务教学平台搭建 1. 引言 在计算机视觉的教学与研究中,几何理解——特别是深度感知——一直是一个核心且富有挑战性的课题。传统的深度估计方法,如立体匹配或结构光&…...