目录

银杏科技有限公司旗下技术文档发布平台
技术支持电话0379-69926675-801
技术支持邮件Gingko@vip.163.com
版本 日期 作者 修改内容
V1.0 2020-07-04 gingko 初次建立

实验十五:USB_CDC实验——高速数据传输

一、 实验目的与意义

  1. 了解STM32 USB结构。
  2. 了解STM32 USB特征。
  3. 掌握USB的使用方法。
  4. 掌握USB CDC类。
  5. 掌握KEIL MDK 集成开发环境使用方法。

二、 实验设备及平台

  1. iCore4 双核心板点击购买
  2. JLINK(或相同功能)仿真器点击购买
  3. Micro USB线缆。
  4. Keil MDK 开发平台。
  5. 装有WIN XP(及更高版本)系统的计算机。

三、 实验原理

1、USB CDC简介

2、CDC类软件框架

3、原理图

四、 实验程序

1、主函数

int main(void)
{
    int i;
    static unsigned char data_number = 0;
    system_clock.initialize();//系统时钟初始化
    led.initialize();         //LED初始化
 
    USBD_Init(&USB_OTG_dev,
        USB_OTG_HS_CORE_ID,
        &USR_desc,
        &USBD_CDC_cb,
        &USR_cb);
    while(State==0);
    LED_GREEN_ON;
    while(1)
    {
        //接受数据并处理
        if(USB_ReceivedCount > 0){
            LED_RED_ON; 
            USB_ReceivedCount = 0;
            //重复发送次数
            data_number = USB_Rx_Buffer[0];
            //发送图片
            do{
                USB_StatusDataSended = 0;
                DCD_EP_Tx(&USB_OTG_dev,CDC_IN_EP,gImage_flower,sizeof(gImage_flower));
                while(USB_StatusDataSended == 0){
                    for(i = 0;i < 10000;i++);
                }
                data_number--;
            }while(data_number > 0);
            LED_RED_OFF;
        }
    }    
}
 

2、USB初始化

/* 初始化设备堆栈并加载类驱动程序 */
void USBD_Init(USB_OTG_CORE_HANDLE *pdev,
               USB_OTG_CORE_ID_TypeDef coreID,
               USBD_DEVICE *pDevice,                  
               USBD_Class_cb_TypeDef *class_cb, 
               USBD_Usr_cb_TypeDef *usr_cb)
  {
  /* 硬件初始化 */
  USB_OTG_BSP_Init(pdev);  
  USBD_DeInit(pdev);
  /*寄存器类和用户回调 */
  pdev->dev.class_cb = class_cb;
  pdev->dev.usr_cb = usr_cb;  
  pdev->dev.usr_device = pDevice;    
  /* 设置USB OTG核心参数 */
  DCD_Init(pdev , coreID);
  /* 在初始化调用用户回调时 */
  pdev->dev.usr_cb->Init();
  /*使能中断*/
  USB_OTG_BSP_EnableInterrupt(pdev);
}

3、发送数据

/**
* @brief通过USB传输数据
* @param pdev:设备实例
* @param ep_addr:端点地址
* @param pbuf:指向Tx缓冲区的指针
* @param buf_len:数据长度
* @retval:状态
*/
uint32_t  DCD_EP_Tx ( USB_OTG_CORE_HANDLE *pdev,
                     uint8_t   ep_addr,
                     uint8_t   *pbuf,
                     uint32_t   buf_len)
{
  USB_OTG_EP *ep;
  ep = &pdev->dev.in_ep[ep_addr & 0x7F];
  /* 设置并开始传输 */
  ep->is_in = 1;
  ep->num = ep_addr & 0x7F;  
  ep->xfer_buff = pbuf;
  ep->dma_addr = (uint32_t)pbuf;  
  ep->xfer_count = 0;
  ep->xfer_len  = buf_len;
  if ( ep->num == 0 )
  {
    USB_OTG_EP0StartXfer(pdev , ep);
  }
  else
  {
    USB_OTG_EPStartXfer(pdev, ep );
  }
  return 0;
}

五、 实验步骤

  1. 把仿真器与iCore4的SWD调试口相连(直接相连或者通过转接器相连);
  2. 将跳线帽插在USB OTG。
  3. 把iCore4(USB OTG)通过Micro USB线与计算机相连,为iCore4供电;
  4. 安装USB CDC驱动,驱动安装方法参考例程包中安装方法文档。
  5. 打开Keil MDK开发环境,并打开本实验工程;
  6. 烧写程序到iCore4上;
  7. 打开上位机软件usb.exe,点击打开,测试按钮即可测试。(如果该软件没能正常启动,则重新安装驱动)
  8. 也可以进入Debug模式,单步运行或设置断点验证程序逻辑。

六、 实验现象