USB不同的运用需求运用到的端点数和端点数据长度各不相同,假如为每个端点都独自规划一个存储区十分糟蹋。
所以STM32为USB模块供给了共512个字节的存储区,至于怎么为每个端点分配运用这512B的空间,便是用户自己的工作了,这样存储区的分配就十分经济灵敏。这512B空间的首地址是0x40006000。
你看到的#defineENDP2_RXADDR(0xD8),这个0xD8便是在这512B空间里的偏移地址,阐明端点2收到的数据将放在0x40006000+0xD8*2的地址空间里。至于为什么要×2,是由于这部分存储区是依照2字节拜访的,即每寄存1个字节的数据要占有2个字节的空间。所以这段存储区的地址是从0x40006000到0x400063FF。
至于怎么界说端点2的发送缓冲区,就看你的运用了。你把端点2的承受缓冲区界说在0xd8,假如端点2的接纳数据长度是64个字节,那就要为端点2的接纳保存64个字节,端点2的发送缓冲区就要界说到0xd8+64之后的空间。
即:#defineENDP2_TXADDR(0xD8+64),
当然也能够#defineENDP2_TXADDR(0xD8+100)或是其他。
总归怎么分配这段存储区,完全能够依照你运用的需求来做。
最近研讨了下103VBT6的USB,看了很屡次都看不理解,我开端置疑我的阅览才能了。现有以下几点疑问讨教我们
1.缓冲区描绘表在缓冲区内即0x40006000–0x400063FF。假如我只用端点0,那么端点0的缓冲区描绘表为
ADDR0_TX、COUNT0_TX、ADDR0_RX、COUNT0_RX所对应的地址为0x40006000–0x40006008(USB_BTABLE=0)
现在有两人疑问:
A.0x40006008今后的地址可不能够作缓冲区?
B.假如给ADDR0_TX、COUNT0_TX赋个适宜的值,会不会端点0的缓冲区在0x40006000–0x40006008内,然后掩盖了它的缓冲区描术表?
2.为什么分组缓冲区地址(按字节编址)要乘以2才是缓冲区在MCU的地址,能不能举个比如阐明?
3.0×40006000–0x400063FF等于1024字节,为什么是512字节,是不是后一半没有运用,芯片为103VBT6?假如我有一个端
点用了512字节缓冲区,那么缓冲区就用完了,是不是表明其他端点就没有缓冲区可用了,连缓冲区描绘表都没有空间可分配了
1.A)
假如只运用端点0,0x4000
6010今后的地址能够作缓冲区。留意不是0x4000
6008今后的地址,原因请看下面的2)。
1.B)
假如给ADDR0_TX、COUNT0_TX赋的值不适宜,端点0的缓冲区有或许掩盖缓冲区描绘表,所以请挑选适宜的值,以防止抵触。
2)这是由于分组缓冲区是一个双端口的RAM,CPU一端需求运用32位方法拜访,但USB模块一端运用16位方法拜访。
例如需求从0x40006010开端分配8个字节的缓冲区,则从CPU一端看,需求占用0x40006010、0x40006014、0x40006018和0x4000601C开端的4个字的空间,即CPU端每4个字节的地址空间中,只要2个字节的地址空间对应实践的存储器,而另2个字节的地址空间没有对应就任何物理的存储器。
3)1024字节与512字节的问题,请看上面的阐明。
假如有一个端点用了512字节缓冲区,那么缓冲区就用完了,表明其他端点就没有缓冲区可用了,连缓冲区描绘表都没有空间可分配了。
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/256432.html