63 USB复合设备多设备数据乱码问题及ENDP0_RXADDR起始地址计算方式

stm32 usb数据缓冲区疑问 stm32 usb数据缓冲区疑问,顶点分配说明,stm32 USB开发的时候,关于那个512缓冲区8个顶点buff分配问题。新手会看着代码摸不着头脑。这是居体说明。usb_conf.h文件里面,如#define ENDP0_RXADDR (0x40) #define ENDP0_TXADDR (0x80) 立即下载

1.引言

        最近又往usb设备中添加了虚拟串口功能,使用的usb端点从三个增长到了5个。很巧合,例程给的恰好是小于3个端点的,所以在前面的移植过程中并未出现什么错误,所以当时也就迷糊的过去了,未研究ENDP0_RXADDR为何是0x18。

        然后今天发现在多个usb设备情况下,数据虚拟串口数据发送出现乱码,所以才引起问题的查找。

        现在我使用到的端点个数已经达到5个,出现了usb 的虚拟串口发数据给PC,PC端收到的数据是乱码的,对比例程的代码,自己跟例程代码差别没有,所以迫使寻找问题。幸好看到了 下帖,才解决了自己的疑惑。

 帖子链接:

STM32 USB 复合设备 多路虚拟串口乱码问题 - *USB* - 论坛-意法半导体STM32/STM8技术社区

 2.ENDP0_RXADDR起始计算依据

        首先stm32单片机有512字节大小的USB buffer,然后USB中存在一张Buffer Description Table,就是我们在usb_conf.h头文件中看到的一个宏定义。

/* buffer table base address */
/* buffer table base address */
#define BTABLE_ADDRESS 		(0x00)

        这个Buffer Description Table表,一般就存在单片机的USB 512字节大小的buffer中,且一般是存在USB buffer 的起始位置,所以我们看到上面的BTABLE_ADDRESS 宏定义的是0x00,也就是USB buffer起始的位置。

         然后再来谈谈这个Buffer Description Table的内容还有作用。

        这个表存在的是,每个端点的缓存区地址addr和缓存长度length,也就是一个端点就会对应一个addr+length,即占用8个字节大小。

        而Buffer Description Table,和我们USB的发送和接收是共用这512字节的buffer的,所以当这个表发生变化时,我们能使用的端点的发送和接收缓存区大小将会发生变化。

        

         由上图看,使用的端点越多,表越大,剩下的缓存区域越小。

        stm32USB例程,使用的是2个或3个端点,所以它们将ENDP0_RXADDR定义为0x18(等于24字节),当使用2个端点是,Buffer Description Table占用 2*(4+4) = 16Byte;当使用3个端点时Buffer Description Table占用3*(4+4) = 24Byte(也就是0x18)。也就是例程里面给的。

         我现在使用了8个端点,所以通过计算ENDP0_RXADDR = 0x40 = 8*8= 64。

/*-------------------------------------------------------------*/
/* EP_NUM */
/* defines how many endpoints are used by the device */
/*-------------------------------------------------------------*/
#define EP_NUM 				(5) //用到5组

/*-------------------------------------------------------------*/
/* --------------   Buffer Description Table  -----------------*/
/*-------------------------------------------------------------*/
/* buffer table base address */
/* buffer table base address */
#define BTABLE_ADDRESS 		(0x00)

/* EP0  */
/* rx/tx buffer base address */
#define ENDP0_RXADDR        (0x40)//这个起始地址= (4+4)*端点个数 = 8*8 = 64 = 0x40
#define ENDP0_TXADDR        (0x80)//依次递增64Byte就系,也就是0x40

/* EP1  */
/* tx buffer base address */
#define ENDP1_TXADDR        (0xc0) 

/* EP2  */
/* tx buffer base address */
#define ENDP2_TXADDR        (0xE0) //因为Ep1我实际只是用了8字节发送的,所以就不用64字节大小
#define ENDP2_RXADDR        (0x120)

/* EP3  */
/* tx buffer base address */
#define ENDP3_TXADDR        (0x160) 

