移植STM32固件库用于HID双向通信

2018-09-14来源: eefocus 要害字:移植  STM32  固件库  HID双向通信

USB的应用中HID类是比力常见的方式。通过修改STM32 USB固件库V4.0的JOYSTICK应用,我们实现一个双向USB通信。
一、移植
使用STM32源法式为点亮LED灯法式。
首先将USB固件库中有用的函数复制到源函数中,建设LIB文件夹其中放入USB2.0协议函数



建设CFG文件夹放入USB应用函数


将两个文件夹都放到源工程目录下将文件添加进来,设置好,配置好KEIL软件设置。

二、修改文件
1、首先修改platform_config.h函数。
    该文件是对于多种芯片对于USB库的支持。我们使用STM32F103ZET6芯片,所以只保留与之相关的ID项,与USB_DISCONNECT线(PG11)的配置。修改之后的头文件如下所示



2、然后修改hw_config.c中Set_System函数

    实际上STM32F103zet6不需要对USB端口进行单独的配置,删掉Set_System函数中没用的部门,只对USB_DISCONNECT线(PG11)进行初始化。修改后的函数如下图所示。


3、接下来修改hw_config.c文件中USB_Cable_Config函数因为我使用的是比力老的神舟III开发板,当PG11为高电平时实现上拉,所以修改后的函数为


4、修改USB_Interrupt_Config函数,配置USB_LP_CAN1_RX0_IRQn和USBWakeUp_IRQn中断修改后的函数如下图所示。


5、接下来删掉hw_config.c文件中GPIO_AINConfig函数,没有什么用,只会报错

6、删掉与按键相关的设置,因为我们并没有用到,主要是先清除JoyState和Joystick_Send函数中内容,不用管。

7、最后我们处置惩罚USB挂起相关的问题。在USB固件库中提供挂起相关的处置惩罚函数,主要有2个函数需要修改。它们是Suspend函数和Enter_LowPowerMode函数。其中,在Suspend函数中注释掉PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);语句。修改Suspend函数,如下图所示

OK接下来应该就没有什么需要修改的地方了(如果有的话请酌情修改)
三、描述符修改
使用USB HID类进行通信调试。所以要对USB的描述符要做部门修改(usb_desc.c)。下面我们贴法式说明(只对重要修改做说明)

设备描述符
修改idVendor和idProduct的值,为任意其他值,我里我用给的是0x0413和0x5724,修改的时候注意巨细端

配置描述符荟萃

const uint8_t Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC] =

  {

    0x09, /* bLength: Configuration Descriptor size */

    USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */

    JOYSTICK_SIZ_CONFIG_DESC,

    /* wTotalLength: Bytes returned */

    0x00,

    0x01,         /*bNumInterfaces: 1 interface*/

    0x01,         /*bConfigurationValue: Configuration value*/

    0x00,         /*iConfiguration: Index of string descriptor describing

                                     the configuration*/

    0xE0,         /*bmAttributes: Self powered */

    0x32,         /*MaxPower 100 mA: this current is used for detecting Vbus*/

 

    /************** Descriptor of Joystick Mouse interface ****************/

    /* 09 */

    0x09,         /*bLength: Interface Descriptor size*/

    USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/

    0x00,         /*bInterfaceNumber: Number of Interface*/

    0x00,         /*bAlternateSetting: Alternate setting*/

    0x02,         /*bNumEndpoints除端点0外,需要1输入1输出*/

    0x03,         /*bInterfaceClass: HID*/

    0x00,         /*bInterfaceSubClass : 1=BOOT, 0=no boot选择no boot*/

    0x00,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse选择none*/

    0,            /*iInterface: Index of string descriptor*/

    /******************** Descriptor of Joystick Mouse HID ********************/

    /* 18 */

    0x09,         /*bLength: HID Descriptor size*/

    HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/

    0x00,         /*bcdHID: HID Class Spec release number*/

    0x01,

    0x00,         /*bCountryCode: Hardware target country*/

    0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/

    0x22,         /*bDescriptorType*/

    JOYSTICK_SIZ_REPORT_DESC,/*wItemLength: Total length of Report descriptor*/

    0x00,

    /******************** Descriptor of Joystick Mouse endpoint ********************/

    /* 27 */

    0x07,          /*bLength: Endpoint Descriptor size*/

    USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/

 

    0x81,          /*bEndpointAddress: Endpoint Address (IN)*/

    0x03,          /*bmAttributes: Interrupt endpoint*/

    0x40,          /*wMaxPacketSize: 64 Byte max修改最大包巨细为64字节 */

    0x00,

    0x0A,          /*bInterval: Polling Interval (10 ms)修改轮询间隔为10ms*/

/******************** Descriptor of Joystick Mouse endpoint ********************/

    /* 34 */

    0x07,          /*bLength: Endpoint Descriptor size*/

    USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/

 

    0x01,          /*bEndpointAddress: Endpoint Address (OUT)*/

    0x03,          /*bmAttributes: Interrupt endpoint*/

    0x40,          /*wMaxPacketSize: 64 Byte max修改最大包巨细为64字节 */

    0x00,

    0x20,          /*bInterval: Polling Interval (10 ms) 修改轮询间隔为10ms */

/*41 */

  } ;


