[STM32F4] 【F446RE开发板试用】+USB_OTG读取USB手柄数据(keil工程内有彩蛋)

[复制链接]
16118|175
mintspring 发表于 2015-10-4 08:12 | 显示全部楼层
我来帮忙贴出来楼主的主函数。
-----------------------------------------------
  1. #include "stm32f4xx.h"
  2. #include "delay.h"
  3. #include "USART2.h"
  4. #include "usbh_usr.h"
  5. #include "string.h"

  6. USBH_HOST  USB_Host;
  7. USB_OTG_CORE_HANDLE  USB_OTG_Core_dev;
  8. extern HID_Machine_TypeDef HID_Machine;
  9. //HID重新连接
  10. void USBH_HID_Reconnect(void)
  11. {
  12.         //关闭之前的连接
  13.         USBH_DeInit(&USB_OTG_Core_dev,&USB_Host);        //复位USB HOST
  14.         USB_OTG_StopHost(&USB_OTG_Core_dev);                //停止USBhost
  15.         if(USB_Host.usr_cb->DeviceDisconnected)                //存在,才禁止
  16.         {
  17.                 USB_Host.usr_cb->DeviceDisconnected();         //关闭USB连接
  18.                 USBH_DeInit(&USB_OTG_Core_dev, &USB_Host);
  19.                 USB_Host.usr_cb->DeInit();
  20.                 USB_Host.class_cb->DeInit(&USB_OTG_Core_dev,&USB_Host.device_prop);
  21.         }
  22.         USB_OTG_DisableGlobalInt(&USB_OTG_Core_dev);//关闭所有中断
  23.         //重新复位USB
  24.         RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS,ENABLE);//USB OTG FS 复位
  25.         //delay_ms(5);
  26.         RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS,DISABLE);        //复位结束  

  27.         memset(&USB_OTG_Core_dev,0,sizeof(USB_OTG_CORE_HANDLE));
  28.         memset(&USB_Host,0,sizeof(USB_Host));
  29.         //重新连接USB HID设备
  30.         USBH_Init(&USB_OTG_Core_dev,USB_OTG_FS_CORE_ID,&USB_Host,&HID_cb,&USR_Callbacks);  
  31. }
  32. int main(void)
  33. {
  34.         USART2_Init();
  35.        
  36.         USBH_Init(&USB_OTG_Core_dev,USB_OTG_FS_CORE_ID,&USB_Host,&HID_cb,&USR_Callbacks);
  37.         while(1)
  38.         {
  39.                 USBH_Process(&USB_OTG_Core_dev, &USB_Host);
  40.                 if(bDeviceState==1)//连接建立了
  41.                 {
  42.                         if(USBH_Check_HIDCommDead(&USB_OTG_Core_dev,&HID_Machine))//检测USB HID通信,是否还正常?
  43.                         {
  44.                                 USBH_HID_Reconnect();//重连
  45.                         }
  46.                 }else        //连接未建立的时候,检测
  47.                 {
  48.                         if(USBH_Check_EnumeDead(&USB_Host))        //检测USB HOST 枚举是否死机了?死机了,则重新初始化
  49.                         {             
  50.                                 USBH_HID_Reconnect();//重连
  51.                         }
  52.                 }
  53.                 delay_ms(5);
  54.         }
  55. }


cedar_renjun 发表于 2015-10-7 20:51 | 显示全部楼层
很赞啊,刚好有这个F4板子,学习一下USB
天灵灵地灵灵 发表于 2015-10-10 09:06 | 显示全部楼层
这板子,这拍照水平也是很给力的。
huangcunxiake 发表于 2015-10-10 10:12 | 显示全部楼层
Keil昨天看了一下,都升级到5.16a了,好在激活方法没变,还可以注册机激活。
gejigeji521 发表于 2015-10-10 10:52 | 显示全部楼层
那个数据怎么识别的,楼主知道那个手柄的协议吗
lingergz 发表于 2015-10-11 18:46 | 显示全部楼层
本次分享使用的keil版本为5.15.0,ARMCC版本为V5.05 Update2(Bulid169)。