/* EP4  */
/* tx buffer base address */
#define ENDP4_TXADDR        (0x170) //因为EP3实际没有数据通信,所以就不用64字节大小了
#define ENDP4_RXADDR        (0x1B0) //最后一个地址 +64 应该小于0x200,否则接收数据有问题

修改完这个后,接解决了USB多路虚拟串口乱码的问题。

感谢该文档的介绍:

STM32F103 USB Packet Buffer 512:STM32F103 USB包缓冲区512 - 豆丁网

 over!

Vue和Vue-Element-Admin(六):集成中的CORS(跨域资源共享)问题 在vue-element-admin登录集成时候碰到跨域资源共享问题,CORS(Cross-origin resource sharing)是浏览器的技术规范,浏览器可以发起跨域请求但Javascript脚本不能,传统的ajax只能获取在同域名下的资源,但Html5允许ajax发起跨域请求,解决方案有:JSONP、Flash、IFrame、CORS。 一、CORS(跨域资源共享)问题 针对vue-element-admin的登录模块的后端接口完成后,前端调用时候出现报错,因为前端的端口是9527而后. 阅读详情

相关推荐

基于Python实现基于遥感指数的水体提取

基于Python实现基于遥感指数的水体提取

gis收藏家的博客 6148

STM32 USB endpoint 地址设置说明

STM32 USB endpoint 地址设置说明 文章目录STM32 USB endpoint 地址设置说明前言疑问分析结论拓展 前言 ​ 移植STM32 usb功能时发现usb_prop.c文件中usb初始化需要设置usb的endpoint地址,之前使用的时候都是直接使用demo程序,没有细致研究,本次使用STM32的usb是想把与virtual com与Mass storage融合在一起,而这两个应用的endpoint地址不一样,所以了解下具体的设置方法,这里做一个记录。 ​ 文件主要记录问题提

wlcwjy的博客 4691

5G NR PDCCH实战解析:从DCI格式到CORESET配置的完整指南

本文深入解析5G NR PDCCH的实战配置,涵盖DCI格式选择、CORESET配置及Search Space优化等关键内容。基于3GPP R16标准,提供现网部署中的典型问题解决方案,如覆盖边缘失步、多用户调度冲突等,帮助提升控制信令传输效率。特别针对5G NR PDCCH的灵活资源分配和自适应编码机制进行详细探讨。

weixin_29231263的博客 498

老丁带你学USB-解疑1:STM32 USB数据缓冲区疑问

1、STM32USB数据缓冲区疑问 USB不同的应用需要使用到的端点数和端点数据长度各不相同,如果为每个端点都单独规划一个存储区非常浪费。 所以STM32为USB模块提供了共512个字节的存储区,至于如何为每个端点分配使用这512B的空间,就是用户自己的事情了,这样存储区的分配就非常经济灵活。这512B空间的首地址是0x40006000。 你看到的#defineENDP2_R...

dingzj2000的专栏 4525

matlab相机标定_实战 | 相机标定

点击“计算机视觉life”关注,置顶更快接收消息!本文阅读时间约5分钟什么是相机标定?我们为什么需要相机标定?相机标定就是确定相机内参和外参的过程,其结果精度会直接影响视觉系统后续工作的准确性。坐标系相机标定涉及到了四大坐标系,分别为:像素坐标系图像物理坐标系相机坐标系世界坐标系为了进行相机标定,必须已知世界坐标系中足够多的三维空间点坐标,找到这些空间点在图像中投影点的二维图像坐标,并建...

weixin_39747334的博客 765

微磁模拟实战指南:从OOMMF安装到首个3D模型运行

本文详细介绍了OOMMF微磁模拟软件的安装与使用,从环境配置到首个3D模型运行的完整教程。涵盖Windows、Linux和macOS平台的安装避坑指南,以及MIF文件编写、并行计算优化等实战技巧,帮助研究人员快速掌握这一开源工具在磁畴壁运动、磁滞回线等微磁学问题中的应用。

weixin_29294597的博客 153

STM32 USB mutidevice 实现 CDC串口 + Mass内存盘 (二)

