当前位置:首页 > 单片机 > 单片机
[导读]如何建立一个自定义的HID工程呢?下面就来讲讲。首先先介绍下工程的架构,工程的总体架构下图所示,按照下图架构建工程:分析下工程布局,首先是APP,这个组里存放着主文件mian.c,管理所有中断服务程序stm3210x_it.

如何建立一个自定义的HID工程呢?下面就来讲讲。

首先先介绍下工程的架构,工程的总体架构下图所示,按照下图架构建工程:

分析下工程布局,首先是APP,这个组里存放着主文件mian.c,管理所有中断服务程序stm3210x_it.c,及其管理外设库头文件的stm32f10x_conf.h。BSP这个组里存放着BSP.c,外设的洗衣初始化都在这个函数中定义,比如说串口的配置,LED灯的配置,系统时钟的配置,各类NVIC的中断配置。在这个文件中,会定义一个BSP_Init()函数,所有配置的都在这个函数中调用,例如:


void BSP_Init(void)

{

RCC_Configuration();

Set_USBClock();

USB_Init();

USART1_Configuration(115200);

LED_Configuration();

NVIC_Configuration();

USB_Interrupts_Config();

}


而这个BSP_Init()函数在main中调用,这样就使主函数简洁漂亮了。至于CMSIS这个组则是关于Cotex-M3内核的相关文件看,如core_cm3.c和system_stm32f10x.c。StartUp这个组放置系统的启动文件,不同系类的处理器使用不同的启动文件,这里有必要了解:

- startup_stm32f10x_ld_vl.s: for STM32 Low density Value line devices

- startup_stm32f10x_ld.s: for STM32 Low density devices

- startup_stm32f10x_md_vl.s: for STM32 Medium density Value line devices

- startup_stm32f10x_md.s: for STM32 Medium density devices

- startup_stm32f10x_hd.s: for STM32 High density devices

- startup_stm32f10x_xl.s: for STM32 XL density devices

- startup_stm32f10x_cl.s: for STM32 Connectivity line devices


cl:互联型产品,stm32f105/107系列

vl:超值型产品,stm32f100系列

xl:超高密度产品,stm32f101/103系列

ld:低密度产品,FLASH小于64K

md:中等密度产品,FLASH=64 or 128

hd:高密度产品,FLASH大于128


我的这个工程选择高密度型的:startup_stm32f10x_hd.s。USB_User文件组放着USB控制与应用相关的文件,在之前的文章每个文件都详细介绍过。接着是USB-FS-Device_Driver这个组放着USB的驱动,在之前的文章页已经讲述过。最后一个组是STM32F10x_StdPeriph_Driver,它里面存放着外设库文件的驱动代码,很多人为了省事,会把所有的C文件都添加进来,我不建议这么做,还是根据需要添加对应的文件,就拿我们的这个CustomHID工程,我们用到了引脚GPIO、时钟的配置,串口的配置,所以只要添加这几个对应的C库文件就可以了。

上面的各个文件大部分可以网上下载的。



接下去就讲述如何实现CustomHID功能的。

首先,最重要的文件当然是usb_desc.c这个文件了。这个文件存放着各种描述符,比如说设备描述符、配置描述符等,下面就一一介绍。

设备描述符符的定义如下:

/* USB标准设备描述符*/

const uint8_t CustomHID_DeviceDescriptor[CUSTOMHID_SIZ_DEVICE_DESC] =

{

0x12, /*bLength:长度,设备描述符的长度为18字节*/

USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType:类型,设备描述符的编号是0x01*/

0x00, /*bcdUSB:所使用的USB版本为2.0*/

0x02,

0x00, /*bDeviceClass:设备所使用的类代码*/

0x00, /*bDeviceSubClass:设备所使用的子类代码*/

0x00, /*bDeviceProtocol:设备所使用的协议*/

0x40, /*bMaxPacketSize:最大包长度为64字节*/

0x34, /*idVendor:厂商ID为0x1234*/

0x12,

0x10, /*idProduct:产品ID为0x1010*/

0x10,

0x00, /*bcdDevice:设备的版本号为2.00*/

0x02,

1, /*iManufacturer:厂商字符串的索引*/

2, /*iProduct:产品字符串的索引*/

3, /*iSerialNumber:设备的序列号字符串索引*/

0x01 /*bNumConfiguration:设备有1种配置*/

}; /* CustomHID设备描述符 */


