STM32-USB之Buffer Description Table

发布者:平和思绪最新更新时间:2019-03-24 来源: eefocus关键字:STM32  USB之Buffer  Description  Table 手机看文章 扫描二维码
随时随地手机看文章

一.

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协议要求,最大包长度根据其传输方式及低/全/高速设备是有不同限制的,不能随意更改)。

关键字:STM32  USB之Buffer  Description  Table 引用地址:STM32-USB之Buffer Description Table

上一篇:STM32 F4 从bootloader跳转用户代码遇到的问题
下一篇:STM32 IAP升级遇到的问题总结

推荐阅读最新更新时间:2024-03-16 16:26

STM32小白入门(第五天)-------启动文件、系统时钟
一、启动文件,startup_stm32f40x_41xx.s 1)定义 启动文件由汇编编写,是系统上电复位后第一执行的程序 2)特征 初始化堆栈指针,主要是为C语言提供良好的运行环境 进行复位处理,执行该Reset_Handler函数 初始化中断向量表,中断入口地址列表 配置系统的时钟,调用SystemInit 调用C库函数__main进入main.c中的main函数执行 二、异常向量表 1、8051AT89S51共有5个中断源,2个外部中断、2个定时器中断、1个串口中断。 中断 入口地址 中断号 外部中断0 0003H 0 定时器
[单片机]
<font color='red'>STM32</font>小白入门(第五天)-------启动文件、系统时钟
STM32的ADC实验的原理简介
ADC简介 Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。 STM32的ADC的配置 战舰V3开发板的ADC通道与引脚的对应关系 模拟量输入的范围(ADC正常工作的范围) STM32F103ZET6芯片中的电源部分(VREF与VSSA): 我们看到Vref-连接到了GND,而VREF+通过跳线帽连接到了VDD(VDD连接到了开发板的3.3V供电电源上),因此我们的DAC通道正常工作的模拟量输入范围为(2.4V,3.3V)。 ADC工作逻辑图解析(以ADC通道1为例) ADC中断的三种类型 注入
[单片机]
<font color='red'>STM32</font>的ADC实验的原理简介
基于STM32设计的掌上游戏机详细开发过程
一、环境与硬件介绍 开发环境:keil5 代码风格: 寄存器风格,没有采用库函数,底层代码全部寄存器方式编写,运行效率高,注释清楚。 MCU型号: STM32F103ZET6 开发板: 正常的一块STM32开发板,带LCD插槽,带4颗独立按键。 游戏模拟器: NES游戏模拟器 LCD : ALIENTEK的3.5寸屏幕。(屏幕型号不重要,随便一款都可以的,把屏幕底层驱动代码写好,适配即可) 声音输出设备 : 采用VS1053 (SPI接口,操作方便) 游戏手柄: 支持FC游戏手柄 完成这个掌上游戏机需要使用的硬件设备不复杂,如果想要体验游戏,需要的必备硬件: 1. (必要)STM32F103系列最小系统版一个 2. (必要)L
[单片机]
基于<font color='red'>STM32</font>设计的掌上游戏机详细开发过程
STM32基础6--基本定时器
STM32F407中有基本定时器,通用寄存器,高级寄存器。其中TIM6与TIM7是基本定时器。 基本定时器框图 在基本定时器中,内部时钟(CK_INT)经过控制器到达预分频器(PSC),经过分频后进入计数器(CNT COUNTER)。当计数值与自动重装寄存器的值一样,触发自重重装重新计数,同时可以触发中断 、DMA输出与事件。 设置定时时间 基本定时器是16位的定时器。预分频的值是16位,自动重装寄存器也是16位,也就是说这两个寄存器的最大值位65535。在STM32F407中,TIM6与TIM7都挂在APB1的Timer Clocks上面,它们的频率最高可以达到84MHz。当我们设置预分频值时,要注意预分频值不能超过65
[单片机]
<font color='red'>STM32</font>基础6--基本定时器
STM32动态更改PWM波频率和占空比
STM32的PWM波动态调频和调占空比 以TIM3_CH1为例 (1)定时器工作原理 定时器的时基单元包含三个部分:①自动装载寄存器(TIMx_ARR),②预分频器寄存器 (TIMx_PSC),③计数器寄存器(TIMx_CNT)。设置自动装载值,预分频器根据所设置的分频系数(1-65536)对定时器所选择的时钟源进行分频,分频后的频率驱动计数器。计算器开始计数,当计数器达到自动装载值时,重新开始计数! 以秒表举例:时钟源是秒针,经过60分频后的频率变成分针,分针一分钟一分钟的增加,当分针数达到60时,又从零开始计数。在这个例子中,秒针是时钟源,第一个60就是预分频器设置的值,第二个60就是自动装载寄存器设置的值。 (2)P
[单片机]
<font color='red'>STM32</font>动态更改PWM波频率和占空比
DS18B20温度模块驱动(STM32
一、前期准备 单片机:STM32F103C8T6 开发环境:MDK5.14 库函数:标准库V3.5 DS18B20模块:淘宝有售 二、实验效果 三、驱动原理 看数据手册。 需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。 四、驱动代码 ds18b20.h #ifndef __DS18B20_H__ #define __DS18B20_H__ #include stm32f10x.h #include gpio.h #include delay.h #define DS18B20_Direction_I {GPIOA- CRL &= 0XFFFFFFF0; GPIOA- CRL |=
[单片机]
DS18B20温度模块驱动(<font color='red'>STM32</font>)
STM32中TIM输出比较的三种模式
此项功能是用来控制一个输出波形,或者指示一段给定的的时间已经到时。 当计数器与捕获/比较寄存器的内容相同时,输出比较功能做如下操作: ● 将输出比较模式(TIMx_CCMRx寄存器中的OCxM位)和输出极性(TIMx_CCER寄存器中的 CCxP位)定义的值输出到对应的引脚上。在比较匹配时,输出引脚可以保持它的电平 (OCxM=000)、被设置成有效电平(OCxM=001)、被设置成无效电平(OCxM=010)或进行翻 转(OCxM=011)。 ● 设置中断状态寄存器中的标志位(TIMx_SR寄存器中的CCxIF位)。 ● 若设置了相应的中断屏蔽(TIMx_DIER寄存器中的CCxIE位),则产生一个中断。 ● 若设置了相应的使能
[单片机]
<font color='red'>STM32</font>中TIM输出比较的三种模式
基于STM32模拟UART串口通信
UART工作原理 UART即通用异步收发器,是一种串行通信方式。数据在传输过程中是通过一位一位地进行传输来实现通信的,串行通信方式具有传输线少,成本底等优点,缺点是速度慢。串行通信分为两种类型:同步通信方式和异步通信方式。 但一般多用异步通信方式,主要因为接受和发送的时钟是可以独立的这样有利于增加发送与接收的灵活性。异步通信是一个字符接着一个字符传输,一个字符的信息由起始位、数据位、奇偶校验位和停止位组成。 每一个字符的传输靠起始位来同步,字符的前面一位是起始位,用下降沿通知收方开始传输,紧接着起始位之后的是数据位,传输时低位在前高位在后,字符本身由5~8位数据位组成。 数据位后面是奇偶校验位,
[单片机]
基于<font color='red'>STM32</font>模拟UART串口通信
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved