USB -- STM32F103缓冲区描述表及USB数据存放位置讲解(续)

目录

链接快速定位

前沿

1 0x40005C00和0x40006000地址的区别和联系

2 USB_BTABLE寄存器介绍

3 USB缓冲区描述表(SRAM)介绍

3.1 发送缓冲区地址寄存器n(n=[0..7])

3.2 发送数据字节数寄存器n(n=[0..7])

3.3 接收缓冲区地址寄存器n(n=[0..7])

3.4 接收数据字节数寄存器n(n=[0..7])

3.5 地址偏移和USB本地地址的联系

4 应用举例

5 512Byte SRAM讲解


链接快速定位

USB -- 初识USB协议(一)

源码下载请参考链接:USB -- STM32-FS-USB-Device驱动代码简述(二)

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

USB -- STM32F103自定义HID设备及HID上位机中断传输讲解(四)

USB -- STM32F103 U盘(MassStorage)SDIO接口SCSI协议Bulk传输讲解(五)

USB -- STM32F103 USB DFU设备固件升级(IAP)控制传输讲解(六)

USB -- STM32F103 USB AUDIO(音频)Speak同步传输(Out传输)讲解(七)

USB -- STM32F103 USB AUDIO(音频)Microphone同步传输(In传输)讲解(八)

USB -- STM32F103 USB VIDEO(视频)Camera同步传输讲解(九)

USB -- STM32F103复合设备(HID+MassStorage)传输讲解(十)

前沿

我们在查看用户手册的时候,会发现USB的寄存器地址有两块,一块是0x40005C00 - 0x40005FFF,一块是0x40006000 - 0x400063FF,本章为大家讲解这两个寄存器地址有什么区别和联系。

1 0x40005C00和0x40006000地址的区别和联系

0x40005C00是USB寄存器的基地址,所有其他USB寄存器会相对于基地址有所偏移。

0x40006000是USB的SRAM的地址(可以理解为0x40006000地址处挂了一块512Byte的SRAM),也叫缓冲区描述表,此地址存放USB的数据信息,包括端点数据的相对地址、端点数据长度以及端点的数据。

因此0x40005C00和0x40006000地址没有必然的联系,只是0x40005C00是USB寄存器的基地址,0x40006000是存放USB数据是SRAM的起始地址

接下来重点讲解0x40006000这块RAM。

2 USB_BTABLE寄存器介绍

我们查看USB的用户手册的时候,会看到USB_BTABLE寄存器,该寄存器的目的是相对于0x40006000(SRAM)地址的偏移,默认不偏移。

举个例子,如果该寄存器的值为0x100,那么SRAM的起始地址就变成了0x40006200了(供应用程序使用的分组缓冲区地址需要乘以2才能得到缓冲区在微控制器中的真正地址),USB的数据就从0x40006200开始存储。一般情况下,这个值保持为0。

3 USB缓冲区描述表(SRAM)介绍

虽然缓冲区描述表位于分组缓冲区内,但仍可将它看作是特殊的寄存器,用以配置USB模块和微控制器内核共享的分组缓冲区的地址和大小。由于APB1总线按32位寻址,所以所有的分组缓冲区地址都使用32位对齐的地址,而不是USB_BTABLE寄存器和缓冲区描述表所使用的地址。 以下介绍两种地址表示方式:一种是应用程序访问分组缓冲区时使用的,另一种是相对于USB模块的本地地址。供应用程序使用的分组缓冲区地址需要乘以2才能得到缓冲区在微控制器中的真正地址。分组缓冲区的首地址为0x4000 6000。下面将描述与USB_EPnR寄存器相关的缓冲区描述表。

缓冲区描述表分为:

  • 发送缓冲区地址寄存器n(n=[0..7])
  • 发送数据字节数寄存器n(n=[0..7])
  • 接收缓冲区地址寄存器n(n=[0..7])
  • 接收数据字节数寄存器n(n=[0..7])

下图是一张缓冲区描述表的数据存放位置示意图,从表中可知,端点的发送缓冲区地址寄存器、发送数据字节数寄存器、接收缓冲区地址寄存器和接收数据字节数寄存器依次从0x40006000地址往上存储。

排完了发送缓冲区地址寄存器、发送数据字节数寄存器、接收缓冲区地址寄存器和接收数据字节数寄存器的地址之后,地址所存的数据又在哪里查看呢,我们接着往下面看。

3.1 发送缓冲区地址寄存器n(n=[0..7])

发送缓冲区地址寄存器就是存放发送数据的地址,比如此地址为0x20,那么我们就能够在0x40006000+0x20*2=0x40006040地址处填写发送的数据。

3.2 发送数据字节数寄存器n(n=[0..7])

也就是要发送的字节数,最大为1023个字节,但是我们的SRAM最大为512byte,还要去掉前面几个已使用的字节(存放数据地址和数据字节数),最多就只支持400多个字节,所以这里的1023字节需要根据SRAM的实际情况所决定。

3.3 接收缓冲区地址寄存器n(n=[0..7])

