基于STM32 HID例程生成不多于64字节传输的示范

发布者:电竞狂人最新更新时间:2021-06-29 来源: eefocus关键字:STM32  传输 手机看文章 扫描二维码
随时随地手机看文章

简介:本文简单介绍如何应用ST USB HID(MOUSE)例程生成一个可以输入和输出任何长度小于等于64字节的移植过程。


问题描述:


HID的在USB的运用中是非常广泛的,但是很多应用并不是简单的鼠标或者键盘操作,而是客户自定义的一些应用,所以REPORT的定义往往跟鼠标或者键盘并不相同,因而客户常常基于ST的HID的例程进行修改。那么如何基于我们的例程生成一个可以输入输出任何长度小于等于64字节的例程?这里示范一下,抛砖引玉。


代码修改:


第一步:


我们在usbd_hid_core.c中,找到配置描述进行修改。首先增加一个OUT 端点。同时将HID_IN_PACKET 和HID_OUT_PACKET长度修改为0x40。


0x07, /* bLength: Endpoint Descriptorsize *///dum


USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType: */ /* Endpoint descriptor type */


HID_OUT_EP, /* bEndpointAddress: */ /*Endpoint Address (OUT) */


0x03, /* bmAttributes: Interruptendpoint */


HID_OUT_PACKET, /* wMaxPacketSize: 64Bytes max */


0x00,


0x01, /* bInterval: Polling Interval(20 ms) */


/* 41 */


第二步:


修改报告描述符:请注意这两个report count和report SIZE的设定。


const uint8_tHID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] =


{


0x05, 0x8C, /* USAGE_PAGE (VendorPage: 0xFF00) */


0x09, 0x06, /* USAGE (Demo Kit) */


0xa1, 0x01, /* COLLECTION(Application) */


/* 6 */


0x09, 0x06, /* USAGE (LED 1) */


0x15, 0x00, /* LOGICAL_MINIMUM (0) */


0x26, 0x00,0xff, /* LOGICAL_MAXIMUM(1) */


0x75, 0x08, /* REPORT_SIZE (8) */


0x95, 0x40, /* REPORT_COUNT (64) */


0x91, 0x82, /* OUTPUT(Data,Var,Abs,Vol) */


/* 18 */


0x09, 0x06, /* USAGE (ADC IN) */


0x15, 0x00, /* LOGICAL_MINIMUM (0) */


0x26, 0x00,0xff, /* LOGICAL_MAXIMUM(255) */


0x75, 0x08, /* REPORT_SIZE (8) */


0x95, 0X40, /* REPORT_COUNT (64) */


0x81, 0x82, /* INPUT(Data,Var,Abs,Vol) */


/* 31 */


0xc0 /* END_COLLECTION */


}; /* CustomHID_ReportDescriptor */




第三步:


修改HID CLASS 初始化代码:


注意这里两个地方:


1, USB FIFO的分配定义。


2, Usb ENDPOINT的使能,以及准备接收数据。


static uint8_t USBD_HID_Init (void*pdev,


uint8_t cfgidx)


{


DCD_PMA_Config(pdev ,HID_IN_EP,USB_SNG_BUF,HID_IN_TX_ADDRESS);


DCD_PMA_Config(pdev ,HID_OUT_EP,USB_SNG_BUF,HID_OUT_RX_ADDRESS);


/* Open EP IN */


DCD_EP_Open(pdev,


HID_IN_EP,


HID_IN_PACKET,


USB_EP_INT);


/* Open EP OUT */


DCD_EP_Open(pdev,


HID_OUT_EP,


HID_OUT_PACKET,


USB_EP_INT);


DCD_EP_PrepareRx(pdev,HID_OUT_EP,Report_buf,HID_OUT_PACKET);


PrevXferDone=1;


return USBD_OK;


}


第四步:


修改发送函数,注意不能一直往USB FIFO里面填充数据,一定要等上一次传输完成再填充。


USBD_HID_SendReport(&USB_Device_dev, Send_Buffer,HID_IN_PACKET);


最后我们一起来看看效果,可以清楚的看到MCU每毫秒都会发送64个字节的数据到主机。


结论:


这个例程只是基于STM32F0系列的MCU进行的修改,你只要按照这四步很容易地移植到其它系列MCU上。


关键字:STM32  传输 引用地址:基于STM32 HID例程生成不多于64字节传输的示范

上一篇:STM32输出PWM状态总结
下一篇:基于STM32F103的贴片机控制系统的设计与实现

推荐阅读最新更新时间:2024-11-09 12:39