陈诉描述符


const uint8_t Joystick_ReportDescriptor[JOYSTICK_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)*/

    0x95, 0x40,          /*Report Count(3)*/

    0x75, 0x08,          /*Report Size(1)*/

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, 0x40,          /*Report Count(64)*/

    0x75, 0x08,          /*Report Size(8)*/

0x91, 0x02,          /*Input(Data,Var,Abs)*/

0xc0               /*关荟萃*/

  }; /* Joystick_ReportDescriptor */

上面我们修改了数组内容,导致数组巨细发生变化,所以凭据变化做响应修改,在usb_desc.c中


#define JOYSTICK_SIZ_CONFIG_DESC                41

#define JOYSTICK_SIZ_REPORT_DESC                39

四、修改函数


    修改设备RESET函数Joystick_Reset,这个函数是在RESET中断中被调用,用于端口的初始化。因为我们增加了端点1的输出,修改了包巨细,所以要做响应的修改。这个函数位于usb_prop.c中,修改后的函数为


void Joystick_Reset(void)

{

  /* Set Joystick_DEVICE as not configured */

  pInformation->Current_Configuration = 0;

  pInformation->Current_Interface = 0;/*the default Interface*/

 

  /* Current Feature initialization */

  pInformation->Current_Feature = Joystick_ConfigDescriptor[7];

  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);//修改巨细为64

  SetEPTxStatus(ENDP1, EP_TX_NAK);

 