这开发环境好新啊,要是能分享下 下载链接就更好了
ranqingfa 发表于 2015-10-12 09:28 | 显示全部楼层
不错,啥时候俺也弄一块
 楼主| 湛只为无双 发表于 2015-10-14 11:48 | 显示全部楼层
天灵灵地灵灵 发表于 2015-10-10 09:06
这板子,这拍照水平也是很给力的。

哈哈,谢谢了。不过拍照水平确实不咋地。
 楼主| 湛只为无双 发表于 2015-10-14 11:50 | 显示全部楼层
gejigeji521 发表于 2015-10-10 10:52
那个数据怎么识别的,楼主知道那个手柄的协议吗

这个在源代码里面有协议的识别的,具体可以参考上传的源代码。
另外,有个板子移植了nes游戏,用这个手柄玩了把超级玛丽和坦克大战。
lib6303c 发表于 2015-10-16 16:38 | 显示全部楼层
mark!学习了!
nefusmzj 发表于 2015-10-18 21:36 | 显示全部楼层
对于不同的USB device设备,他们驱动各部相同,这里是如何实现的?
gohold的绝 发表于 2015-10-20 16:30 | 显示全部楼层
做的真厉害,看得本小白激情澎湃
michael.xing 发表于 2015-10-20 17:23 | 显示全部楼层
我的理解是,楼主用446访问usb设备,对吗?
 楼主| 湛只为无双 发表于 2015-10-20 18:20 | 显示全部楼层
nefusmzj 发表于 2015-10-18 21:36
对于不同的USB device设备,他们驱动各部相同,这里是如何实现的?

这个目前我也不是很清楚,对于USB_HID设备来说,常用的有键盘,鼠标,手柄等,其实查看内部函数可以知道是对应的传输断点不同和设备描述不同,再往应用层说是不同的设备底层已经写好了,只要调用对应的回调函数就可以了。就好比USB_APP里面的手柄回调,如果对应键盘,就有键盘的回调,对应鼠标就有鼠标的回调。
 楼主| 湛只为无双 发表于 2015-10-20 18:21 | 显示全部楼层
michael.xing 发表于 2015-10-20 17:23
我的理解是,楼主用446访问usb设备,对吗?

是的,就是这样的,使用446来访问设备,这个设备可以是键盘、鼠标、手柄等,也可以是U盘。目前我能做到的就这几个。。。多的也不是很懂,具体可以参考官方的例程。
nefusmzj 发表于 2015-10-20 19:52 | 显示全部楼层
湛只为无双 发表于 2015-10-20 18:20
这个目前我也不是很清楚,对于USB_HID设备来说,常用的有键盘,鼠标,手柄等,其实查看内部函数可以知道 ...

恩,不过市面上USB手柄种类这么多,如果连接电脑的话驱动各不相同,不知道它是怎么读取这些设备的。
 楼主| 湛只为无双 发表于 2015-10-20 21:57 | 显示全部楼层
nefusmzj 发表于 2015-10-20 19:52
恩,不过市面上USB手柄种类这么多,如果连接电脑的话驱动各不相同,不知道它是怎么读取这些设备的。 ...

看似不一样,实际上都是差不多的。不同的可能包括了VID PID等,还有就是每个键位的值不一样。总之,只要是免驱的USB手柄,基本上都是一样的。
wahahaheihei 发表于 2015-10-20 22:01 | 显示全部楼层
OTG这应用挺爽的,可以读U盘。
643757107 发表于 2015-10-20 22:49 | 显示全部楼层
OTG就是让设备接上USB。
nefusmzj 发表于 2015-10-21 09:20 | 显示全部楼层
湛只为无双 发表于 2015-10-20 21:57
看似不一样,实际上都是差不多的。不同的可能包括了VID PID等,还有就是每个键位的值不一样。总之,只要 ...

这样啊,不错不错!开来是我自己想得太难阻挡了脚步!感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部