STM32学习日志——内部温度传感器实验
一、内部温度传感器简介 STM32有一个内部温度传感器,与ADCx的通道16相连,主要用来测量CPU及周围的温度,推荐采样时间为17us,测量温度范围为-40至125度,精度较差,可能有正负1.5度的误差,更适合用来检测温度的变化,因为它的温度差值还是比较准确的。 二、配置函数 1)设置ADC,开启内部温度传感器,与上一讲类似; 2)读取ADC值,读取平均值,也与上一讲类似; 3)根据得到的ADC值转换成温度值;公式如下: T(℃)={(V25-Vsense)/Avg_Slope}+25 其中:V25=Vsense 在 25 度时的数值(典型值为:1.43)。 Avg_Slope=温度与 Vsense 曲线的平均斜率(单位
[单片机]
stm32单片机用什么软件编程
  今天要和大家分享的是stm32单片机用什么软件编程相关信息。   想学单片机开发,最主要是熟悉stm32的软件开发环境,目前stm32的开发环境,主流是KEIL和IAR,当然主要是windows版本运行。   两个开发环境都是目前的主流,都用的很多,而且这两种开发环境实际上差异不大,学好一个即可。我个人常用keil,虽然keil的版本很多,因为我常用的是STM32F1,所以KEIL4,就能满足需求。想完整完成一个Stm32的工程开发过程,需要学会新建工程,这个是单片机开发工具基础操作。   除此之外。还需要学会使用Keil进行仿真,写代码肯定会遇到各种问题。怎么找到问题造成的原因。就需要仿真查看了代码执行情况,当然也有其他
[单片机]
能够让STM32更简单的工具
目 录 1. STM32Cube Ecosystem 2. CubeMX 3. CubeIDE 4. CubeProg 5. CubeIDE进行开发 5.1 STM32CubeIDE Home 5.2 生成工程 5.3 程序下载 6. 结语 1. STM32Cube Ecosystem 记得我在ST刚推出CubeMX的时候就尝试过,那时候自动生成的外设初始化代码都会有一些小错误,现在,随着这套系统的迭代升级,Cube生态也越来越完善,并且使用也越来越方便。ST推出的STM32Cube Ecosystem提供了免费整套的开发软件工具和嵌入式软件包,其中可以从芯片的外设配置,程序开发,程序下载以及系统监视一系列的功能。 STM32
[单片机]
STM32驱动超声波模块测距
HC-SR04超声波测距模块可提供2cm到400cm的非接触式距离感测功能,测距精度可达3mm。 一、基本工作原理 (1)给TRIG引脚至少10us的高电平信号触发测距。 (2)模块自动发送8个40KHz的方波,自动检测是否有信号返回 (3)有信号返回,通过Echo引脚输出一个高电平,高电平的持续时间就是超声波从发射到返回的时间。 (4)测量距离 = (高电平的持续时间 * 声速(340m/s))/ 2。 二、接线 三、模块时序图 四、驱动程序 在了解了上述内容后,我们便可以根据上述知识便可以编写驱动程序了。触发信号Trig很简单直接通过IO输出和延时给一个大于10us的高电平即可触发。Echo引脚需
[单片机]
<font color='red'>STM32</font>驱动超声波模块测距
几点内容给学习STM32的朋友
通过观察后台提问的内容来看,关注我的人中STM32初学者占大部分,而且大多处于小白阶段。所以,今天暂且写下几点内容给这些朋友。 1查找资料去官网 许多初学者总是在问:能给我一份xxx手册吗?你有关于xxx的资料吗?同时,我也常在某些“技术群”里看到类似这种“给资料”的对话。 这样说吧,你们向别人获取的“资料”,别人基本上也是从官网下载而来的。而且,别人给你的资料不一定是最新版本。 因此,建议初学者查找资料,寻找资料尽量找官方原版资料,毕竟官方的才具有权威性。 STM32官方整理的资料很多,而且针对每一种型号的MCU都有各种资料。夸一点的说:你想要的都有。 针对你MCU芯片型号,进入对应的网址即可(具体这里就不说过程了): h
[单片机]
几点内容给学习<font color='red'>STM32</font>的朋友
STM32看门狗配置(独立看门狗IWDG和窗口看门狗WWDG)
  stm32自带两个看门狗模块,独立看门狗IWDG和窗口看门狗WWDG。   看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号) 。   看门狗主要作用是可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。   具体的实现步骤:开启看门狗,设置减计数的初始值,当计数值达到超时值时,产生MCU复位,此时本来运行的程序终止重新启动单片机(发生了故障)。在使用了看门狗
[单片机]
<font color='red'>STM32</font>看门狗配置(独立看门狗IWDG和窗口看门狗WWDG)
基于STM32的解魔方机器人设计方案
方案设计 采用舵机作为魔方的驱动电机,从舵机的驱动原理可知:舵机运行的速度和的主频没有关系,所以采用和采用更高主频的相比在控制效果上没有什么差别。过程简单,非常容易上手,而且不需要进行的移植,非常适合对魔方机器人的舵机进行控制。 2.复原时间是魔方机器人的一个非常重要,可以说是最为重要的一个参数,本文的软件设计中涉及到了大量的,如 Kocemba 复原算法和 KNN 分类算法等,而控制器主频对于算法运行时间的长短起着决定性的作用。 所以在本文的方案设计中,我们把核心算法全部交给 Allwinner A20 运行的 APP。 设计原理 1、Kociemba算法 Kociemba算法,又称为二阶段
[机器人]
STM32的ADC编程方法总结
这里的ADC转换也来使用DMA---这个也是STM32的ADC转换最常见的方式。 第一步是了解STM32的ADC对应的GPIO口如下图不用记住,可以查询,我是将它剪下来粘贴到书本的相应章节! 第二步是配置相应ADC转换的GPIO口这里使用PC0--PC1 static void ADC1_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //打开DMA1的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 “ RCC_APB
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved