stm32 usb和安卓手机的通讯过程

2020-03-25来源: eefocus关键字:stm32  usb  安卓手机  通讯过程

前段时间公司开发了一个安卓外设,主要是用某宝淘来的demo 在stm32F103的usb功能来和安卓设备的usb来通讯


叙述之前先来一个整体的框图吧:

在这里插入图片描述

需要准备的设备有:


①.安卓手机或者安卓pad,(手机必须支持otg功能,否则就得用host功能了)

②.otg转接线或者转接头

③.安卓数据线(一定要是能通讯数据的线缆,有些山寨的这个线只有2根线,没有数据线)

④.带有usb功能的单片机(这个usb需要能支持用户自行定义)


接下来就开始捣鼓stm32单片机的程序了,下面是usb功能的代码:

usb功能看了一下主要是借助hid的标准协议上衍生而来的一个usb标准设备


/******************** (C) COPYRIGHT 2010 STMicroelectronics ********************

* File Name          : usb_desc.c

* Author             : MCD Application Team

* Version            : V3.2.1

* Date               : 07/05/2010

* Description        : Descriptors for Mass Storage Device

********************************************************************************

* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS

* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.

* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,

* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE

* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING

* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.

*******************************************************************************/


/* Includes ------------------------------------------------------------------*/

#include "usb_desc.h"

/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/

/* Private macro -------------------------------------------------------------*/

/* Private variables ---------------------------------------------------------*/

/* Extern variables ----------------------------------------------------------*/

/* Private function prototypes -----------------------------------------------*/

/* Private functions ---------------------------------------------------------*/


/* USB Standard Device Descriptor */


const u8 CustomHID_DeviceDescriptor[CUSTOMHID_SIZ_DEVICE_DESC] =

  {

    0x12,                       /*bLength */

    USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/

    0x00,0x02,                  /*bcdUSB */

    0x00,                       /*bDeviceClass*/

    0x00,                       /*bDeviceSubClass*/

    0x00,                       /*bDeviceProtocol*/

    0x08,                       /*bMaxPacketSize40*/

    0x71,0x04,                  /*idVendor (0x0471)*/

    0x08,0x24,                  /*idProduct = 0x2408*/

    0x00,0x02,                  /*bcdDevice rel. 2.00*/

    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*/

  }

  ; /* CustomHID_DeviceDescriptor */



/* USB Configuration Descriptor */

/*   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */

const u8 CustomHID_ConfigDescriptor[ENEPOINT_NUM*7+18] =

  {

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

    USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */

    ENEPOINT_NUM*7+18,    /*CUSTOMHID_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: Bus powered */

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


    /************** Descriptor of Custom HID interface ****************/

    /* 09 */

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

    USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType: Interface descriptor type */

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

    0x00,         /* bAlternateSetting: Alternate setting */

    ENEPOINT_NUM,         /* bNumEndpoints */

    0x00,         /* bInterfaceClass: HID=0X03,其他选0 */

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

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

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

    /********************以下只对HID的描述符  Descriptor of Custom HID HID ********************/

    /* 18 */

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

  //  HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */

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

  //  0x01,

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

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

  //  0x22,         /* bDescriptorType */

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

  //  0x00,

  

  

  /******************** Descriptor of Custom endpoints ******************/

   

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

    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */

/* Endpoint descriptor type */

    0x01, /* bEndpointAddress: */

/* Endpoint Address (OUT) */

    USB_ENDPOINT_TYPE_BULK,/* bmAttributes: Interrupt endpoint */

    0x10,0x00, /* wMaxPacketSize: 32 Bytes max  */

    0x20, /* bInterval: Polling Interval (20 ms) */

    

   /* 27 */  

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

    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */

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

  USB_ENDPOINT_TYPE_BULK,          /* bmAttributes: Interrupt endpoint */

    0x10, 0x00,         /* wMaxPacketSize: 32 Bytes max */

    0x20,          /* bInterval: Polling Interval (32 ms) */

    /* 34 */

    

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

    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */

/* Endpoint descriptor type */

    0x82, /* bEndpointAddress: */

/* Endpoint Address (OUT) */

    USB_ENDPOINT_TYPE_BULK,/* bmAttributes: Interrupt endpoint */

    0x40,0x00, /* wMaxPacketSize: 512 Bytes max  */

    0x20 /* bInterval: Polling Interval (20 ms) */   

  }

  ;


/* USB String Descriptors (optional) */

const u8 CustomHID_StringLangID[CUSTOMHID_SIZ_STRING_LANGID] =

  {

CUSTOMHID_SIZ_STRING_LANGID,

USB_STRING_DESCRIPTOR_TYPE,

0x09,

0x04

  }

  ; /* LangID = 0x0409: U.S. English */


