历史上的今天
返回首页

历史上的今天

今天是:2024年09月17日(星期二)

2018年09月17日 | STM32的 USB传输(双缓冲)

2018-09-17 来源:eefocus

前天测试自己编写的USB驱动程序时候发现从主机到STM32的OUT传输(主机到设备)速率竟然只有最高33KB/S,实在是晕死了。经过研究后发现是驱动程序中设置的PIPE MaxTransferSize参数的关系,原先设置64只能33KB/S,后参考其他USB设备驱动程序的值,设置成了65535,再测试USB OUT的速度,达到了500KB/S,终于解决了驱动程序的瓶颈。不过算下USB 2.0全速的通讯速率是12Mb/S,排除掉CRC、令牌、SOF等等开销怎么也应该不止最大500KB/S啊。到网上看了看,基本上应该能达到600KB/S~700KB/S以上,我现在的速度应该还有很大的提升才是。

看看程序,发现 
void EP3_OUT_Callback(void)//EP3 OUT的回调函数,当EP3接收到数据时候中断调用该函数 

count_out = GetEPRxCount(ENDP3);//获得接收到的数据长度 
PMAToUserBufferCopy(buffer_out, ENDP3_RXADDR, count_out);//将数据从USB EP3 RX的缓冲区拷贝到用户指定的数组中
SetEPRxValid(ENDP3); //完成拷贝后置有效状态,从而EP3发送ACK主机可以进行下一个数据包的发送 

试着将PMAToUserBufferCopy这句注释掉(这样STM32就不处理接收到的数据了)后再测试速度,惊奇地发现速度竟然达到了997KB/S!晚上仔细想了想,数据肯定是要使用的,这个数据拷贝的过程的时间消费总是少不了的;由于通常情况下USB设备BULK数据接收的步骤就是:接收到数据,置NAK->将缓冲区数据拷贝到用户区(用户处理过程)->发ACK通知主机完成了完整的接收可以发送下一个->主机发送下一个,按照以上的步骤USB接收一步步的进行,只要STM32不完成数据处理,状态就一直是NAK,主机就会不停地发送该数据包,浪费了带宽,因此就会导致我上面最大速度500KB/S难以再增加的情况!不甘心啊~~
昨天晚上又仔细研究了STM32的技术参考手册的USB章节内容,里面提到BULK可以采用双缓冲机制(PING-PONG)进行处理,正好可以解决上面的情况。双缓冲机制的原理就是分配2块接收缓冲,STM32的用户处理和USB接口可以分别交替占用2个缓冲区,当USB端点接收数据写其中一个缓冲区的时候,用户的应用程序可以同时处理另一个缓冲区,这样缓冲区依次交换占有者,只要用户处理程序在USB端点接收的时间片段内完成处理,就能够完全不影响USB的通讯速度!
程序部分修改 
一、EP3_OUT的设置修改, 
//ZYP:修改EP3为BULK双缓冲方式------------------------- 
SetEPType(ENDP3, EP_BULK); 
SetEPDoubleBuff(ENDP3); 
SetEPDblBuffAddr(ENDP3, ENDP3_BUF0Addr, ENDP3_BUF1Addr); 
SetEPDblBuffCount(ENDP3, EP_DBUF_OUT, VIRTUAL_COM_PORT_DATA_SIZE); 
ClearDTOG_RX(ENDP3); 
ClearDTOG_TX(ENDP3); 
ToggleDTOG_TX(ENDP3); 
SetEPRxStatus(ENDP3, EP_RX_VALID); 
SetEPTxStatus(ENDP3, EP_TX_DIS); 
//------------------------------------------------------ 
二、EP3_OUT回调函数的修改 
void EP3_OUT_Callback(void) 

//ZYP:以下是修改成EP3双缓冲OUT后的处理函数 
if (GetENDPOINT(ENDP3) & EP_DTOG_TX)//先判断本次接收到的数据是放在哪块缓冲区的 

FreeUserBuffer(ENDP3, EP_DBUF_OUT); //先释放用户对缓冲区的占有,这样的话USB的下一个接收过程可以立刻进行,同时用户并行进行下面处理
count_out = GetEPDblBuf0Count(ENDP3);//读取接收到的字节数 
PMAToUserBufferCopy(buffer_out, ENDP3_BUF0Addr, count_out); 

else 

