STM32 USB学习笔记9

2023-10-30

主机环境:Windows 7 SP1

开发环境:MDK5.14

目标板:STM32F103C8T6

开发库:STM32F1Cube库和STM32_USB_Device_Library

现在我们来分析VCP例程的最后一个文件USB设备类的usbd_cdc文件,该文件跟CDC类紧密相关,看下其头文件的一些定义:

/** @defgroup usbd_cdc_Exported_Defines
  * @{
  */ 
#define CDC_IN_EP                                   0x81  /* EP1 for data IN */
#define CDC_OUT_EP                                  0x01  /* EP1 for data OUT */
#define CDC_CMD_EP                                  0x82  /* EP2 for CDC commands */

/* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */
#define CDC_DATA_HS_MAX_PACKET_SIZE                 512  /* Endpoint IN & OUT Packet size */
#define CDC_DATA_FS_MAX_PACKET_SIZE                 64  /* Endpoint IN & OUT Packet size */
#define CDC_CMD_PACKET_SIZE                         8  /* Control Endpoint Packet size */ 

#define USB_CDC_CONFIG_DESC_SIZ                     67
#define CDC_DATA_HS_IN_PACKET_SIZE                  CDC_DATA_HS_MAX_PACKET_SIZE
#define CDC_DATA_HS_OUT_PACKET_SIZE                 CDC_DATA_HS_MAX_PACKET_SIZE

#define CDC_DATA_FS_IN_PACKET_SIZE                  CDC_DATA_FS_MAX_PACKET_SIZE
#define CDC_DATA_FS_OUT_PACKET_SIZE                 CDC_DATA_FS_MAX_PACKET_SIZE
这些宏定义指明了CDC类使用的端点,以及最大包大小,对于STM32F103C8T6来说最大包大小是是64字节,其中命令控制端点最大包大小为8字节。在头文件中还有一个CDC类的结构声明,如下:

typedef struct
{
  uint32_t data[CDC_DATA_HS_MAX_PACKET_SIZE/4];      /* Force 32bits alignment */
  uint8_t  CmdOpCode;
  uint8_t  CmdLength;    
  uint8_t  *RxBuffer;  
  uint8_t  *TxBuffer;   
  uint32_t RxLength;
  uint32_t TxLength;    
  
  __IO uint32_t TxState;     
  __IO uint32_t RxState;    
}
USBD_CDC_HandleTypeDef; 
该句柄管理着CDC类的数据信息,接着我们来查看usbd_cdc.c文件,该文件需要配合CDC1.20以及PSTN1.20协议文档来查看,在usbd_cdc,c中有我们CDC类的具体实现,如下:

/* CDC interface class callbacks structure */
USBD_ClassTypeDef  USBD_CDC = 
{
  USBD_CDC_Init,
  USBD_CDC_DeInit,
  USBD_CDC_Setup,
  NULL,                 /* EP0_TxSent, */
  USBD_CDC_EP0_RxReady,
  USBD_CDC_DataIn,
  USBD_CDC_DataOut,
  NULL,
  NULL,
  NULL,     
  USBD_CDC_GetHSCfgDesc,  
  USBD_CDC_GetFSCfgDesc,    
  USBD_CDC_GetOtherSpeedCfgDesc, 
  USBD_CDC_GetDeviceQualifierDescriptor,
};
其中EP0_TxSent、SOF、IsoINIncomplete、ISOOUTIncomplete为空。该文件中函数比较多,先从简单的分析,首先看下注册接口的函数,如下:

/**
* @brief  USBD_CDC_RegisterInterface
  * @param  pdev: device instance
  * @param  fops: CD  Interface callback
  * @retval status
  */
uint8_t  USBD_CDC_RegisterInterface  (USBD_HandleTypeDef   *pdev, 
                                      USBD_CDC_ItfTypeDef *fops)
{
  uint8_t  ret = USBD_FAIL;
  
  if(fops != NULL)
  {
    pdev->pUserData= fops;
    ret = USBD_OK;    
  }
  
  return ret;
}
注册接口很简单,即把CDC接口指针链接到USB句柄中的UserData即可。接着是在CDC接口文件中提到的两个设置缓存区的函数,如下:

/**
  * @brief  USBD_CDC_SetTxBuffer
  * @param  pdev: device instance
  * @param  pbuff: Tx Buffer
  * @retval status
  */
uint8_t  USBD_CDC_SetTxBuffer  (USBD_HandleTypeDef   *pdev,
                                uint8_t  *pbuff,
                                uint16_t length)
{
  USBD_CDC_HandleTypeDef   *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData;
  
  hcdc->TxBuffer = pbuff;
  hcdc->TxLength = length;  
  
  return USBD_OK;  
}


