如何修改STM32的USB例程为自己所用

2020-01-16来源: eefocus关键字:STM32  USB例程  数据处理

如果要下载程序测试包请点击此处http://blog.ednchina.com/computer00/143918/message.aspx 

在万利学习板自带的演示例程中,有几个USB的例程。如果我们想实现一个USB功能,可以拿里面的例子来改。 

那么具体要改哪些地方呢?首先要改各种描述符,然后是具体的数据处理。我们拿USB摇杆鼠标范例来修改,把它改成USB键盘。该范例在目录/Manley/EKBoard/EKSTM32F/USBDemo(8M osc)/USBDemo/USBLib/demos/JoyStickMouse下,将JoyStickMouse复制一份,改名为USBKeyboard,以用来修改。 

描述符在文件usb_desc.c中。第一个要改的是设备描述符。设备描述符的结构都标准的,长度也是固定的。范例中的USB设备描述符如下: 


/* USB Standard Device Descriptor */ 
const u8 Joystick_DeviceDescriptor[JOYSTICK_SIZ_DEVICE_DESC]= 

0x12,                       /*bLength */ 
USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/ 
0x00,                       /*bcdUSB */ 
0x02, 
0x00,                       /*bDeviceClass*/ 
0x00,                       /*bDeviceSubClass*/ 
0x00,                       /*bDeviceProtocol*/ 
0x40,                       /*bMaxPacketSize40*/ 
0x83,                       /*idVendor (0x0483)*/ 
0x04, 
0x10,                       /*idProduct = 0x5710*/ 
0x57, 
0x00,                       /*bcdDevice rel. 2.00*/ 
0x02, 

1,/*Index of string descriptor describing 
                            manufacturer */ 
2,/*Index of string descriptor describing 
                          product*/ 
3,/*Index of string descriptor describing the 
                    device serial number */ 
0x01               /*bNumConfigurations*/ 
}; /* Joystick_DeviceDescriptor */ 

我们只需要修改这里的idVendor(即VID)和idProduct(即PID)即可。它们是用来供电脑端识别设备以加载驱动用的,所以必须不能跟现有的设备相冲突。VID和PID都是两字节,低字节在前,高字节在后。例如这里的VID为0x0483,写在里面就是0x83,0x04。我们将VID改成0x1234,将PID改成0x4321,即: 0x34, 0x12, 0x21, 0x43。 


然后再修改配置描述符集合。配置描述符集合包括配置描述符、接口描述符、类特殊描述符(这里是HID描述符)、以及端点描述符。如果你需要增加端点,那么在最后增加就行了,注意要记得修改JOYSTICK_SIZ_CONFIG_DESC的值为配置描述符集合的长度。第一部分为配置描述符。通常这里不需要修改,除非你要改成该配置有多个接口(USB复合设备),那么应该修改bNumInterfaces,需要多少个就改成多少个,这里只有一个接口,所以值为1。第二部分为接口描述符,在接口描述符中决定该接口所实现的功能,例如HID设备,或者是大容量存储设备等等。其中bInterfaceNumber为该接口的编号,从0开始。这里只有一个接口,所以它的值为0,如果又更多的接口,则依次编号。注意一个接口完整结束(包括该接口下的类特殊描述符和端点描述符)后,才开始一个新的接口。bNumEndpoints为该接口所使用的端点数目(不包括端点0),原来的程序是实现鼠标功能的,所以只有一个输入端点。我们这里增加一个输出端点,用来控制LED(键盘上有大写字母锁定、小键盘数字键锁定等指示灯),因此将bNumEndpoints改为2。bInterfaceClass为接口所使用的类,这里指定为HID设备,USB键盘和鼠标都是HID设备,这里不用修改,如果你要实现其它设备,请根据USB协议所规定的类来修改。bInterfaceSubClass为接口所使用的子类,在HID设备类下规定了两种子类,系统引导时能用的和不能用的,这里为1,表示系统引导时能使用。bInterfaceProtocol为接口的协议,原来为鼠标,这里改为1,键盘。第三部分为HID描述符,只有HID设备才有,如果你要修改成其它设备,则用其它设备的类特殊描述符代替或者没有,在这里不用做修改。第四部分为输入端点1的端点描述符,原来代码中,设置的端点最大包长度(wMaxPacketSize)为4字节,我们将其改成8字节。另外,我们再增加一个输出端点1,将最后的输入端点1描述符复制一份,然后修改地址(bEndpointAddress)为0x01,这表示该端点为输出端点,地址为1。由bEndpointAddress的最高位表示方向,1为输入,0为输出,最后4位表示地址。最后,要记得在usb_desc.h文件中修改JOYSTICK_SIZ_CONFIG_DESC的长度为41,因为我们增加了7字节。实际修改好的配置描述符集合如下: 


/* USB Configuration Descriptor */ 
/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ 
const u8 Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC] = 