接收缓冲区地址寄存器就是存放接收数据的地址,比如此地址为0x20,那么我们就能够在0x40006000+0x20*2=0x40006040地址处读取USB接收到的数据。

3.4 接收数据字节数寄存器n(n=[0..7])

接收数据字节寄存器根据表161具体配置最大能够接收的数据的长度,如果超过此长度,USB模块将忽略超过的数据。

3.5 地址偏移和USB本地地址的联系

这里对地址偏移USB本地地址做一个个人的理解,如果我们只是应用编程,我们完全不需要关心USB本地地址我们只需要关注地址偏移

这四个寄存器都只使用了16bit的数据,按照传统来说,地址偏移应该是(BTABLE=0,并且认为只有一个端点):

  • 发送缓冲区地址寄存器地址=0x40006000
  • 发送数据字节数寄存器地址=0x40006002
  • 接收缓冲区地址寄存器地址=0x40006004
  • 接收数据字节数寄存器地址=0x40006006

这就是USB本地地址

但是考虑这个MCU是一个32位寻址的MCU,所以需要做32位对齐,所以地址偏移变成了(BTABLE=0,并且认为只有一个端点):

  • 发送缓冲区地址寄存器地址=0x40006000
  • 发送数据字节数寄存器地址=0x40006004
  • 接收缓冲区地址寄存器地址=0x40006008
  • 接收数据字节数寄存器地址=0x4000600C

这就是地址偏移

4 应用举例

这里我们使用官方自带的USB虚拟串口例程进行讲解,不知道怎么下载和使用的读者可以参看博主的以下博客:

USB -- STM32-FS-USB-Device驱动代码简述(二)

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

下载好程序,进入调试模式,查看定义的发送缓冲区地址寄存器0的值是0x80,定义的接收缓冲区地址寄存器0的值是0x40,发送缓冲区地址寄存器1的值是0xC0,发送缓冲区地址寄存器2的值是0x100,接收缓冲区地址寄存器3的值是0x110。

定义的端点0接收数据字节数寄存器0为0x40,也就是接收64字节的数据,端点3的接收数据字节数寄存器3为0x40,也就是接收64字节的数据。

这里发送11个字节和接收11个字节的数据,查看到发送数据字节寄存器1为0x0B,接收数据字节寄存器3为0x840B,只看0-9位,所以为0x0B。

前面定义了发送和接收缓冲区的地址,截下来我们查看地址的值是否和串口助手的值一致,我们TX的地址为0xC0,RX的地址为0x110,根据手册,我们需要在0x40006000+0xC0*2地址处找到发送数据的起始地址,在0x40006000+0x110*2地址处找到接收数据的起始地址,见下图。

5 512Byte SRAM讲解

有的读者比较细心,发现ST的手册上面说的是USB的SRAM是512Byte的空间,为什么查看《存储器和总线架构》章节的时候,发现地址空间从0x40006000 - 0x400063FFF,这里是1024Byte,难道是ST的笔误吗,博主查看了最新的ST手册,发现也是这样写的。

经过一番研究,最终发现此SRAM只使用了低16位,此MCU是32位的MCU,如果只是使用低16位,想要达到512Byte,就需要增加一倍的地址空间,所以这里的地址空间才会是0x40006000 - 0x40003FFF。

这个问题同样可以解释以下问题:

我们可以看到ST的官方例程写的ENDP0_RXADDR和ENDP0_TXADDR值分别是0x40和0x80,实际数据的地址分别是0x40006000+0x40*2和0x40006000+0x80*2,这里两个地址相减得到0x40006000+0x80*2-0x40006000+0x40*2=0x80,此时是128个字节,那么就超了64个字节了,这样可能造成地址空间的浪费(端点0最大64字节)。

是否可以改为ENDP0_RXADDR和ENDP0_TXADDR值分别是0x40和0x60,这样0x40006000+0x60*2-0x40006000+0x40*2=0x40,刚好是64字节。其实是不可以这样修改的,因为SRAM使用的是低16位,高16位未使用,如果这里地址空间为0x40,实际可使用的空间为0x20

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FindMy技术用于键盘

键盘是我们生活中不可或缺的输入工具,是人与计算机之间沟通的桥梁,无论是编写文档、浏览网页、玩游戏、或是进行复杂的数据分析,键盘都在其中发挥着关键的作用。此外,键盘还是各种软件的快捷键操作的关键。通过熟练地运用快捷键&a…

SpringBoot+Vue轻松实现考试管理系统

简介 本系统基于 Spring Boot 搭建的方便易用、高颜值的教学管理平台,提供多租户、权限管理、考试、练习、在线学习等功能。主要功能为在线考试、练习、刷题,在线学习。课程内容支持图文、视频,考试类型支持考试、练习、问卷。 源码下载 网…

程序性能优化全能手册

本文聊一个程序员都会关注的问题:性能。 当大家谈到“性能”时,你首先想到的会是什么? 是每次请求需要多长时间才能返回? 是每秒钟能够处理多少次请求? 还是程序的CPU和内存使用率高不高? 这些问题基本上…

专业实习day3、4(路由器做内网访问公网)