/**
  * @brief  USBD_CDC_SetRxBuffer
  * @param  pdev: device instance
  * @param  pbuff: Rx Buffer
  * @retval status
  */
uint8_t  USBD_CDC_SetRxBuffer  (USBD_HandleTypeDef   *pdev,
                                   uint8_t  *pbuff)
{
  USBD_CDC_HandleTypeDef   *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData;
  
  hcdc->RxBuffer = pbuff;
  
  return USBD_OK;
}
给CDC句柄的相应字段赋值即可。再有两个是CDC接口文件中提到的数据发送和接收函数,如下:

/**
  * @brief  USBD_CDC_DataOut
  *         Data received on non-control Out endpoint
  * @param  pdev: device instance
  * @param  epnum: endpoint number
  * @retval status
  */
uint8_t  USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev)
{      
  USBD_CDC_HandleTypeDef   *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData;
  
  if(pdev->pClassData != NULL)
  {
    if(hcdc->TxState == 0)
    {
      /* Tx Transfer in progress */
      hcdc->TxState = 1;
      
      /* Transmit next packet */
      USBD_LL_Transmit(pdev,
                       CDC_IN_EP,
                       hcdc->TxBuffer,
                       hcdc->TxLength);
      
      return USBD_OK;
    }
    else
    {
      return USBD_BUSY;
    }
  }
  else
  {
    return USBD_FAIL;
  }
}


/**
  * @brief  USBD_CDC_ReceivePacket
  *         prepare OUT Endpoint for reception
  * @param  pdev: device instance
  * @retval status
  */