/* Initializ

[1] [2]

要害字:移植  STM32  固件库  HID双向通信

编辑:什么鱼 引用地址:/mcu/2018/ic-news091441324.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站接纳的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜果真自由流传,或不应无偿使用,请实时通过电子邮件或电话通知我们,以迅速接纳适当措施,制止给双方造成不须要的经济损失。

上一篇:STM32F10X的USB固件库说明
下一篇:最后一页

关注亿博娱乐注册民众号 快捷获取更多信息
关注亿博娱乐注册民众号
快捷获取更多信息
关注亿博娱乐注册服务号 享受更多官方福利
关注亿博娱乐注册服务号
享受更多官方福利

推荐阅读

STM32 USB OTG官方库移植

口。确认硬件完毕后,需要确认所需使用的晶振,外部内部均可。STM32F2为例,HSI为16M。则可以直接用HSI来配置 配置出48M的晶振供应USB。此配置可接纳ST官方的配置工具来完成,操作轻便 ,将配置生成的system_stm32f2xx.c与工程中的替换即可。时钟确认完毕,接下来需要对USB库进行配置。USB库中有许多例程,此处我是做USB升级方案,则有两种,一种是DFU升级模式,需要配合官方给的DFU Demo上位机软件来使用,第二种是MSC模式,读取U盘。库做的很完善,FATFS已经写进例程。配置主要看是USB_HOST照旧USB_DEV抑或是OTG双向模式。目前没有用到双向模式。模式配置需要在usb_conf.h中修改
发表于 2018-09-14

STM32L0开发条记11: 中断请求的移植与处置惩罚

    本文介绍如何移植STM32的IRQ(中断请求)到自己的系统中,我们以USART1接收中断为例。    先看启动文件(汇编语言),如下列法式所示,列出了其向量区,USART1的中断向量已用红色标识,当和USART1相关的中断发生时,法式指针(PC)在掩护现场后,直接指向到该向量。__Vectors       DCD     __initial_sp              ; Top of Stack       
发表于 2018-09-12

STM32F4 开发条记9:USB CDC驱动法式的详细移植历程

    本文详细介绍USB CDC驱动法式的移植历程。    1、凭据STM32F4 开发条记8:解决USB CDC “该设备无法启动”问题介绍的历程生成驱动法式后,找到如下图所示的文件加入到自己的项目工程中。    2、打开usbd_cdc_if.c文件,可以看到其中有,如下4个函数,其中Init、DeInit和Control函数都不需要改变,要害是Receive函数。static int8_t CDC_Init_FS(void);static int8_t CDC_DeInit_FS(void);static int8_t CDC_Control_FS(uint8_t
发表于 2018-09-12

将STemWin移植到在STM32F103RCT6上的FreeRTOS上

1、版本信息STM32固件库V3.5.0FreeRTOS V8.2.3STemWin 5.26Keil 42、移植步骤将FreeRTOS移植到STM32F103RCT6上,这个前面的博客有提到,课参考;添加LCD屏的驱动代码,在这个实验中使用的正点原子的MINI板,使用的ILI9341的驱动芯片,添加好并在裸机下测试可用;将STemWin 5.26相关文件添加到工程中,如下图 将涉及到的头文件路径加到工程的头文件路径中去修改GUIConf.c文件中的一处地方,这个地方凭据芯片来改,太大了编译会不通过,提示内存不足。如下图 在FreeRTOS建设一个任务来显示,效果如图  至此,就可以算是
发表于 2018-09-08
将STemWin移植到在STM32F103RCT6上的FreeRTOS上

STM32工程差异系列芯片间的移植

1.  芯片容量简直定,往往容易疏忽。小容量产物是指闪存存储器容量在16K至32K字节之间的STM32F101xx、 STM32F102xx和STM32F103xx微控制器。中容量产物是指闪存存储器容量在64K至128K字节之间的STM32F101xx、 STM32F102xx和STM32F103xx微控制器。大容量产物是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控制器。互联型产物是指STM32F105xx和STM32F107xx微控制器。2.  居动文件的选择,差异芯片选择差异的居动文件。官方库中STM32F10x_StdPeriph_Li
发表于 2018-09-01

stm32f105 spi 移植到stm32f103上

最近移植dw1000的法式,把stm32f105版本移植到103版本上去。(1)发现两者的区别主要在于时钟上,具体请参考stm32 datasheet:  将始终改掉之后,SPI就可以运行stm32f103上了。(2)PA15和PB3默认是用于JLINK的,需要启用复用时钟,代码如下: RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA ,ENABLE);    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);    GPIO_PinRemapConfig
发表于 2018-09-01
热门资源推荐
更多
  •  rar文件FATFS文件系统在STM32上的移植
  •  doc文件手机动画移植设计说明书
  •  pdf文件如何用STM32固件库来建设工程
  •  pdf文件STM32固件库_中文版_最完整版
  •  嵌入式硬件设计(第二版)
  •  初学嵌入式开发指点
  •  ARM9嵌入式系统设计与开发教程
  •  ARM启动代码分析——妙手手把手教你理解boot

小广播

热门运动
换一批
更多

【泰有聊】第二期:泰克CEO为你解读低噪声背后的科学

最新视频课程更多

 SimpleLink 系列产物的宁静性介绍
SimpleLink 系列产物的宁静性介绍
基于 TI MSP430 Scan Interface?技术的流量表解决方案
基于 TI MSP430 Scan Interface?技术的流量表解决方案
2018 TI SimpleLink? MCU 平台研讨会 - 回看
2018 TI SimpleLink? MCU 平台研讨会 - 回看
Simplelink 无线连接平台介绍
Simplelink 无线连接平台介绍
十天学会PIC单片机
十天学会PIC单片机

何立民专栏

单片机及嵌入式宝典

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

更多相关热搜器件

  •  MC68020RC33E
  •  ST72F325J6T3
  •  445I25K30M00000
  •  ASFLMPC-33.000MHZ-Z-T
  •  EFM32GG395F512-E-BGA120T
  •  CRT1-MD32S-1
  •  7C-100000MBE-T
  •  8N4Q001EG-1088CDI8
  •  LM2937ES-25-NOPB
  •  LM2853MHX-1.8
亿博娱乐平台版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright ? 2005-2018 EEWORLD.com.cn, Inc. All rights reserved