提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、开发板USB硬件
  • 二、STM32CubeMX 设置
    • 1.设置小灯灯和串口
    • 2.开启USB
    • 3.时钟设置
  • 三、KEIL中的代码
    • 1.设置串口,测试
    • 2.设置USB,测试
      • 报文描述符 usbd_custom_hid_if.c
      • 发送数据长度 报文长度 usbd_conf.h
      • 收发数据长度 时间间隔 usbd_customhid.h
      • main.c
  • 四、测试
  • 总结

前言

学习STM32中的USB通信的时候,面对USB中数据帧结构、设备描述符/配置描述符/接口描述符/端点描述符等等的概念,入门即放弃。因此抛开所有,先让开发板的小灯闪起来,一点一点调试、一点一点熟悉、一点一点深入,一点一点理解。LET’S DO。先来玩HID


一、开发板USB硬件

翻到了一块吃灰的STM32F407ZGT6的板子和SCH原理图。
usb Low-Speed -->1.5Mbps(192kB/s)
usb Full-Speed -->12Mbps(1.5MB/s)
支持Full-Speed

二、STM32CubeMX 设置

1.设置小灯灯和串口

DMA 串口传输

2.开启USB

其余参数保持默认

3.时钟设置

导出工程,用KEIL 打开

三、KEIL中的代码

1.设置串口,测试

在main.c 中添加

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define debug(...) {\int len=0;\len=snprintf(debug_buf , 128, __VA_ARGS__);\if(len>0)\{\HAL_UART_Transmit_DMA(&huart1, (uint8_t *)debug_buf, len );\}\
}
/* USER CODE END PD *//* USER CODE BEGIN PV */
char debug_buf[128];
/* USER CODE END PV */
  /* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */debug("Enter main while loop!\r\n");HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);HAL_Delay(500);HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);HAL_Delay(500);}/* USER CODE END 3 */

记得选中,不然可能发现串口无信息输出。

2.设置USB,测试

报文描述符 usbd_custom_hid_if.c

从别人那里照抄

/** Usb HID report descriptor. */
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{/* USER CODE BEGIN 0 */    0x05, 0x8c, // USAGE_PAGE (ST Page) /0x09, 0x01, // USAGE (Demo Kit) /0xa1, 0x01, // COLLECTION (Application) //* 6 */// The Input report0x09,0x03, // USAGE ID - Vendor defined0x15,0x00, // LOGICAL_MINIMUM (0)0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255)0x75,0x08, // REPORT_SIZE (8)0x95,CUSTOM_HID_EPIN_SIZE, //0x95,0x16, REPORT_COUNT (20)0x81,0x02, // INPUT (Data,Var,Abs)//19// The Output report0x09,0x04, // USAGE ID - Vendor defined0x15,0x00, // LOGICAL_MINIMUM (0)0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255)0x75,0x08, // REPORT_SIZE (8)0x95,CUSTOM_HID_EPOUT_SIZE, //0x95,0x16, REPORT_COUNT (20)0x91,0x02, // OUTPUT (Data,Var,Abs)//32/* USER CODE END 0 */0xC0    /*     END_COLLECTION               */
};

发送数据长度 报文长度 usbd_conf.h

/** @defgroup USBD_CONF_Exported_Defines USBD_CONF_Exported_Defines* @brief Defines for configuration of the Usb device.* @{*//*---------- -----------*/
#define USBD_MAX_NUM_INTERFACES     1U
/*---------- -----------*/
#define USBD_MAX_NUM_CONFIGURATION     1U
/*---------- -----------*/
#define USBD_MAX_STR_DESC_SIZ     512U
/*---------- -----------*/
#define USBD_DEBUG_LEVEL     0U
/*---------- -----------*/
#define USBD_LPM_ENABLED     0U
/*---------- -----------*/
#define USBD_SELF_POWERED     1U
/*---------- -----------*/
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE     64U
/*---------- -----------*/
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE     33U
/*---------- -----------*/
#define CUSTOM_HID_FS_BINTERVAL     0x1U/****************************************/

收发数据长度 时间间隔 usbd_customhid.h