uint8_t  USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev)
{      
  USBD_CDC_HandleTypeDef   *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pCl
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 USB学习笔记9 的相关文章

  • 在Windows10上安装虚拟机---VMware 17 Pro下载与安装

    在Windows10上安装虚拟机 VMware下载与安装 0 前言 1 下载VMware 17 pro 2 安装VMware 17 Pro 3 打开Vmware 0 前言 电脑原生系统 Windows10 虚拟机软件 VMware 17 p
  • ORACLE随机查询

    1 select from select from tablename order by dbms random value where rownum lt N 注 dbms random是一个可以生成随机数值或者字符串的程序包 value
  • 训练模型的3种方法

    公众号后台回复关键字 Pytorch 获取项目github地址 Pytorch没有官方的高阶API 一般通过nn Module来构建模型并编写自定义训练循环 为了更加方便地训练模型 作者编写了仿keras的Pytorch模型接口 torch
  • STM8普通定时器中断使用寄存器版本

    本文章只讲如何使用STM8的普通定时器 原理以及其他知识点可以网上查阅相关的资料 废话不多说 直奔主题 第一步 了解TIM4的时钟来源 查阅书册可以知道TIM4的时钟来源系统的主时钟 第二步 初始化相关寄存器 从ST官方手册可以知道 TIM
  • Spring Boot的文件上传

    Spring Boot的文件上传并不需要单独进行 当前端进行请求时 所要上传的文件作为请求的一个参数即可 与其他类型参数相同 服务端接收时 只需要对这个文件参数使用MultipartFile类型接收即可 由于文件上传的参数无法直接拼接到UR

随机推荐

  • unplugin-vue-components/vite自动将项目中使用的 Vue 组件按需引入

    unplugin vue components 是一个 Vite 插件 它可以自动将项目中使用的 Vue 组件自动按需引入 以减小打包体积 它的使用方式如下 安装插件 npm install D unplugin vue component
  • 上拉和下拉的解释

    1 什么是上下拉电阻 上拉电阻 把一个不确定的信号通过电阻连接到高电平 是电信号初始化为高电平 下拉电阻 把一个不确定的信号通过电阻连接到地 使电信号初始为低电平 本质 上拉是对器件注入电流 下拉是输出电流 2 上下拉电阻接线方法 上拉电阻
  • Kafka 消费者“group_name”组正在永远重新平衡

    目录 一 场景 1 1 场景应用环境 1 2 问题重现 二 问题分析 三 解决方案 一 场景 1 1 场景应用环境 卡夫卡 2 11 1 0 1 主题 并发度为 5 且分区为 5 1 2 问题重现 当应用程序重新启动并且在分区分配之前在主题
  • MySQL获取分组中的第一条数据和最后一条数据

    mysql 8 WITH ranked messages AS SELECT m ROW NUMBER OVER PARTITION BY name ORDER BY id DESC AS rn FROM messages AS m SEL
  • 《C++11标准库》4.2头文件( Header File)

    在C 标准化过程中 将C 标准库中所有的标识符都定义于 namespace std 内 这样的作法不具备向后兼容性 因为原先的C C 头文件都将C 标准库的标识符定义于全局范围 标准化过程中有些 class 接口也有了变动 为此 C sta
  • vscode 变量命名插件_10款VS Code插件神器,第7款超级实用!

    VS Code是这两年非常热门的一款开发工具 它不仅有提升开发体验的界面 轻量化的编辑器 还有丰富而强大的插件 这些优秀的插件使得VS Code生态体系更加吸引人 让开发效率大大提升 本文来介绍10款高效的VS Code插件 总有一款能够惊
  • iOS 使用“./compile-ffmpeg.sh all”编译 ijkplayer 报错“C compiler test failed.

    原因 compile ffmpeg sh 脚本找不到 Xcode 解决方案 compile ffmpeg sh clean sudo usr bin xcode select switch Applications Xcode app Co
  • 微信小程序相关面试题

    微信小程序相关面试题 1 请谈谈wxml与标准的html的异同 2 请谈谈WXSS和CSS的异同 3 请谈谈微信小程序主要目录和文件的作用 4 请谈谈小程序的双向绑定和vue的异同 5 简单描述下微信小程序的相关文件类型 6 微信小程序有哪
  • 未竟的Web 3.0理想,DID或打开关键入口

    寄托往往意味着断送 维克多 雨果 悲惨世界 里的经典之言正是Web2 0时代的写照 近期 B站 答题领卡兑换大会员 活动被网友指出涉嫌出卖用户个人隐私 虽然B站回应称 该页面系文案措辞不妥引起误会 目前已下线该页面并整改 但风波并没有止息
  • 未预期的符号 `then’ 附近有语法错误加粗样式

    未预期的符号 then 附近有语法错误加粗样式 编写shell脚本执行时发生如下报错 后经分析 错误原因是因为if后面没有加空格 加入空格之后则不再存在语法错误 修改后脚本截图
  • 重启人生1.0-day1:704. 二分查找;27. 移除元素

    数组理论基础 704 二分查找 左闭右闭区间 left right size len nums left 0 right size 1 while left lt right 当left right的时候 循环区间是个合法区间 middle
  • dataguard-(ORA-16004/ORA-01196/ORA-01110)

    author skatetime 2009 08 01 1 故障现象 一次突然断电导致我的standby open时报如下的错误 ORA 16004 备份数据库需要恢复ORA 01196 文件 1 由于介质恢复会话失败而不一致ORA 011
  • Unity Text 透明

    Unity Text透明化问题 Shader UI TextBlend Properties HideInInspector MainTex Texture 2D white HideInInspector BlendTex Blend T
  • 集度汽车(武汉java)一面

    hashMap底层结构 hash算法的好处是什么 为什么采用数组加链表 数组有哪些特性 内存地址连续 查找快 怎么解决哈希碰撞 链地址法 并发编程需要注意哪些地方 如何处理变量的线程安全 sycronized关键字原理 分布式锁实现方式 有
  • 华子这题确实不错!

    我们来看一下这道题目到底哪里不错 题目描述 小王在进行游戏大闯关 有一个关卡需要输入一个密码才能通过 密码获得的条件如下 在一个密码本中 每一页都有一个由 26 个小写字母组成的若干位密码 从它的末尾开始依次去掉一位得到的新密码也在密码本中
  • 小程序从后台切到前台首页刷新机制 (Banner图 )

    问题 后台 banner 图 更新后 小程序首页不会自动更新 注明 这里只针对首页 其他页进入 onload即可 解决方案一 直接在page页面 每次onShow 都执行 解决方案二 app js 文件 app js App onLaunc
  • MongoDB报错:org.springframework.data.mongodb.UncategorizedMongoDbException: Exception authenticating

    org springframework data mongodb UncategorizedMongoDbException Exception authenticating MongoCredential Caused by com mo
  • Me and My Girlfriend靶机实验

    目录 靶机描述 准备 信息收集 一键三连IP 端口 目录扫描 ip 端口扫描 目录扫描 需要用到kali中的dirsearch 漏洞分析 渗透攻击 提权 这里我们可以尝试使用漏洞检查脚本 靶机的下载地址 Me and My Girlfrie
  • Ubuntu 18.04 镜像下载

    打开 官网 点击 下载 点击 Ubuntu桌面系统 点击 其他下载 鼠标滑到最下方 点击 Ubuntu 18 04 6 桌面版 64位 点击 保存
  • STM32 USB学习笔记9

    主机环境 Windows 7 SP1 开发环境 MDK5 14 目标板 STM32F103C8T6 开发库 STM32F1Cube库和STM32 USB Device Library 现在我们来分析VCP例程的最后一个文件USB设备类的us