上位机写入测试代码:
- // winusb_demo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
- //
- #include <iostream>
- #include <chrono>
- #include <format>
- #include <thread>
- #include "CWinUSBProxy.h"
- #define BUF_SIZE 1024
- int main()
- {
- std::cout << "Hello AT32!\n";
- CWinUSBProxy winUSBDevice("{13EB360B-BC1E-46CB-AC8B-EF3DA47B4062}");
- winUSBDevice.InitWinUsbDevicePath();
- winUSBDevice.OpenWinUsb();
- winUSBDevice.GetUSBDeviceSpeed();
- winUSBDevice.QueryDeviceEndpoints();
- while (true)
- {
- int readCount = 0;
- auto startTime = std::chrono::steady_clock::now();
- /** 进行数据发包统计,发送1MB数据包,统计速率 */
- for (int i = 0; i < 1024; i++)
- {
- #if 0
- BOOL status = winUSBDevice.ReadFromBulkEndpoint(BUF_SIZE);
- #else
- BOOL status = winUSBDevice.WriteToBulkEndpoint(BUF_SIZE);
- #endif
- /** 正确发包计数 */
- if (status)
- readCount++;
- }
- auto entTime = std::chrono::steady_clock::now();
- /** 计算速率 */
- auto dr_s = std::chrono::duration<double, std::milli>(entTime - startTime).count();
- auto speed = floor(readCount * 1000 / dr_s) ;
- /** 输出统计信息 */
- std::cout << std::format("transter speed:{} KB/S",speed) << std::endl;
- /** 等待1秒 */
- std::this_thread::sleep_for(std::chrono::milliseconds(1000));
- }
-
- system("pause");
- }
MCU代码:
- /**
- **************************************************************************
- * [url=home.php?mod=space&uid=288409]@file[/url] main.c
- * @brief main program
- **************************************************************************
- * Copyright notice & Disclaimer
- *
- * The software Board Support Package (BSP) that is made available to
- * download from Artery official website is the copyrighted work of Artery.
- * Artery authorizes customers to use, copy, and distribute the BSP
- * software and its related documentation for the purpose of design and
- * development in conjunction with Artery microcontrollers. Use of the
- * software is governed by this copyright notice and the following disclaimer.
- *
- * THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
- * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
- * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
- * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
- * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
- *
- **************************************************************************
- */
- #include "at32f402_405_board.h"
- #include "at32f402_405_clock.h"
- #include "usb_conf.h"
- #include "usb_core.h"
- #include "usbd_int.h"
- #include "winusb_class.h"
- #include "winusb_desc.h"
- /** @addtogroup AT32F405_periph_examples
- * @{
- */
- /** @addtogroup 405_USB_device_custom_hid USB_device_custom_hid
- * @{
- */
- /* usb global struct define */
- otg_core_type otg_core_struct;
- #if defined ( __ICCARM__ ) /* iar compiler */
- #pragma data_alignment=4
- #endif
- #define BUF_SIZE 512
- uint8_t usb_buffer[BUF_SIZE];
- void usb_clock48m_select(usb_clk48_s clk_s);
- void usb_gpio_config(void);
- void usb_low_power_wakeup_config(void);
- void button_exint_init(void);
- void init_buffer();
- /**
- * @brief main function.
- * @param none
- * @retval none
- */
- int main(void)
- {
- uint16_t data_len;
- uint8_t send_zero_packet = 0;
-
- nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
- system_clock_config();
- at32_board_init();
- /* usb gpio config */
- usb_gpio_config();
- #ifdef USB_LOW_POWER_WAKUP
- crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE);
- button_exint_init();
- usb_low_power_wakeup_config();
- #endif
- /* enable otg clock */
- crm_periph_clock_enable(OTG_CLOCK, TRUE);
- /* select usb 48m clcok source */
- usb_clock48m_select(USB_CLK_HEXT);
- /* enable otg irq */
- nvic_irq_enable(OTG_IRQ, 0, 0);
-
- /* Initialization buffer */
- init_buffer();
- /* init usb */
- usbd_init(&otg_core_struct,
- USB_HIGH_SPEED_CORE_ID,
- USB_ID,
- &winusb_class_handler,
- &winusb_desc_handler);
-
-
-
- while(1)
- {
- if(usbd_connect_state_get(&otg_core_struct.dev) == USB_CONN_STATE_CONFIGURED)
- {
- #if 0
- usb_winusb_send_data(&otg_core_struct.dev,usb_buffer,BUF_SIZE);
- #else
- uint32_t count = usb_winusb_get_rxdata(&otg_core_struct.dev,usb_buffer);
- //printf("count:%d\r\n",count);
- #endif
- }
- }
- }
测试结果:
这个写入速度15MB/S,这个速度是在注释掉了usb_winusb_get_rxdata里的内存复制过程,代码如下
- /**
- * @brief usb device class rx data process
- * @param udev: to the structure of usbd_core_type
- * @param recv_data: receive buffer
- * @retval receive data len
- */
- uint16_t usb_winusb_get_rxdata(void *udev, uint8_t *recv_data)
- {
- uint16_t i_index = 0;
- uint16_t tmp_len = 0;
- usbd_core_type *pudev = (usbd_core_type *)udev;
- winusb_struct_type *p_winusb = (winusb_struct_type *)pudev->class_handler->pdata;
- if(p_winusb->g_rx_completed == 0)
- {
- return 0;
- }
- p_winusb->g_rx_completed = 0;
- tmp_len = p_winusb->g_rxlen;
- // for(i_index = 0; i_index < p_winusb->g_rxlen; i_index ++)
- // {
- // recv_data[i_index] = p_winusb->g_rx_buff[i_index];
- // }
- usbd_ept_recv(pudev, USBD_WINUSB_BULK_OUT_EPT, p_winusb->g_rx_buff, p_winusb->maxpacket);
- return tmp_len;
- }
开启内存复制,大概速度在8-9MB/S左右。
以上测试结果和官方的测试结果有点出入。总体来说好于官方数据。
|