为了去掉感叹号需要实现每个端点的功能 首先是 ENDP0 控制端点 这个端点 的功能在 USBprop.c里面 主要是一大把函数指针 这是CDC下的  DEVICE_PROP Device_Property = { Virtual_Com_Port_init, Virtual_Com_Port_Reset, Virtual_Com_Port_S

六月的羽_七月未央 2401

iOS逆向之深入解析Hook的原理方法和安全防护

Hook简介 Hook就是一种改变程序执行流程的一种技术的统称; 一段程序的执行流程是 A --> B --> C,现在我们在 A 和 B 之间插入一段代码或者直接改变 B ,这样程序原有的执行流程就发生了改变。如下图所示: Hook的方式:Method Swizzle,fishhook,Cydia Substrate; Hook原理 一、Method Swizzle 原理 利用OC的Runtime特性,动态去改变SEL(方法编号)和IMP(方法实现)的对应关系,达到OC方法调用流程改变

╰つ栺尖篴夢ゞ 2万+

基于STM32F103的USB学习笔记29 - 虚拟串口之端点

1. 修改EP数量,用到EP0,EP1,EP2,EP3共4个端点 #define EP_NUM (4) 2. 修改端点的PMA分配 /* EP0 */ /* rx/tx buffer base address */ #define ENDP0_RXADDR (0x40) //0x80-0x40 = 0x40 = 64字节 #define ENDP0_TXADDR (0x80) //0xC0 - 0x80 = 0x40 =...

pq的博客 1923

利用恒源云云端GPU高效训练YOLOv11模型全流程:从环境搭建到模型部署,让你摆脱硬件束缚

记住,云端GPU的核心优势是“弹性算力+一键环境”,只要把握好这一工具特性,再结合YOLOv11的高性能模型架构,你也能在计算机视觉领域快速落地项目。接下来,我们从工具准备到模型部署,一步步带你实现高效训练,真正帮你解决资源与效率的核心痛点。凭借其在目标检测、实例分割任务上的卓越性能,成为众多开发者的首选。据统计,使用云端GPU训练YOLOv11,在处理百万级数据集时,训练效率较本地普通GPU提升。在安防监控中,YOLOv11可实时检测人员、车辆异常行为,某园区采用该方案后,异常事件识别准确率达。

LXY_LOVE36的博客 213

【Mode】FDE 求解器工作流程

Lumerical---FDE(Finite Difference Eigenmode) Solver

u011699626的博客 4941

USB -- STM32F103虚拟串口bulk传输讲解(三)

STM32F103USB虚拟串口代码讲解,bulk传输讲解

binhao002的博客 5398

英飞凌Tricore实战系列导读

笔者结合项目应用经验对Tricore MCU的开发及应用经验进一步总结,成人达己,渡己渡人。

initiallizer的博客 3791

STM32关于USB控制端点4的问题

解释如下: #define BTABLE_ADDRESS      (0x00)  //说明端点描述符表从0x00开始 每个端点描述符会占用4个uint32_t型,即16个字节 如果使用到端点4,需要将 #define ENDP0_RXADDR        (0x18) #define ENDP0_TXADDR        (0x58) 改为 #define ENDP0_RXAD

imxiangzi的专栏 2558

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

STM32 USB模块讲解,详细讲解USB库通信过程(二)

今天有空,开贴讲讲,怎样配合ST 提供的库函数理解STM32F103 的USB模块,以及怎么调用这些库函数来实现基本的USB通信。题目很大,先只讲讲最简单的应用。 1 关于512字节的Packet Buffer 在STM32F103的USB模块中有一个RAM 区,称为Packet Buffer,共有512字节。 USB模块中有个Buffer Description Table,这个Table位于512字节的Packet Buffer中,可以在Packet Buffer 的任意位置。 USB模块提供一个寄存

qq_35968965的博客 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

STM32-USB之Buffer Description Table

一. stm32的USB接口每个端点对应两个分组缓冲区,其地址与范围位于分组存储区。 从STM32的数据手册中存储器映像->寄存器组起始地址看到: (注意地址范围大小为1024,APB1按32BIT对齐访问,但此SRAM是由256个16BIT字组成) 这512BYTE的SRAM便是分组存储区;而Buffer Description Table(缓冲区描述表)则用于定位与划分各个端点

wangzibigan的博客 2986

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

STM32USB的枚举过程简介

STM32的USB枚举过程介绍     之前的说明:     文中大量引用网上资料,在文后已给出资料的引用说明。文件涉及到的USB各种传输包各个位的含义以及USB标准设备请求的含义都没有做说明,推荐看《圈圈教你玩USB》里面有详细的说明

mmcly的专栏 1万+

【USB】STM32F103C8单片机上完全用寄存器实现的USB大容量存储设备

本程序的目的是为了演示STM32 USB寄存器的使用方法以及SCSI命令的处理流程,程序只实现了基本的磁盘读写功能。 该USB设备使用了3个端点:ENDP0(Control型端点),EP1_IN和EP1_OUT(Bulk型端点)。 由于时间关系, 下面的无关紧要的功能还没做: SCSI_REQUEST_SENSE命令只实现了返回"磁盘驱动器已弹出"的信息(也就是Table 203 Preferre...

ZLK1214的专栏 7299

基于STM32实现USB复合设备CDC+MSC正确实现方式

看了网上也有相关实现文章,比较HAL原代码框架,无论是odrive里,还是网上其它实现案例,都是通过ep_addr进行switch ,而原代码框架里有USBD_RegisterClassComposite函数,阅读HAL库USB相关代码后,决定以符合原代码框架的姿势打开USB组合设备CDC+MSC

brotherwyz的专栏 9847

STM32 DMA 讲解,关于两个数据宽度,BufferSize,DMA模式使用和注意事项

STM32 DMA 讲解,关于两个数据宽度,BufferSize,DMA模式使用和注意事项,很清晰的喔

qq_63796876的博客 9075

【USB设备设计】--复合设备,双HID高速(64Byte 和 1024Byte)

usb 复合设备开发:双HID高速设备

weixin_38426553的博客 2240

STM32的USB多包数据传送

因为我看到STM32的USB都没有对发送状态进行检测,当多于传送缓冲器的数据要传送时,估计就会出错了,所以找下这篇文章,但没有找到原始作者,但也在此谢过了! STM32的多包数据传送(转贴) SMT32F103,根据例程 Custom_HID 修改,利用 EP1  以 EP_INTERRUPT  的方式发送包, 原来的例程每次发送 2 个字节,现在修改后包的长度不超过 64 字节

* . Benirus的专栏 3578

USB通讯的执行过程 - STM32 USB设计

首先,我们来看看usb的工作过程。   当usb设备接入到主机时,主机开始枚举usb设备,并向usb设备发出指令要求获取usb设备的相关描述信息,其中包括设备描述(device descriptor)、配置描述(configuration descriptor)、接口描述(interface descriptor)、端点描述(endpoint descriptor)等。这些信息是通过端点0(

* . Benirus的专栏 5247

STM32-USB:USB复合设备使用时的一些注意事项

一、注意事项 相关STM32 USB的内容,可以查看一下我之前写的USB系列的文章。本文只讲述一些,本人在USB项目中遇到的一些问题以及解决方案 问题点1:MSC与HID设备复合之后,直接使用USBD_HID_SendReport不能直接发送的原因以及解决方法 在MSC与HID的复合设备执行初始化的时候,会执行对应 USBD_HID_Init 与 USBD_MSC_Init的初始化函数。这些个初始化函数的作用主要是为HID 与 MSC 分配对应类型的操作句柄(如:USBD_HID_Handl..

不吃鱼的猫的博客 2229

stm32 usb 虚拟串口 相同_基于STM32的CDC 串口,复合usb,同时支持3个uart

本文转自阿莫论坛。cdc 串口,复合类型的usb,同时支持3个uart理论上可以改成485接口使用中的,开源。有原理图给有需要的人..........链接:https://pan.baidu.com/s/1Rf5ML-VIiwdq9DEWfENB8A提取码:6qwf注意:STM32的CDC功能比较强大,也比较难理解,基...

weixin_39605521的博客 622
上一篇: 62 stm32 usb自定义hid复合设备修改实验
下一篇: 64 串口测速工具及实验
Chasing_Chasing
博客等级 码龄10年 233粉丝 87原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值