STM32与USB3300共同实现USB OTG HS的CDC串口通信速度测试

项目场景:

  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编写的测速脚本数据结果如下。
STM32与USB3300共同实现USB OTG HS的CDC串口通信速度测试_第1张图片


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。


关于数据传输:

  不要想着用sscom等串口软件去手动计算USB速度,因为sscom是实时显示串口接收数据的,数据量太大容易导致软件卡死。

你可能感兴趣的:(stm32,嵌入式硬件,单片机)