历史上的今天
返回首页

历史上的今天

今天是:2025年03月24日(星期一)

正在发生

2019年03月24日 | STM32-USB之Buffer Description Table

2019-03-24 来源:eefocus

一.

stm32的USB接口每个端点对应两个分组缓冲区,其地址与范围位于分组存储区。

从STM32的数据手册中存储器映像->寄存器组起始地址看到:

(注意地址范围大小为1024,APB1按32BIT对齐访问,但此SRAM是由256个16BIT字组成)

这512BYTE的SRAM便是分组存储区;而Buffer Description Table(缓冲区描述表)则用于定位与划分各个端点的缓冲区

缓冲区描述表同样位于分组存储区,其地址偏移由分组缓冲区描述表地址寄存器USB_BTABLE决定。

二.

ST提供了的USB库程序,其中USB复位函数XXX_Reset()包含了缓冲区描述表的建立。

复位代码一般有若干个类似的函数:

SetEPRxAddr(ENDP0, ENDP0_RXADDR);

SetEPTxAddr(ENDP0, ENDP0_TXADDR);

SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);

SetEPTxCount(ENDP2, nReportCnt);


这是设置端点缓冲区描述表某个条目的代码;

逐步分析此类函数

void SetEPRxAddr(u8 bEpNum, u16 wAddr)

{

  _SetEPRxAddr(bEpNum, wAddr);

}

 

#define PMAAddr  (0x40006000L)  /* USB_IP Packet Memory Area base address   */

 

#define _SetEPRxAddr(bEpNum,wAddr) (*_pEPRxAddr(bEpNum) = ((wAddr >> 1) << 1))

 

#define _pEPTxAddr(bEpNum) ((u32 *)((_GetBTABLE()+bEpNum*8  )*2 + PMAAddr))

#define _pEPTxCount(bEpNum) ((u32 *)((_GetBTABLE()+bEpNum*8+2)*2 + PMAAddr))

#define _pEPRxAddr(bEpNum) ((u32 *)((_GetBTABLE()+bEpNum*8+4)*2 + PMAAddr))

#define _pEPRxCount(bEpNum) ((u32 *)((_GetBTABLE()+bEpNum*8+6)*2 + PMAAddr))

上面代码表明,缓冲区描述表位于

分组存储区起始地址+USB_BTABLE

而且会按照固定的顺序放置端点发送缓冲区地址、其大小、端点接收缓冲区地址、其大小及已接受数,端点号由顺序往上;

每个端点4个“寄存器”,共8个端点,一共32个“寄存器”,每个“寄存器”为4个字节,所以这个Table最大占有128字节(按APB1逻辑);

不同的程序所用到的端点不一样,应尽量使用靠前的端点号,因为没必要为高的端点号预留内存;

(此图来源于 STM32中文参考手册 )

三.

在usb_conf.h中,定义了BTABLE与各端点缓冲地址偏移

//usb_conf.h

 

/* buffer table base address */

/* buffer table base address */

#define BTABLE_ADDRESS      (0x00)

 

/* EP0  */

/* rx/tx buffer base address */

#define ENDP0_RXADDR        (0x18)

#define ENDP0_TXADDR        (0x58)

 

/* EP1  */

/* tx buffer base address */

//地址为32位对其,位4的倍数,不能超过 bMaxPacketSize

 

#define ENDP1_RXADDR        (0x98)

#define ENDP1_TXADDR        (0xD8)

可见,前0x18(每个端点需要8字节去描述,3个端点*8=24=0x18)用于缓冲区描述表;

各项地址的间隔为0x40即64,再看看usb_prop.c中的Device_Property结构最后一项正是MAX PACKET SIZE/最大数据包大小,以及DeviceDescriptor 、ConfigDescriptor中的相关定义;

显然,如果想修改此值,需考虑端点缓冲区地址的设定(但按USB2.0协议要求,最大包长度根据其传输方式及低/全/高速设备是有不同限制的,不能随意更改)。

推荐阅读

史海拾趣

Delus Corp公司的发展小趣事

为了降低生产成本、提高生产效率,Delus Corp公司不断优化供应链管理。公司建立了完善的供应链管理系统,实现了从原材料采购、生产制造到产品销售的全程监控和管理。同时,公司还与供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量的可靠性。这些措施的实施,使得公司的运营成本得到了有效降低,生产效率得到了显著提升。

Advantech公司的发展小趣事

为了降低生产成本、提高生产效率,Delus Corp公司不断优化供应链管理。公司建立了完善的供应链管理系统,实现了从原材料采购、生产制造到产品销售的全程监控和管理。同时,公司还与供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量的可靠性。这些措施的实施,使得公司的运营成本得到了有效降低,生产效率得到了显著提升。

ENSIGN公司的发展小趣事