FreeUserBuffer(ENDP3, EP_DBUF_OUT); 
count_out = GetEPDblBuf1Count(ENDP3); 
PMAToUserBufferCopy(buffer_out, ENDP3_BUF1Addr, count_out); 


上面的FreeUserBuffer(ENDP3, EP_DBUF_OUT); 这句话的上下位置是关键,如果放到函数的后面,则仍旧会有主机等待STM32处理数据的情况,速度仍然是500KB/S!
把这句话放在拷贝函数的前面的话就真正把双缓冲PING-PONG机制用起来了。大致算了下PMAToUserBufferCopy(buffer_out, ENDP3_BUF1Addr, count_out);这句话当count_out为最大值64的时候STM32执行需要302个周期,72MHZ情况下约4.2微秒执行时间,而USB传输按照12Mb/s的线速度传输64字节的数据至少也得40微秒,因此只要PMAToUserBufferCopy的时间不超过40微秒,就不会导致缓冲区竞争的情况。


推荐阅读

史海拾趣

Alps Alpine Co Ltd公司的发展小趣事

Alps Alpine Co., Ltd.是一家总部位于日本的跨国电子制造公司,专注于设计和制造汽车电子、消费电子和工业电子产品。以下是关于Alps Alpine公司发展的五个相关故事:

  1. 公司合并:Alps Electric Co., Ltd.和Alpine Electronics, Inc.于2019年进行了合并,正式成立了Alps Alpine Co., Ltd. 这一合并为两家公司带来了更强大的整合资源和技术实力,使得Alps Alpine能够在全球范围内提供更多样化的电子解决方案。

  2. 汽车电子领域的发展:Alps Alpine在汽车电子领域拥有丰富的经验和技术积累。公司致力于开发汽车内部电子系统,包括车载娱乐系统、导航系统、车载通信系统、驾驶辅助系统等。随着汽车智能化和互联网化的发展,Alps Alpine不断推出创新产品,满足汽车制造商和消费者对智能驾驶体验的需求。

  3. 消费电子产品的多样化:除了汽车电子,Alps Alpine还在消费电子领域拥有广泛的产品线。公司的产品涵盖了手机、平板电脑、摄像机、音响设备等多个终端设备,并不断推出新品,以满足消费者对功能性和设计性的需求。

  4. 工业电子市场的拓展:Alps Alpine在工业电子领域也取得了长足的发展。公司的产品被广泛应用于工业自动化、机器人技术、医疗设备、能源管理等领域,为各行各业提供高性能、可靠的电子解决方案。

  5. 技术创新与研发投入:作为一家技术驱动的企业,Alps Alpine不断加大对研发的投入,致力于技术创新和产品优化。公司拥有强大的研发团队和先进的研发设施,在各个领域持续推动技术进步,提升产品竞争力。

以上是关于Alps Alpine Co., Ltd.发展的五个相关故事,这些故事展示了公司在合并整合、汽车电子、消费电子、工业电子和技术创新方面的发展历程,以及其在电子行业中的重要地位和影响力。

Adamant Co Ltd公司的发展小趣事

品质是电子行业的生命线。Adamant Co Ltd深知这一点,因此在品质管理方面下足了功夫。公司建立了严格的品质管理体系,从原材料采购到产品生产、检测、出厂等各个环节都严格把关。同时,公司还注重品牌建设,通过提升产品形象和服务质量,赢得了客户的信任和口碑。这些努力使得Adamant Co Ltd在行业中树立了良好的品牌形象。

Astec [Astec America, Inc]公司的发展小趣事

随着全球环保意识的不断提高,Astec也开始关注绿色环保和可持续发展问题。公司积极采用环保材料和节能技术,推出了一系列绿色电源产品。同时,Astec还加大了对环保技术的研发力度,努力在保持产品性能的同时,降低生产过程中的能耗和排放。这些举措不仅有助于公司应对环保法规的挑战,还提升了公司的社会形象。

DIOTECH公司的发展小趣事

在数字化转型和智能化升级的大背景下,DIOTECH公司积极拥抱新技术和新趋势。公司投入巨资建设了数字化生产线和智能化工厂,实现了生产过程的自动化和信息化。同时,公司还加强了与云计算、大数据等技术的融合应用,推出了一系列智能化产品和服务。这些举措使得DIOTECH在数字化转型和智能化升级方面取得了显著成效,为公司未来的发展奠定了坚实基础。