//以下为配置描述符 
0x09, /* bLength: Configuation 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*/ 
0xC0,         /*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*/ 
0x03,         /*bInterfaceClass: HID*/ 
0x01,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ 
0x01,         /*bInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ 
0,            /*iInterface: Index of string descriptor*/ 
//以下为HID描述符 
/******************** 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, 

//以下为输入端点1描述符 
/******************** 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*/ 
0x08,          /*wMaxPacketSize: 8 Byte max */ 
0x00, 
0x20,          /*bInterval: Polling Interval (32 ms)*/ 
//以下为输出端但1描述符 
/* 34 */ 
0x07,          /*bLength: Endpoint Descriptor size*/ 
USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/ 
0x01,          /*bEndpointAddress: Endpoint Address (OUT)*/ 
0x03,          /*bmAttributes: Interrupt endpoint*/ 
0x08,          /*wMaxPacketSize: 8 Byte max */ 
0x00, 
0x20,          /*bInterval: Polling Interval (32 ms)*/ 
/* 41 */ 
}; 

[1] [2]
关键字:STM32  USB例程  数据处理 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic485839.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32 hex合并及一键烧写
下一篇:STM32系列芯片串口烧写工具

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8 GPIO 学习(驱动LED、Button)
STM8中GPIO寄存器有:输出寄存器(ODR),输入寄存器(IDR),方向寄存器(DDR),控制寄存器1(CR1)和控制寄存器2(CR2).后面三个寄存器组和可以配置为8种GPIO的模式定义如下:/**  * @brief General Purpose I/Os (GPIO)  */typedef struct GPIO_struct{  __IO uint8_t ODR; /*!< Output Data Register */  __IO uint8_t IDR; /*!< Input Data Register */  __IO uint8_t DDR
发表于 2020-01-19
STM8 GPIO 学习(驱动LED、Button)
STM8单片机STVD环境新建工程笔记
;workspace10.修改workspace的路径为我们自己新建的STVDcosmic下。11.项目名称、路径、编译器设置如下 STM8想用C语言编程,很多人都是用的STVD+COSMIC,安装cxstm8_FSE_stm32_32K.exe软件。这里说说STVD的编译的事情,STVD本身只支持汇编语言,想用C还得借助COSMIC,所以一些设置是必须的,就是在STVD下面选择COSMIC的编译文件(这个根据软件版本自行设置),下图用我的举例单单是把两个软件安装好,编译路径配置好,编译的时候肯定还会出现STM8官方头文件找不到的错误,网上也有解决办法,就是要把头文件复制到自己的工程下,在工程下面把头文件添加进来,这样每个工程都得弄一次,实在是
发表于 2020-01-19
STM8单片机STVD环境新建工程笔记
stm8使用iar刚开始烧录ok,用着用着就下载失败解决方案
用iar写代码的时候,用stlink 下载,再排除接线和烧录器问题,基本上都是要重新用stvp烧录下错误提示:Failed to set configuration with MCU name STM8S207MB: SWIM error [30006] xxxxxxx要是嫌麻烦,可以直接用svtp开发也行1.配置iar 输出s19格式点击rebuild all 生成.s19文件文件在Debug/Exe下打开ST Visual Programmer(STVP)并设置硬件连接方式和MCU型号,这里以ST-Link连接STM8S003F为例用swim方式导入要烧录的.s19文件,设置是否锁定芯片(可以不设置)点击下载按钮Program
发表于 2020-01-19
stm8使用iar刚开始烧录ok,用着用着就下载失败解决方案
stm8系列通过option_byte 来实现端口的remaping
最近在调 stm8,发现需要用到端口映射,研究下用option byte来修改首先确定需求需要使用PC6来发射方波,用到定时器1的ch1需要激活重定向三种方式可以实现,一种是通过IAR for stm8,一种是stvp,一种是在程序执行的时候去改通过程序写flash,这儿先介绍软件的方式IAR 改option byte打开IAR打开option bytes右击 选择 激活保存到制定位置右击打开option找到地方,勾选之后,在重新rebuil all 然后烧录就行了stvp这个就简单了打开,选择型号,点开option byte下拉框选一下,然后电机这个按钮就行了打完收工
发表于 2020-01-19
stm8系列通过option_byte 来实现端口的remaping
IAR for stm8安装破解
1.下载安装包和注册机链接:https://pan.baidu.com/s/1maBEtoyps2HhcdGYxmZUcA提取码:31dn复制这段内容后打开百度网盘手机App,操作更方便哦百度云下载下来这个样子:2.双点击EWSTM8-3104-Autorun安装同意,下一步到结束 。。。 中间会装几个驱动,装就是了装完退出,打完收工3. 注册IAR for STM8是一个收费的软件,官方严厉打击盗版,若你是商业用途,建议购买正版软件。当然,我这里是针对个人开发学习的朋友而言,进行非商业用途的使用。3.1 打开上面安装好的IAR for STM8软件(没有创建桌面快捷方式,可以从开始菜单打开软件)。 Help ->
发表于 2020-01-19
IAR for stm8安装破解
STM32 下载程序时,往flash固定位置写数据配置
1.就像参数定义时使用下面语句const unsigned char Flash_user_data[16] __attribute__((at(0X08080000))) ={            0x01,0x02,0x03,0x04,               0x01,0x01,0x03,0x03,     
发表于 2020-01-19
小广播
何立民专栏 单片机及嵌入式宝典

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

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