STM32 USB 开发(一)HID Slave 通信
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、开发板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 通信相关推荐
- STM32 USB VCOM和HID的区别,配置及Echo功能实现(HAL)
STM32 USB VCOM和HID的区别,配置及Echo功能实现(HAL ) STM32的USB功能模块可以配置为虚拟串口(VCOM: Visual Port Com)或人机交互设备(HID: Hu ...
- STM32 USB开发
作者 QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118 参考 STM32 使用Cube ...
- STM32 USB组合设备HID+MIDI
目的:完成一个HID + MIDI的组合设备 准备工作: ·用CUBE生成HID工程: ·复制一份工程修改为MIDI工程:(参考之前博客已完成这两个工程) ·新建USB_User文件夹,将USB相关配 ...
- STM32 USB 开发(二)HID Slave 通信 --- 简单上位机开发
文章目录 前言 一.准备数据 二.在VS中开发上位机 1.引入国外大神写的USB通讯库HidLibary 2.新建HID管理类 CustomHIDManager.cs 3.运行结果 总结 前言 在网上 ...
- STM32 USB应用——VCP
目录: 1.STM32 USB开发工具用户手册 2.STM32 USB固件库 3.实现例程 总结:如果老板给你一个VCP的项目,怎样才能快速的开发呢,其实有两条方法,其中一条是根据USB库文件一步一步 ...
- 记录一下 开发STM32 USB HID踩过的坑
记录一下 开发STM32 USB HID踩过的坑 一.前言 二.代码配置 一.前言 MCU: STM32F103C8T6 CubeMX: STM32CubeMX 5.3.0 二.代码配置 引脚配置 时 ...
- 62 stm32 usb自定义hid复合设备修改实验
1.引言 最近因为项目需要,我们希望单片机既能有hid键盘功能,又能有hid设备的功能.即单片机的一个usb接口插入电脑后,电脑能识别出键盘设备和hid设备,两者同时存在的. 基于项目只是要求实现功能 ...
- USB开发—STM32 USB Audio 开发板介绍(Feedback)
USB开发-STM32 USB Audio 开发板介绍(Feedback) 一.背景 我个人从事音频行业有好几年的时间.后面慢慢的做起了声卡,也就是USB Audio.自己也走了不少的弯路.之前一起是 ...
- STM32驱动开发(二)--USB Device RNDIS虚拟网卡(USB2.0 基础概念讲解)
STM32驱动开发(二)–USB Device RNDIS虚拟网卡(USB2.0基础概念讲解) 一.简介 本文基于stm32 Rndis实例,github开源, 使用STM32F407单板.结合协 ...
最新文章
- 【个人随笔】准备整理整理以往的资料
- 产生随机数的几种方法
- 自绘制HT For Web ComboBox下拉框组件
- 【Netty】IO 模型简介 ( Netty 特点 | Netty 应用场景 | Java 三种 IO 模型 | BIO 模型 )
- boost::process::group相关的测试程序
- pythonalert弹窗_python+selenium八:Alert弹窗
- because the principal dbo does not exist 问题解决方法
- 请领导审阅并提意见应怎么说_职场中,领导不喜欢你,暗中排挤你,怎么办?老员工给你支5招!...
- 用友U9执行JS代码。
- 计算机应用基础99页,计算机应用基础复习(65页)-原创力文档
- 计算机网络操作系统课件,计算机网络操作系统课件(张浩军版).ppt
- QList、QVector、QMap容器类
- 4、组件注册-自定义TypeFilter指定过滤规则
- 未來用工新趨勢_2019年社会化用工成新趋势
- JavaScript编写答题评分功能页面
- Mac系统空格预览放大图片
- 面试题01.05.一次编辑
- HDU - 1873 看病要排队(优先队列)
- 74HC595级联电路篇(二)
- BeanDefinition到Bean
热门文章
- 如何写好文献综述(整理)
- 曹雪芹诗歌中的鸿蒙,曹雪芹诗词选
- 树莓派访问 群晖 里的共享文件夹
- 路由器wifi信号测试软件,顶级无线路由器信号强度测试(5GHz)_网络设备无线网络和技术-中关村在线...
- mapboxgl - 用webgl展示海量数据,是否可行?
- 曾志伟原创港式奶茶店—喜乐街,台州金清人民路新店开业
- 圈圈套圈圈(5) 分发代理
- 点餐小程序原型模板-书亦烧仙草
- 【数值分析实验MATLAB】数值积分:梯形公式、辛普森公式、复化梯形公式、复化辛普森公式、龙贝格算法、自适应求积方法
- html表格中字与字间距如何调整,excel表格字间距怎么调