项目场景:
STM32和上位机传统通信方式就是串口,IIC,SPI等。IIC和SPI一般不常用,串口是用的最多的通信方式。然而串口一般用于输出调试信息这种对传输速度没要求的场景,那种大容量数据快速传输的场景,串口显得捉襟见肘。STM32自带USB FS,然而既然都使用USB了,为什么不用USB HS呢?STM32H750VBT6没有内置USB HS PHY,但提供了USB HS的ULPI通信接口,用于连接外置USB PHY。这样就可以使用STM32H750VBT6和外置USB3300搭建起来USB HS的通道。这里不再讲述USB HS的配置过程,只需要在STM32CUBEMX中简单点几下就行,注意时钟配置正确,把internal DMA IP关掉即可。
USB HS通信速度测试
理论上USB HS通信速度能到480Mbps,但是实际上并没有那么多,我利用STM32H750VBT6测试,USB CDC类虚拟串口的通信速度大约在22MB/s,十分够用。利用Python编写的测速脚本数据结果如下。
Python测速代码:
import serial
import time
import serial.tools.list_ports
ports_list = list(serial.tools.list_ports.comports())
if len(ports_list) <= 0:
print("无串口设备。")
else:
print("可用的串口设备如下:")
for comport in ports_list:
print(list(comport)[0], list(comport)[1])
COM_Index = input("想要观察的串口号")
ser = serial.Serial(COM_Index,115200) #打开虚拟串口
temp = 0
count = 0
start_time = 0
while 1:
if count == 0:
start_time = time.time()
com_input = ser.read(2048)
if temp != com_input[1]: #说明是新的数据
count = count+1 #次数加1
temp = com_input[1] #把temp更新到当前的数据,用于判断下一次的新数据
if count == 100000: #接收了100000次数据 就是2K*100K = 200M的数据
end_time = time.time()
run_time = end_time-start_time
count = 0
print("总数据量200M, 总时间为%.2f秒, 数据传输速度为%.2f MB/s" %(run_time,200/run_time))
STM32的下位机USB测速代码:
memset(UserTxBufferHS,i,sizeof(UserTxBufferHS));
CDC_Transmit_HS(UserTxBufferHS,sizeof(UserTxBufferHS)); //发送数据
UserTxBufferHS是usbd_cdc_if.c中自带的,大小为APP_TX_DATA_SIZE,一般就是2048。文章来源:https://www.toymoban.com/news/detail-730837.html
关于数据传输:
不要想着用sscom等串口软件去手动计算USB速度,因为sscom是实时显示串口接收数据的,数据量太大容易导致软件卡死。文章来源地址https://www.toymoban.com/news/detail-730837.html
到了这里,关于STM32与USB3300共同实现USB OTG HS的CDC串口通信速度测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!