当前位置:首页 > 单片机 > 单片机
[导读]STM32的USB双缓存接收代码其实已经可以在ST提供的USB示例代码中找到,只要稍加修改,就可以得到将近1MB的数据接收性能。虽然Datasheet中说明USB发送也同样可以使用双缓存,但并没有示例代码,由于为了测试性能,自己

STM32的USB双缓存接收代码其实已经可以在ST提供的USB示例代码中找到,只要稍加修改,就可以得到将近1MB的数据接收性能。虽然Datasheet中说明USB发送也同样可以使用双缓存,但并没有示例代码,由于为了测试性能,自己做了一个,测试中没有发现问题,虽然对性能的提升不如在USB接收上实现双缓存那么多。

注意:
FreeUserBuffer的作用是切换当前的USB缓存。

1.接收双缓冲:

EPX_OUT_Callback中,此代码只是在ST的示例程序的基础上稍加修改,并且不是偶写的,而是一个网友测试的:

if(GetENDPOINT(ENDP3) & EP_DTOG_TX)

{
FreeUserBuffer(ENDP3, EP_DBUF_OUT);
pkg_len = GetEPDblBuf0Count(ENDP3);
PMAToUserBufferCopy(buffer_out + count_out, ENDP3_RXADDR0, pkg_len);
}
else
{
FreeUserBuffer(ENDP3, EP_DBUF_OUT);
pkg_len = GetEPDblBuf1Count(ENDP3);
PMAToUserBufferCopy(buffer_out + count_out, ENDP3_RXADDR1, pkg_len);
}


2.发送双缓冲:
发送双缓冲也可以类似的实现,不过代码要比接收双缓冲复杂得多。不过了解原理的话,应该也差不多。
ST的STM32论坛里,也有人提出这个问题:http://www.st.com/mcu/forums-cat-7768-23.html,不过一直都没有人回答。
不过他的代码还有一些问题,或者可以说,他对原理还不够了解。实际代码还要比他的这个复杂。
中断处理代码:

// 有发送程序计算总共的数据表数量(包括ZLP)
// 每次IN中断,则把总共要发送的数据包数量-1

usb_in_numofpackage--;
if(GetENDPOINT(ENDP2) & EP_DTOG_RX)
{
if(usb_in_numofpackage > 0)
{
// enable next package
// FreeUserBuffer的作用是切换当前的缓存
// 如果还有数据包要发送,则切换缓存(数据已经准备好了)
FreeUserBuffer(ENDP2, EP_DBUF_IN);
}
// usb_in_data_remain是需要放入缓存的数据长度
//在USB发送函数中,首先会填充2个缓冲,usb_in_data_remain为总长度-2个缓冲的长度
if(usb_in_data_remain > 0)
{
// 还有数据要发送
if(usb_in_data_remain > VIRTUAL_COM_PORT_DATA_SIZE)
{
len = VIRTUAL_COM_PORT_DATA_SIZE;
}
else
{
len = usb_in_data_remain;
}

//把数据拷贝到空闲的缓冲区中,并且设置长度
UserToPMABufferCopy(buffer_in, ENDP2_TXADDR0, len);
SetEPDblBuf0Count(ENDP2, EP_DBUF_IN, len);
// usb_in_data_remain减去已经放入缓冲区的长度
usb_in_data_remain -= len;
//更新数据指针
buffer_in += len;
}
else
{
// 数据都已放入缓冲,设置空闲缓冲区长度为0
SetEPDblBuf0Count(ENDP2, EP_DBUF_IN, 0);
}
}
else
{
if(usb_in_numofpackage > 0)
{
// enable next package
FreeUserBuffer(ENDP2, EP_DBUF_IN);
}
if(usb_in_data_remain > 0)
{
if(usb_in_data_remain > VIRTUAL_COM_PORT_DATA_SIZE)
{
len = VIRTUAL_COM_PORT_DATA_SIZE;
}
else
{
len = usb_in_data_remain;
}
UserToPMABufferCopy(buffer_in, ENDP2_TXADDR1, len);
SetEPDblBuf1Count(ENDP2, EP_DBUF_IN, len);
usb_in_data_remain -= len;
buffer_in += len;
}
else
{
SetEPDblBuf1Count(ENDP2, EP_DBUF_IN, 0);
}
}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在嵌入式开发中,STM32的时钟系统因其灵活性和复杂性成为开发者关注的焦点。然而,看似简单的时钟配置背后,隐藏着诸多易被忽视的陷阱,轻则导致系统不稳定,重则引发硬件损坏。本文从时钟源选择、PLL配置、总线时钟分配等关键环...

关键字: STM32 时钟系统

在嵌入式系统开发中,STM32系列微控制器的内部温度传感器因其低成本、高集成度特性,广泛应用于设备自检、环境监测等场景。然而,受芯片工艺差异和电源噪声影响,其原始数据存在±1.5℃的固有误差。本文从硬件配置、校准算法、软...

关键字: STM32 温度传感器

在能源效率与智能化需求双重驱动下,AC-DC转换器的数字控制技术正经历从传统模拟方案向全数字架构的深刻变革。基于STM32微控制器的PFM(脉冲频率调制)+PWM(脉冲宽度调制)混合调制策略,结合动态电压调整(Dynam...

关键字: AC-DC STM32

2025年8月13日 – 提供超丰富半导体和电子元器件™的业界知名新品引入 (NPI) 代理商贸泽电子 (Mouser Electronics) 即日起开售Asahi Kasei Microdevices (AKM) 的...

关键字: 数模转换器 USB 无线扬声器

物联网与智能化设备快速普及,供电方式的选择直接影响设备部署的灵活性、成本与可靠性。PoE(以太网供电)与USB供电作为两大主流技术,分别在工业网络、智能家居、消费电子等领域占据关键地位。本文将从设备适配性、传输距离、功率...

关键字: PoE USB

在无线技术的发展历程中,部署的简便性往往是成功的关键。像Wi-Fi、蓝牙和早期的蜂窝技术,只有在集成变得简单、无缝且实惠时,才能实现大规模的应用。而如今,Wi-Fi HaLow——一种专为物联网(IoT)设计的远距离、低...

关键字: 物联网 Wi-Fi USB

2025年8月5日 – 专注于引入新品的全球电子元器件和工业自动化产品授权代理商贸泽电子 (Mouser Electronics)即日起开售Microchip Technology的新款AVR® SD 8位MCU。AVR...

关键字: MCU 工业自动化 USB

随着高解析度音频应用的不断发展和广泛部署,诸如USB与I2S之间等不同专业接口之间的高品质音频转换需求日益增长,由此带来了实现高性能、高实时性与高灵活性的新挑战。为此,边缘AI和智能音频专家XMOS携手其全球首家增值分销...

关键字: SoC USB 处理器

【2025年7月24日, 德国慕尼黑讯】全球功率系统和物联网领域的半导体领导者英飞凌科技股份公司(FSE代码:IFX / OTCQX代码:IFNNY)近日推出新型英飞凌ID Key系列,进一步扩展其通用串行总线(USB)...

关键字: 控制器 USB 非易失性存储器

当前智能家居产品需求不断增长 ,在这一背景下 ,对现有浇花装置缺陷进行了改进 ,设计出基于STM32单片机的全 自动家用浇花机器人。该设计主要由机械结构和控制系统构成 ,机械结构通过麦克纳姆轮底盘与喷洒装置的结合实现机器...

关键字: STM32 麦克纳姆轮 安全可靠 通过性强
关闭