设备描述符的数组的长度一般为9个字节,该描述符定义了USB协议代号、厂商ID(VID),产品ID(PID)、设备的版本号、以及厂商产品序列号描述符的索引。在USB枚举阶段,USB设备需要通过端口0向USB主机发送设备描述符。

配置描述符集合里有着丰富的USB设备的信息,如用了几个接口,用了几个端点,USB设备做什么用等。代码如下:

/* USB配置描述符集合(配置、接口、端点、类、厂商)(Configuration, Interface, Endpoint, Class, Vendor */

const uint8_t CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] =

{

0x09, /*bLength:长度,设备字符串的长度为9字节*/

USB_CONFIGURATION_DESCRIPTOR_TYPE, /*bDescriptorType:类型,配置描述符的类型编号为0x2*/

CUSTOMHID_SIZ_CONFIG_DESC, /*wTotalLength:配置描述符的总长度为41字节*/

0x00,

0x01, /*bNumInterfaces:配置所支持的接口数量1个*/

0x01, /*bConfigurationValue:该配置的值*/

0x00, /*iConfiguration:该配置的字符串的索引值,该值为0表示没有字符串*/

0xC0, /* bmAttributes:设备的一些特性,0xc0表示自供电,不支持远程唤醒

D7:保留必须为1,D6:是否自供电,D5:是否支持远程唤醒,D4~D0:保留设置为0*/

// 0x32, /*从总线上获得的最大电流为100mA */

0x96, /*MaxPower:设备需要从总线上获取多少电流,单位为2mA,0x96表示300mA*/


/************** HID接口描述符****************/

0x09, /*bLength:长度,接口描述符的长度为9字节 */

USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType:接口描述符的类型为0x4 */

0x00, /*bInterfaceNumber:该接口的编号*/

0x00, /*bAlternateSetting:该接口的备用编号 */

0x02, /*bNumEndpoints:该接口所使用的端点数*/

0x03, /*bInterfaceClass该接口所使用的类为HID*/

0x00, /*bInterfaceSubClass:该接口所用的子类 1=BOOT, 0=no boot */

0x00, /*nInterfaceProtocol :该接口使用的协议0=none, 1=keyboard, 2=mouse */

0, /*iInterface: 该接口字符串的索引 */


/*****************HID描述符 ********************/

0x09, /*bLength: HID描述符的长度为9字节 */

HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID的描述符类型为0x21 */

0x10, /*bcdHID: HID协议的版本为1.1 */

0x01,

0x00, /*bCountryCode: 国家代号 */

0x01, /*bNumDescriptors: 下级描述符的数量*/

0x22, /*bDescriptorType:下级描述符的类型*/

CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: 下一集描述符的长度*/

0x00,


/********************输入端点描述符******************/

0x07, /* bLength: 端点描述符的长度为7字节*/

USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: 端点描述符的类型为0x21*/

0x82, /* bEndpointAddress: 该端点(输入)的地址,D7:0(OUT),1(IN),D6~D4:保留,D3~D0:端点号*/

0x03, /* bmAttributes: 端点的属性为为中断端点.

D0~D1表示传输类型:0(控制传输),1(等时传输),2(批量传输),3(中断传输)

非等时传输端点:D2~D7:保留为0

等时传输端点:

D2~D3表示同步的类型:0(无同步),1(异步),2(适配),3(同步)

D4~D5表示用途:0(数据端点),1(反馈端点),2(暗含反馈的数据端点),3(保留),D6~D7:保留,*/

0x40, /* wMaxPacketSize: 该端点支持的最大包长度为64字节*/

0x00,

0x02, /* bInterval: 轮询间隔(2 ms) */

/********************输出端点描述符******************/

0x07, /* 端点描述符的长度为7字节 */

USB_ENDPOINT_DESCRIPTOR_TYPE,/* bDescriptorType: 端点描述符的类型为0x21*/

0x01, /* bEndpointAddress: 该端点(输出)的地址,D7:0(OUT),1(IN),D6~D4:保留,D3~D0:端点号*/

0x03, /* bmAttribute

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