为了拓展国际市场,ENSIGN与韩国Feelux成立合资公司Feelux Shanghai,共同为高端品牌提供更专业的服务。这一举措不仅增强了ENSIGN的品牌影响力,还为公司带来了更多的商业机会。同时,ENSIGN还成为了Coelux的中国区经销商,进一步扩大了其在国际市场的份额。

FCI / Amphenol公司的发展小趣事

1997年,Amphenol公司经历了一次重要的转折点。当时,公司被KKR(一家具有传奇色彩的美国纽约的私人股权投资公司)以杠杆收购的方式收购。KKR的收购为Amphenol公司注入了新的活力,公司开始进行一系列的战略调整和业务转型。在KKR的助力下,Amphenol公司不仅保留了大部分现有的管理团队,还引入了更大的财务杠杆,使得公司能够更加灵活地应对市场变化和挑战。这一收购和转型不仅为Amphenol公司带来了新的发展机遇,也为其在全球连接器市场上的地位奠定了更加坚实的基础。

EPIGAP公司的发展小趣事

随着公司业务的不断拓展,EPIGAP公司意识到单靠自身力量难以应对日益复杂的市场环境。于是,公司开始积极寻求与产业链上下游企业的战略合作。通过与原材料供应商、代工厂商以及终端客户的紧密合作,EPIGAP公司实现了产业链的整合优化,提高了整体运营效率。这一战略不仅降低了公司的运营成本,还增强了公司的市场竞争力。

展恒电子(Broadic)公司的发展小趣事

自2010年起,展恒电子专注于智能仪表行业,凭借其核心技术和横向联合多家关键器件供应商的策略,为水、电、气、热四表市场提供整套解决方案。随着业务的不断拓展,公司逐渐积累了大量的行业知名客户,进一步巩固了其在智能仪表领域的领先地位。同时,公司还积极向新能源、物联网、安防家居等多个领域拓展,以实现业务的多元化发展。

问答坊 | AI 解惑

读《把时间当作朋友》(九):推迟满足感

《把时间当作朋友》原文: 提出“情商”(Emotional Intelligence)概念的美国著名心理学家戈尔曼 (Daniel Goleman)曾做过一个关于“推迟满足”(delaying gratification) 的实验。 找来一批四岁孩子,给他们每人一块糖,并告诉他们若能等 ...…

查看全部问答>

开关控制LED——ARM的Proteus实验

实验原理ARM的P0.1口接按钮,再通过P0.0控制LED的亮、灭。本实验的电路图以及实验均在上一个实验基础之上修改。其中电路图只多了一个开关。 Proteus仿真电路图 实验步骤略(与上一实验相同) C语言源程序/************************************* ...…

查看全部问答>

Crosstar嵌入式学院“利用/proc实现内核与用户空间通信”

Linux内核空间与用户空间的通信可通过\"/proc\"目录的文件读写来实现,如果只是控制内核中的参数而不是传输较多数据的话,用“/proc”是很合适的。另外几种内核与用户空间通信方式方式是:1)对内核设备的读写或IOCTL;2)通过/sys内存文件系统来 ...…

查看全部问答>

LM3S9997 FLASH

大家好.... 我在弄LM3S9997 可是下载不了程序。。  (原文件名:222.jpg)  引用图片下面的资料。可能发现看不问题。。觉得哪里可能有问题就说说吧。。我改的 希望过来人教教我。。还有就是读到了芯片的ID以及ROM的ID ,是不是就说 ...…

查看全部问答>

关于多文件的组织中的define

刚刚看到了我们的辛大斑竹写的一个帖子,我就把我最近看的一个问题贴出来,程序是我的一个学长写的,一般我们在写单片机程序的时候是把不同功能的文件写成一个模块,即.c文件,然后再写出对应的.h文件作出对外的接口和函数申明,当在别人地方需要使 ...…

查看全部问答>

基于MCF52259的RS232串口-CAN转换器的实现

转来一片小论文关于MCF52259的[local]1[/local]…

查看全部问答>

论坛技术请看,反应几个问题

1、关于TI教室中课程,除了第一个有进度其他的看了,没进度,不知道什么原因,希望能给个解释。 [ 本帖最后由 Sur 于 2013-12-3 21:20 编辑 ]…

查看全部问答>

加速度计工作原理

加速度计工作原理>> …

查看全部问答>

【LPC54100】资料整理及软件下载

本帖最后由 770781327 于 2015-2-13 22:28 编辑 首先么,既然有二维码,那就先看看二维码是什么资料呗。 手机扫描二维码 打开 好吧没网。那用电脑试试 好吧,这网址真没啥用。 先去官网找资料吧。 MCU完整型号:LPC54102J512BD64 http:// ...…

查看全部问答>

EEWORLD大学堂----Atmel U系列触摸屏控制芯片悬浮感应和操作演示 (中文版)

Atmel U系列触摸屏控制芯片悬浮感应和操作演示 (中文版):https://training.eeworld.com.cn/course/583…

查看全部问答>