const u8 CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR] =

  {

    CUSTOMHID_SIZ_STRING_VENDOR, /* Size of Vendor string */

    USB_STRING_DESCRIPTOR_TYPE,  /* bDescriptorType*/

    /* Manufacturer: "STMicroelectronics" */

'O', 0,

'T', 0,

'G', 0,

  };


const u8 CustomHID_StringProduct[CUSTOMHID_SIZ_STRING_PRODUCT] =

  {

    CUSTOMHID_SIZ_STRING_PRODUCT,          /* bLength */

    USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */

'S', 0,

'T', 0,

'M', 0,

'3', 0,

'2', 0,

'A',0,

'n',0,

'd',0,

'r',0,

'o',0,

'i',0,

'd',0,

' ',0,

'U',0,

'S',0,

'B',0,

' ',0,

'O', 0,

'T', 0,

'G', 0,

  };

u8 CustomHID_StringSerial[

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

上一篇:利用树莓派打造STM32无线在线调试器!
下一篇:stm32在linux编译,远程调试

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

推荐阅读

stm8l低功耗系列
最近干刚做了一个stm8的项目用的是L低功耗系列,其中遇到一个问题。外设寄存器的值怎么都写入不进去。用IAR仿真产看寄存器的值,不论写进去多少,都是初始值。后来把所有寄存器都写了一遍,发现有的能写进去,有的写不进去。比如GPIO的寄存器就能写进去。百思不得姐,偶然查看clock的库函数发现个函数是设置外设时钟的。这个系列,亦或者整个低功耗系列的每个外设是不是都需要在时钟寄存器中单独设置时钟。(以前所使用的芯片都是在外设寄存器中使能或者是禁使能)
发表于 2020-03-09
STM8L+BC26双低功耗,微安
现在在做一个项目需要用到STM8L和BC26。长时间断链后连接下服务器,并且发送一下当前状态,需要用到STM8L和BC26的低功耗。STM8L低功耗,这里用HALT模式,RTC规定时间唤醒。第一步需要关闭所有外设,把所有管脚为设置为输出,并且输出低,管脚根据具体环境设置,需要输出高电平的则输出高电平。在关闭外设的是后是需要先_DeInit,然后在关闭外设始终,有点需要特别主要,要把在进入halt模式的时候需要把所有的中断的标志位清空,否则使用RTC唤醒则会不起作用。第二步就设置低功耗的一些配置。第三步配置完成后进入低功耗。项目中需要用到外部高速始终和BC26通信,所以在进入和退出halt模式的时候需要重新初始化active模式下的
发表于 2020-03-09
stm8l151低功耗程序架构,调试心得
最近帮医院做了一款体温记录仪,整个硬件方案资源是:stm8L151 + NTC*2 + EEPROM + 锂电池充电保护电路 + 18mAh纽扣电池;软件逻辑是,每隔一分钟,采样两路温度并保存在EEP里;通过USB转TTL,上位机能够读取,展示温度曲线,最大最小平均值等简单的运算;整个方案很简单,但也走了不少弯路......单片机程序框架之伪代码:void main(void){    CLK_Config();    GPIO_Config();    ADC_Config();    USART_Config();   
发表于 2020-03-09
STM8s外部时钟晶振失效时钟安全系统CSS启动演示
使用的最小系统晶振是8m的。这里说下配置过程:时钟自动切换,开启切换中断在中断里面清除中断标志,使能CSS并开启CSS中断CSS中断发生,清除CSS中断标志,将HSI二分频,即16M/2=8M,与外部晶振相同,这样不会影响串口波特率窗口输出配置信息:用手触碰PA1、PA2引脚使外部晶振失效串口输出CSS中断
发表于 2020-03-09
STM8s外部时钟晶振失效时钟安全系统CSS启动演示
STM8S103之时钟设置
最大时钟(指的是system clock):外部晶振24MHz,内部高速RC16MHz三个时钟源:外部晶振、内部高速RC(上电默认) +内部低速RC几个时钟:master clock(即sytem clock),fcpu,外设时钟、AWU时钟调用库函数中CLK_ClockSwitchConfig,参考库函数clk_clockselection,但是分频还得进一步设置上电默认:内部高速RC,HSIDIV=/8,CPUDIV=/1,外部时钟全使能,查看相关寄存器的Reset value
发表于 2020-03-09
STM8S103之时钟设置
stm8 16M晶振下精确软件延时
void inerDelay_us(unsigned char n) {for(;n>0;n--) { asm("nop"); //在STM8里面,16M晶振,_nop_() 延时了 333nsasm("nop"); asm("nop"); asm("nop"); }}//---- 毫秒级延时程序----------------------- void Delayms(unsigned int time) { unsigned int i; 
发表于 2020-03-08
小广播
何立民专栏 单片机及嵌入式宝典

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

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