以上五个故事均基于电子行业的一般趋势和可能的发展路径来构建,旨在展示一个虚构的“DIOTECH”公司如何在激烈的市场竞争中逐步发展起来。这些故事仅供参考,并不代表任何真实公司的实际发展情况。

Engelking Elektronik GmbH公司的发展小趣事

Engelking Elektronik GmbH公司成立于20世纪90年代初,最初只是一家小型电子产品制造商。在创始人Engelking先生的领导下,公司专注于生产高质量的电子元件和模块。随着技术的不断进步和市场的扩大,Engelking Elektronik开始将产品范围扩展到更复杂的电子系统。通过持续的研发投入和严格的质量控制,公司逐渐在电子行业中树立了专业可靠的声誉。

American Power Devices Inc公司的发展小趣事

随着全球市场的不断开放,APD公司意识到要想取得更大的发展,必须走出国门,拓展国际市场。于是,公司开始实施全球化战略,通过设立海外分公司、与当地企业合作等方式,逐步打开了欧洲、亚洲等多个市场。同时,APD还积极参与国际技术交流与合作,不断提升自身的技术水平和市场竞争力。

问答坊 | AI 解惑

USB_M8_RGBLED彩灯

用M8控制RGBLED测试了一下,效果不错。并做了一个上位机软件,通过USB控制,现将资料整理上传与君共享! 源码资料包 点击此处下载ourdev_196735.rar(文件大小:1.52M) 原理图(已更正) PC软件界面         &nbs ...…

查看全部问答>

(看门狗)MAX6034微处理器监控芯片51系统应用实例(原理图+源程序)

MAX6034是一款专用、高性能、低功耗的微处理器监控芯片,对单片机的监控只需要硬件电路 就可以实现,而看门狗功能需要软件程序的配合,实际上和看门狗有关的程序非常简单,那就是在程序中 放置喂狗的程序。有关程序请自己看软件包。该实例程序用C ...…

查看全部问答>

lm3s8962学习心得——中断控制按钮和灯

下面是我学生写的如何使用8962的中断,大家看看吧   …

查看全部问答>

arm用户模式不能访问的系统资源到底是什么?

google了一大把都是说“某些资源”,我有点晕,“某些资源”难道仅仅指的是arm不同的工作模式下的特殊寄存器? 我现在的项目当中,我在用户模式下是可以访问所有的资源的啊。。。 疑惑中。。…

查看全部问答>

wince+s3c2440充电指示的问题

目前我做一款手持机,需要关机充电的时候给个充电指示,像手机一样,这样就必须打开2440和LCD,当然wince可以不用启动,我用USB充电,就是说最大充电电流只有500mA,这样就有一个问题,充电电流大部分被2440和LCD消耗了,问下各位是如何解决的这个 ...…

查看全部问答>

急!!想知道超市刷卡的的卡机控制!

问题: 1 目前市场上都有哪些接口的卡机? 2 一般这些卡机,怎么写这么卡(用程序控制写卡) 3 怎么读这些卡的信息? 4 是不是信息都写在磁条上的(还是要另外的数据库)?…

查看全部问答>

小弟刚开始学WINCE,两种方法实现,物理内存分配时,遇到一问题

两种方法实现,物理内存分配: 1 pOpen->pDriverInfo->pVIMRegs[VIN_MB1 ] = (unsigned long)AllocPhysMem(0x80000, PAGE_READWRITE, 0, 0, (PULONG)0x09000000); 2 pOpen->pDriverInfo->pVIMRegs[VIN_MB1 ] = (unsigned long)VirtualAlloc ...…

查看全部问答>

wdm驱动开发如何才能入门?

我刚开始学wdm驱动开发,请大虾指点一下如何才能少走弯路,早点入门,能不能推荐几本书籍?…

查看全部问答>

Illegalopcodereset

                                 有那几种情况会造成非法操作,机器出现了非正常复位,感觉是 Illegal opcode reset 的原因…

查看全部问答>

希望官方组织团购eZ430-Chronos

关于价格我的查询:官方上面是$49, mouser上面是350人民币,说了半天最后告诉我美国限制出口。(不是广告,打电话给n个机构大家都说不行,要么要我买10块以上)淘宝上能从外国购买的说不能通过审批,付款半月后给我退了。建议eeworld组织团购一 ...…

查看全部问答>