如何从头移植stm32cubemx usb hid usbhid

他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)如有转载请注明来自http://blog.csdn.net/cy757
大家可以使用压缩包中的UsbApp.exe调试本软件idVendor为:0483
idProduct为5750。
今天太晚了,明天还要上半天班,上位机软件找个时间在写一篇文章。请关注我的博客。压缩包中附带了几个编译软件典型的上位机源代码,大家可以参考下。
本文中源程序的下载网址为:http://download.csdn.net/source/2918553
很久没写过文章了,趁今晚有空出来露一下。最近发现很多人对STM32的USB通信很感兴趣。要将USB的通信协议搞懂确实是一个比较漫长的过程。但是USB的HID通信无论是上位机的设计还是STM32程序的编程都非常的简单。只是我想很多人都不知道而已。这篇文章的目的是让大家以最短的时间将USB加到你的设备中。如果想学得更深就靠大家。
HID只是适合低速传输,其理论上可以达到64KB/S,但多由于windows系统和硬件的关系一般达不到这个传输数度。但这个速度对于一般系统的控制和数据传输都已经足够了,而且是免驱,省去了很多麻烦。如果您需要高速传输可参考我的另外一篇文章《STM32的USB例程修改步骤》文章在http://blog.csdn.net/cy757/archive//5117610.aspx
一、安装完MDK后请打开C:/Keil/ARM/Examples/ST/STM32F10xUSBLib/Demos路径,将Custom_HID在同一个目录下复制一份,如果你要放到其他路径你需要在MDK Options for target的C/C++中添加USB的头文件路径(MDK下的/INC/ST/STM32F10x/USB)。
二、打开usb_desc.c文件,该文件主要包含的端点描述符、设备描述符、配置描述符和字符描述符等。具体请大家参考其他资料了,这里主要说几个常用。
u8 DeviceDescriptor[SIZ_DEVICE_DESC]为USB设备描述符。当中的
/*idVendor (0x0483)*/
/*idProduct = 0x5750*/
//idVender字段。厂商ID号,我们这里取0x0483,仅供实验用。
//实际产品不能随便使用厂商ID号,必须跟USB协会申请厂商ID号。
//注意小端模式,低字节在先。
//idProduct字段。产品ID号,我们这里取0x5750。
//注意小端模式,低字节应该在前。
const u8 ConfigDescriptor[SIZ_CONFIG_DESC]是配置描述符,注意如下
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */
/* bEndpointAddress: Endpoint Address (IN) */
/* bmAttributes: Interrupt endpoint */
/* wMaxPacketSize: 2 Bytes max */
/* bInterval: Polling Interval (32 ms) */
/* bLength: Endpoint Descriptor size */
USB_ENDPOINT_DESCRIPTOR_TYPE,
/* bDescriptorType: */
Endpoint descriptor type */
/* bEndpointAddress: */
Endpoint Address (OUT) */
/* bmAttributes: Interrupt endpoint */
/* wMaxPacketSize: 2 Bytes max
/* bInterval: Polling Interval (20 ms) */
上面包含了“输入端点描述符”和“输出端点描述符”。
//wMaxPacketSize字段。该端点的最大包长。
//bInterval字段。端点查询的时间,
为了实现更高速的通信我们修改如下:
/******************** Descriptor of
endpoint ********************/
/*bLength: Endpoint Descriptor size*/
USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
/*bEndpointAddress: Endpoint Address (IN)*/
/*bmAttributes: Interrupt endpoint*/
/*wMaxPacketSize: 64 Byte max */
/*bInterval: Polling Interval (10 ms)*/
/******************** Descriptor of
endpoint ********************/
/*bLength: Endpoint Descriptor size*/
USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
/*bEndpointAddress: Endpoint Address (OUT)*/
/*bmAttributes: Interrupt endpoint*/
/*wMaxPacketSize: 64 Byte max */
/*bInterval: Polling Interval (10 ms)*/
const u8 ReportDescriptor[SIZ_REPORT_DESC]为HID专用的报告描述符,具体的大家就参考资料了,这里可以直接复制了。
const u8 CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =
0x05, 0xFF,
// USAGE_PAGE(User define)
0x09, 0xFF,
// USAGE(User define)
0xa1, 0x01,
// COLLECTION (Application)
0x05, 0x01,
// USAGE_PAGE(1)
0x19, 0x00,
USAGE_MINIMUM(0)
0x29, 0xFF,
USAGE_MAXIMUM(255)
0x15, 0x00,
LOGICAL_MINIMUM (0)
0x25, 0xFF,
LOGICAL_MAXIMUM (255)
0x75, 0x08,
REPORT_SIZE (8)
0x95, 0x40,
REPORT_COUNT (64)
0x81, 0x02,
INPUT (Data,Var,Abs)
0x05, 0x02,
// USAGE_PAGE(2)
0x19, 0x00,
USAGE_MINIMUM (0)
0x29, 0xFF,
USAGE_MAXIMUM (255)
0x15, 0x00,
LOGICAL_MINIMUM (0)
0x25, 0xFF,
LOGICAL_MAXIMUM (255)
0x95, 0x08,
REPORT_COUNT (8)
0x75, 0x40,
REPORT_SIZE (64)
0x91, 0x02,
OUTPUT (Data,Var,Abs)
// END_COLLECTION
}; /* ReportDescriptor */
const u8 CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR]
const u8 StringProduct[SIZ_STRING_PRODUCT]
const u8 StringSerial[SIZ_STRING_SERIAL]
分别是“厂商字符”、“产品字符”、“产品序列号”,这些将在USB HID设备加载的时候显示。但是这需要这些字符要求为Unicode编码,你需要将你要显示的字符先转为Unicode编码。你可以到http://computer00.21ic.org/user1/2198/archives/.html转换。最好大家还要根据各个数组的长度修改如下定义。
#define CUSTOMHID_SIZ_REPORT_DESC
#define CUSTOMHID_SIZ_STRING_VENDOR
#define CUSTOMHID_SIZ_STRING_PRODUCT
#define CUSTOMHID_SIZ_STRING_SERIAL
三、打开hw_config.c文件,将那些没有的函数删除,只保留如下函数
Set_System(void)
void Set_USBClock(void)
void USB_Interrupts_Config(void)
void USB_Cable_Config (FunctionalState NewState)
特别要注意最后一个函数,其主要作用是控制USB的上拉电阻,让电脑检测USB设备是否连接的。
四、打开stm32f10x_it.c文件,把EXTI15_10_IRQHandler等中断内的代码删除。
打开usb_prop.c文件,修改如下:
void CustomHID_Reset(void)
/* Set Joystick_DEVICE as not configured */
pInformation-&Current_Configuration = 0;
pInformation-&Current_Interface = 0;/*the default Interface*/
SetBTABLE(BTABLE_ADDRESS);
/* Initialize Endpoint 0 */
SetEPType(ENDP0, EP_CONTROL);
SetEPTxStatus(ENDP0, EP_TX_STALL);
SetEPRxAddr(ENDP0, ENDP0_RXADDR);
SetEPTxAddr(ENDP0, ENDP0_TXADDR);
Clear_Status_Out(ENDP0);
SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
SetEPRxValid(ENDP0);
/* Initialize Endpoint 1 */
SetEPType(ENDP1, EP_INTERRUPT);
SetEPTxAddr(ENDP1, ENDP1_TXADDR);
SetEPTxCount(ENDP1, 64);
SetEPRxStatus(ENDP1, EP_RX_DIS);
SetEPTxStatus(ENDP1, EP_TX_NAK);
/* Initialize Endpoint 1 */
// SetEPType(ENDP1, EP_INTERRUPT);
SetEPRxAddr(ENDP1, ENDP1_RXADDR);
SetEPRxCount(ENDP1, 64);
// SetEPTxStatus(ENDP1, EP_TX_DIS);
SetEPRxStatus(ENDP1, EP_RX_VALID);
/* Set this device to response on default address */
SetDeviceAddress(0);
五、usb_endp.c文件
void EP1_OUT_Callback(void)
这些写接收代码
六、数据发送和接收,举例说明
1、数据接收
DataLen = GetEPRxCount(ENDP1);
PMAToUserBufferCopy(TX1_buffer, ENDP1_RXADDR, DataLen);
SetEPRxValid(ENDP1);
USART1_Send(DataLen);
count_out = 1;
2、数据发送
UserToPMABufferCopy(InBuffer, GetEPTxAddr(ENDP1), 64);
SetEPTxCount(ENDP1, 64);
SetEPTxValid(ENDP1);
如果你发送数据较为频繁,每次发送前应使用GetEPTxStatus(ENDP1)检测上次发送是否完成。如果端点状态处于EP_TX_VALID,说明发送未结束,如果端点状态处于EP_TX_NAK,说明发送结束。
阅读(...) 评论()基于STM32 HID例程生成不小于64字节传输的移植过程-ST技术方案-意法半导体STM32/STM8技术社区
基于STM32 HID例程生成不小于64字节传输的移植过程
发布时间:
来源:ST社区
本文简单介绍如何应用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 */
0x01, /* bInterval: Polling Interval(20 ms) */
修改报告描述符:请注意这两个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) */
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) */
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) */
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上。
对能量的追求,是永恒的主题。智能手机,无论是在虚拟世界还是现实生活,现在几乎很少有能让我们使用超过一天的产品了。我们的生活已经处于一个随时都在寻找电源充电的窘境。就算在家里也是如此,每天都要和家人或同事抢充电器,并且各种设备之间也都要充电。
在手机光学市场取得成功之后,意法半导体(ST)决定在光学市场上持续发力。意法半导体公布的2017年报显示,影像产品事业部是意法半导体所有业务中增速最快的,实现了三位数成长,而ToF传感器更是成长超过300%。2017年意法半导体投资者峰会上,时任公司COO,现已成为公司CEO的Jean-Marc Chery提出了图像市场的战略,既提供差异化的智能光学传感器解决方案。
联网电视气势如虹,具备更高互动性的智慧电视趁势而起,品牌、晶片厂商皆布下重兵,除苹果智慧电视拥有自家的生态体系外,其他系统单晶片厂商则期盼2011年第二季Google开放Android原始码,
微机电系统(MEMS)运动IC在走向更高的集成度、更小的芯片尺寸、更低的成本以及更高的性能和可靠性。这些趋势在最新的加速度计、陀螺仪和惯性测量单元(IMU)上得到了体现,使得MEMS器件得以满足多种下
中国,日 ——横跨多重电子应用领域、全球领先的半导体供应商意法半导体公布了截至日的第四季度及全年财报。第四季度净收入总计20.1亿美元,毛利率为32.9%,每股净亏损0.04美元。全年净收入总计80.8亿美元,毛利率为32.3%,每股净亏损0.56美元。
16757 观看
15684 观看
Tel: 3-8064
备案号: 苏ICP备号-2把STM32的usb做成hid类型的,和电脑通讯就靠这usb,请问一下,这个pc怎么发送数据给板子_百度知道
把STM32的usb做成hid类型的,和电脑通讯就靠这usb,请问一下,这个pc怎么发送数据给板子
把STM32的usb做成hid类型的,和电脑通讯就靠这usb,请问一下,这个pc怎么发送数据给板子,串口是有串口调试助手。
我有更好的答案
32是有串口模块!串口模块的初始化只要设置好,初始化好后,通过串口调试助手可以让PC发数据给板子
采纳率:90%
百度一下吧,一大把:
为您推荐:
其他类似问题
和平里的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。查看: 1269|回复: 11
STM32F401自定义USB HID模式
主题帖子精华
新手入门, 积分 37, 距离下一级还需 -17 积分
在线时间0 小时
5bbafdb22e1eb_350.png (0 Bytes, 下载次数: 0)
22:54 上传
18dbebe241_984.png (0 Bytes, 下载次数: 0)
22:54 上传
fa0de361baa5.png (0 Bytes, 下载次数: 0)
22:54 上传
b377e5b833f903ca25ff49_135.png (0 Bytes, 下载次数: 0)
22:54 上传
上面是我改的官方的主程序,端点定义,回调函数。其他都没变动,usb连接电脑后能够枚举,但是收发数据就不行了。大神们弄过的指导下。谢谢了
主题帖子精华
金钱121943
在线时间993 小时
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
新手入门, 积分 37, 距离下一级还需 -17 积分
在线时间0 小时
回复【2楼】正点原子:
---------------------------------
原子哥,有例子么。嗒嗒手啊
主题帖子精华
在线时间300 小时
主题帖子精华
金钱121943
在线时间993 小时
回复【3楼】老油条:
---------------------------------
没有
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
新手入门, 积分 37, 距离下一级还需 -17 积分
在线时间0 小时
回复【5楼】正点原子:
---------------------------------
USBD_HID_SendReport&(&USB_OTG_dev,&
&&&&&&&&&&&&&&&&&&&&&&&&&buf,
&&&&&&&&&&&&&&&&&&&&&&&&4);
#define&HID_IN_PACKET&&&&&&&&&&&&&&&&64
#define&HID_OUT_PACKET&&&&&&&&&&&&&&&64
原子哥,我改的空鼠的例程,这个发送函数里面只可以发送4以下的数据。端点的最大缓冲区定义的64字节,怎么回事呢?
主题帖子精华
初级会员, 积分 134, 距离下一级还需 66 积分
在线时间11 小时
帮顶。。。。
————————
主题帖子精华
金钱121943
在线时间993 小时
回复【6楼】老油条:
---------------------------------
鼠标数据就是用4个字节表示的,64是usb一次最大传输的数据量。并不一定要求每次发送64字节啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
新手入门, 积分 28, 距离下一级还需 -8 积分
在线时间0 小时
USBD_HID_Init函数中,调用了DCD_EP_Open,其中第二个参数就是包长,这个数值需要改一下。
主题帖子精华
新手入门, 积分 37, 距离下一级还需 -17 积分
在线时间0 小时
回复【8楼】正点原子:
---------------------------------
改了描述符可以发送64字节了,&&后来我和PC通信每次打印的时间间隔为8ms,如果我要延时很小的传输是不是该采取连续传输的方式?该改哪些地方呢?
主题帖子精华
新手入门, 积分 37, 距离下一级还需 -17 积分
在线时间0 小时
回复【9楼】只是残阳:
---------------------------------
恩,改了描述符,可以了。谢谢!&&还问一个问题啊,如果PC发送数据给MCU,除了增加与PC对应的端点定义,还需要修改什么呢?
主题帖子精华
新手入门, 积分 28, 距离下一级还需 -8 积分
在线时间0 小时
回复【11楼】老油条:
---------------------------------
最近我也是在做自定义的HID设备,接收PC发来的数据,参考了http://www.openedv.com/posts/list/46347.htm,确实能够做到。但是,他的改法,我觉得不太完善,不可能每次触发OTG_FS_IRQHandler中断都去接收一次数据的,应该来数据了才接收。不过,现在还没改好。
Powered by

我要回帖

更多关于 stm32 usbhid 的文章

 

随机推荐