/** @defgroup USBD_CUSTOM_HID_Exported_Defines* @{*/
#ifndef CUSTOM_HID_EPIN_ADDR
#define CUSTOM_HID_EPIN_ADDR                         0x81U
#endif /* CUSTOM_HID_EPIN_ADDR */#ifndef CUSTOM_HID_EPIN_SIZE
#define CUSTOM_HID_EPIN_SIZE                         0x40U
#endif /* CUSTOM_HID_EPIN_SIZE */#ifndef CUSTOM_HID_EPOUT_ADDR
#define CUSTOM_HID_EPOUT_ADDR                        0x01U
#endif /* CUSTOM_HID_EPOUT_ADDR */#ifndef CUSTOM_HID_EPOUT_SIZE
#define CUSTOM_HID_EPOUT_SIZE                        0x40U
#endif /* CUSTOM_HID_EPOUT_SIZE*/#define USB_CUSTOM_HID_CONFIG_DESC_SIZ               41U
#define USB_CUSTOM_HID_DESC_SIZ                      9U#ifndef CUSTOM_HID_HS_BINTERVAL
#define CUSTOM_HID_HS_BINTERVAL                      0x05U
#endif /* CUSTOM_HID_HS_BINTERVAL */#ifndef CUSTOM_HID_FS_BINTERVAL
#define CUSTOM_HID_FS_BINTERVAL                      0x05U
#endif /* CUSTOM_HID_FS_BINTERVAL */#ifndef USBD_CUSTOMHID_OUTREPORT_BUF_SIZE
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE            0x02U
#endif /* USBD_CUSTOMHID_OUTREPORT_BUF_SIZE */#ifndef USBD_CUSTOM_HID_REPORT_DESC_SIZE
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE             163U
#endif /* USBD_CUSTOM_HID_REPORT_DESC_SIZE */#define CUSTOM_HID_DESCRIPTOR_TYPE                   0x21U
#define CUSTOM_HID_REPORT_DESC                       0x22U#define CUSTOM_HID_REQ_SET_PROTOCOL                  0x0BU
#define CUSTOM_HID_REQ_GET_PROTOCOL                  0x03U#define CUSTOM_HID_REQ_SET_IDLE                      0x0AU
#define CUSTOM_HID_REQ_GET_IDLE                      0x02U#define CUSTOM_HID_REQ_SET_REPORT                    0x09U
#define CUSTOM_HID_REQ_GET_REPORT                    0x01U

通信关键函数:

usb hid 数据发送函数:usbd_customhid.c 中uint8_t USBD_CUSTOM_HID_SendReport(USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t len)
usb hid 数据接收回调函数:usbd_custom_hid_it.c中static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state)

拷贝代码

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
extern unsigned char USB_Recive_Buffer[64];
extern unsigned char USB_Received_Count;
/* USER CODE END PV */.../*** @brief  Manage the CUSTOM HID class events* @param  event_idx: Event index* @param  state: Event state* @retval USBD_OK if all operations are OK else USBD_FAIL*/
static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state)
{/* USER CODE BEGIN 6 */
//  UNUSED(event_idx);
//  UNUSED(state);int i;/*查看接收数据长度*/USB_Received_Count = USBD_GetRxCount( &hUsbDeviceFS,CUSTOM_HID_EPOUT_ADDR );  //第一参数是USB句柄,第二个参数的是接收的末端地址;要获取发送的数据长度的话就把第二个参数改为发送末端地址即可USBD_CUSTOM_HID_HandleTypeDef   *hhid; //定义一个指向USBD_CUSTOM_HID_HandleTypeDef结构体的指针hhid = (USBD_CUSTOM_HID_HandleTypeDef*)hUsbDeviceFS.pClassData;//得到USB接收数据的储存地址for(i=0;i<USB_Received_Count;i++) {USB_Recive_Buffer[i]=hhid->Report_buf[i];  //把接收到的数据送到自定义的缓存区保存(Report_buf[i]为USB的接收缓存区)} /* Start next USB packet transfer once data processing is completed */if (USBD_CUSTOM_HID_ReceivePacket(&hUsbDeviceFS) != (uint8_t)USBD_OK){return -1;}return (USBD_OK);/* USER CODE END 6 */
}

main.c

添加如下代码

extern USBD_HandleTypeDef hUsbDeviceFS; //外部声明USB的句柄
/* USER CODE END Includes */
...
/* USER CODE BEGIN PV */
unsigned char USB_Recive_Buffer[64] = {0}; //USB接收缓存
unsigned char USB_Received_Count = 0;//USB接收数据计数
/* USER CODE END PV */
...while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_Delay(1000);debug("Enter main while loop!\r\n");USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, USB_Recive_Buffer, 64);HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);HAL_Delay(500);HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);HAL_Delay(500);HAL_UART_Transmit_DMA(&huart1, (uint8_t *)USB_Recive_Buffer, 64);debug("\r\n");HAL_Delay(1000);debug("USB_Received_Count=== %d\r\n",USB_Received_Count);}/* USER CODE END 3 */

四、测试

如果和图中的一样,恭喜你,和我的水平一样了。✊ ✊ ✊ ✊ ✊ ✊ ✊ ✊

总结

慢慢来,尖刺就是生梨。

STM32 USB 开发(一)HID Slave 通信相关推荐

  1. STM32 USB VCOM和HID的区别,配置及Echo功能实现(HAL)

    STM32 USB VCOM和HID的区别,配置及Echo功能实现(HAL ) STM32的USB功能模块可以配置为虚拟串口(VCOM: Visual Port Com)或人机交互设备(HID: Hu ...

  2. STM32 USB开发

    作者 QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118 参考 STM32 使用Cube ...

  3. STM32 USB组合设备HID+MIDI

    目的:完成一个HID + MIDI的组合设备 准备工作: ·用CUBE生成HID工程: ·复制一份工程修改为MIDI工程:(参考之前博客已完成这两个工程) ·新建USB_User文件夹,将USB相关配 ...

  4. STM32 USB 开发(二)HID Slave 通信 --- 简单上位机开发

    文章目录 前言 一.准备数据 二.在VS中开发上位机 1.引入国外大神写的USB通讯库HidLibary 2.新建HID管理类 CustomHIDManager.cs 3.运行结果 总结 前言 在网上 ...

  5. STM32 USB应用——VCP

    目录: 1.STM32 USB开发工具用户手册 2.STM32 USB固件库 3.实现例程 总结:如果老板给你一个VCP的项目,怎样才能快速的开发呢,其实有两条方法,其中一条是根据USB库文件一步一步 ...

  6. 记录一下 开发STM32 USB HID踩过的坑

    记录一下 开发STM32 USB HID踩过的坑 一.前言 二.代码配置 一.前言 MCU: STM32F103C8T6 CubeMX: STM32CubeMX 5.3.0 二.代码配置 引脚配置 时 ...

  7. 62 stm32 usb自定义hid复合设备修改实验

    1.引言 最近因为项目需要,我们希望单片机既能有hid键盘功能,又能有hid设备的功能.即单片机的一个usb接口插入电脑后,电脑能识别出键盘设备和hid设备,两者同时存在的. 基于项目只是要求实现功能 ...

  8. USB开发—STM32 USB Audio 开发板介绍(Feedback)

    USB开发-STM32 USB Audio 开发板介绍(Feedback) 一.背景 我个人从事音频行业有好几年的时间.后面慢慢的做起了声卡,也就是USB Audio.自己也走了不少的弯路.之前一起是 ...

  9. STM32驱动开发(二)--USB Device RNDIS虚拟网卡(USB2.0 基础概念讲解)

    STM32驱动开发(二)–USB Device RNDIS虚拟网卡(USB2.0基础概念讲解) 一.简介   本文基于stm32 Rndis实例,github开源, 使用STM32F407单板.结合协 ...

最新文章

  1. 【个人随笔】准备整理整理以往的资料
  2. 产生随机数的几种方法
  3. 自绘制HT For Web ComboBox下拉框组件
  4. 【Netty】IO 模型简介 ( Netty 特点 | Netty 应用场景 | Java 三种 IO 模型 | BIO 模型 )
  5. boost::process::group相关的测试程序
  6. pythonalert弹窗_python+selenium八:Alert弹窗
  7. because the principal dbo does not exist 问题解决方法
  8. 请领导审阅并提意见应怎么说_职场中,领导不喜欢你,暗中排挤你,怎么办?老员工给你支5招!...
  9. 用友U9执行JS代码。
  10. 计算机应用基础99页,计算机应用基础复习(65页)-原创力文档
  11. 计算机网络操作系统课件,计算机网络操作系统课件(张浩军版).ppt
  12. QList、QVector、QMap容器类
  13. 4、组件注册-自定义TypeFilter指定过滤规则
  14. 未來用工新趨勢_2019年社会化用工成新趋势
  15. JavaScript编写答题评分功能页面
  16. Mac系统空格预览放大图片
  17. 面试题01.05.一次编辑
  18. HDU - 1873 看病要排队(优先队列)
  19. 74HC595级联电路篇(二)
  20. BeanDefinition到Bean

热门文章

  1. 如何写好文献综述(整理)
  2. 曹雪芹诗歌中的鸿蒙,曹雪芹诗词选
  3. 树莓派访问 群晖 里的共享文件夹
  4. 路由器wifi信号测试软件,顶级无线路由器信号强度测试(5GHz)_网络设备无线网络和技术-中关村在线...
  5. mapboxgl - 用webgl展示海量数据,是否可行?
  6. 曾志伟原创港式奶茶店—喜乐街,台州金清人民路新店开业
  7. 圈圈套圈圈(5) 分发代理
  8. 点餐小程序原型模板-书亦烧仙草
  9. 【数值分析实验MATLAB】数值积分:梯形公式、辛普森公式、复化梯形公式、复化辛普森公式、龙贝格算法、自适应求积方法
  10. html表格中字与字间距如何调整,excel表格字间距怎么调