专业实习 代码 display ip interface brief 显示当前设备下所有接口IP undo IP地址支持覆盖,但是正常的命令不能覆盖必须undo(删除)掉 un in en 在做配置的过程中,设备系统一般都会出现一些提示或者告警之类的东西,从…

打造私域流量的知识付费小程序saas租户平台

当今信息爆炸的时代,知识管理已经成为了每个人必须面对的问题。然而,市面上的知识付费平台大多数都是通用的,无法满足个性化需求。 因此,明理信息科技提供了一款专属定制的适合个人的知识付费平台。核心产品能力如下:…

【kettle】pdi/data-integration 集成kerberos认证连接hdfs、hive或spark thriftserver

一、背景 kerberos认证是比较底层的认证,掌握好了用起来比较简单。 kettle完成kerberos认证后会存储认证信息在jvm中,之后直接连接hive就可以了无需提供额外的用户信息。 spark thriftserver本质就是通过hive jdbc协议连接并运行spark sql任务。 二、…

第12课 利用openCV检测物体是否运动了

FFmpeg与openCV绝对是绝配。前面我们已经基本熟悉了FFmpeg的工作流程,这一章我们重点来看看openCV。 在前面,我们已经使用openCV打开过摄像头并在MFC中显示图像,但openCV能做的要远超你的想像,比如可以用它来实现人脸检测、车牌识…

服务号怎么改为订阅号

服务号和订阅号有什么区别?服务号转为订阅号有哪些作用?很多小伙伴想把服务号改为订阅号,但是不知道改了之后具体有什么作用,今天跟大家具体讲解一下。首先我们知道服务号一个月只能发四次文章,但是订阅号每天都可以发…

GLTF编辑器设置3D纺织纹理贴图

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 位移贴图是一种纹理映射技术,通过改变顶点的位置来模拟细…

掌握人像抠图的艺术:从工具到技巧,完美处理每一细节

在图像的编辑长河中,抠图仿佛一把神奇的画笔,能从画布中提取出我们想要的每一笔,使之与其他画面完美交融。而人像抠图,作为其分支,对精细度的要求更为严格。这需要我们精心提取出人像,使之边缘清晰、无多余…

函数图像化

函数图像化 在进行模型提取时,往往会需要选择拟合的函数,因此,了解函数的图像对于模型拟合提取有益,以下是常见的一些函数的曲线 1 二次函数 常见的耳二次函数曲线,转换x与y数量级差异仅一个数量级, 2 三…

DragonEnglish:COCA20000+单词+释义

去年的时候接触到了 COCA20000 单词,对这种给单词特定顺序的方式蛮感兴趣的。因为我当时接触的版本只有单词或者单词释义的版本,所以我直接通过各种方式给它搭配了音标例句发音,然后每100个切割成1份,分成了 202 个文件来学习&…

C# visual studio COM创建及调用

1.visual studuio操作 1.1visual Studio创建类库项目ClassLibrary1。 1.1.1ClassLibrary1项目Class1.cs内容如下: using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.T…

加密的手机号如何模糊查询?

1 一次加载到内存 实现这个功能,我们第一个想到的办法可能是:把个人隐私数据一次性加载到内存中缓存起来,然后在内存中先解密,然后在代码中实现模糊搜索的功能。 这样做的好处是:实现起来比较简单,成本非常…

实习记录留存

0.前提 实习结束了我留个档方便以后查看 校内实习玩具_哔哩哔哩_bilibili 不如这个爽 带兄弟们飙车_哔哩哔哩_bilibili

无心剑七绝《未晚斋》

七绝未晚斋 倏忽半世莫伤怀 醉爱夕阳未晚斋 汉韵唐风情不尽 东华曼舞咏云台 2024年1月6日 新韵四开平韵 《未晚斋》这首诗,作者无心剑以其独特的笔触,描绘出了一幅宁静、淡雅的画面。诗中表达了对生活的热爱和对美好时光的珍惜。 首句“倏忽半世莫伤…

2024阿里云域名优惠口令更新了吗?在哪领取?

2024年阿里云域名优惠口令,com域名续费优惠口令“com批量注册更享优惠”,cn域名续费优惠口令“cn注册多个价格更优”,cn域名注册优惠口令“互联网上的中国标识”,阿里云优惠口令是域名专属的优惠码,可用于域名注册、续…

安装Keras用于影像分割

conda create -n tfkeras2024 python3.9.18 activate tfkeras2024 pip install tensorflow-gpu2.9.0 pip install keras pip install scipy pip install ipykernel ipython python -m ipykernel install --name tfkeras2024 删除环境conda remove -n tfkeras2024 --all

java基于ssm框架的博客系统的开发论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

【2023 CSIG垂直领域大模型】大模型时代,如何完成IDP智能文档处理领域的OCR大一统?

目录 一、像素级OCR统一模型:UPOCR1.1、为什么提出UPOCR?1.2、UPOCR是什么?1.2.1、Unified Paradigm 统一范式1.2.2、Unified Architecture统一架构1.2.3、Unified Training Strategy 统一训练策略 1.3、UPOCR效果如何? 二、OCR大一统模型前…