STM32的USB设计-单片机程序篇

发布者:Yuexiang888最新更新时间:2011-10-28 关键字:STM32  USB设计 手机看文章 扫描二维码
随时随地手机看文章

  首先,我们来看看usb的工作过程。

  当usb设备接入到主机时,主机开始枚举usb设备,并向usb设备发出指令要求获取usb设备的相关描述信息,其中包括设备描述(device descriptor)、配置描述(configuration descriptor)、接口描述(interface descriptor)、端点描述(endpoint descriptor)等。这些信息是通过端点0(endpoint 0)传送到主机的。获取各种描述信息后,操作系统会为其配置相应的资源。这样主机就可以与设备之间进行通信了。
 

  usb通讯有四种通讯方式控制(control)、中断(interrupt)、批量(bulk)和同步( synchronous)。usb通讯是通过管道(pipe)实现的。管道是一个抽象的概念,指的是主机与设备之间通讯的虚拟链路。不如说一个usb通讯 主机A和设备B,其中有bulk in(批量输入)、bulk out(批量输出)、control out(控制输出)三种通讯方式,那么A与B之间的通讯管道就有三个。(这里明确一个概念,在usb通信中数据流向都是相对设备来说的,in表示设备向主 机传送数据,out表示表示主机箱设备传输数据)。在设备一端,每个管道对应一个端点,端点配置相关的寄存器和缓冲区。在通讯之前需对端点进行相关设置。 在通信中,只需向缓冲写或读数据,并置位相关比特位即可。

  下面具体从usb的中断输入输出来讲述基于keil C mdk开发环境的stm32的USB接口单片机程序设计。值得一提的是,st或相关公司给我们提供许多封装函数和相关例子,我们可以根据其中的例子并进行修改即可实现我们自己需要的usb通讯程序。

  1.usb描述符配置

  从上面的讲述可以看出,usb描述符是usb通讯的前提。主机必须先了解设备后才能与其进行通讯。在st提供的例子中,描述符都在usb_des.c文件进行定义,下面就其中的Joystick例子说明usb描述负的配置。

  1.1设备描述符

  const u8 Joystick_DeviceDescriptor[JOYSTICK_SIZ_DEVICE_DESC] =

  {

  0x12, /*本描述长度*/

  USB_DEVICE_DESCRIPTOR_TYPE, /*指明为设备描述符*/

  0x00,

  0x02,

  0x00,

  0x00,

  0x00,

  0x40, /*最大数据包大小为64字节(对于端点0而言)*/

  0x84, /*生产商ID*/

  0x19,

  0x06, /*产品ID*/

  0x04,

  0x00,

  0x02,

  1,

  2,

  3,

  0x01 /*配置描述符数目*/

  }

  设备描述符两个重要参数是生产商ID和产品ID,主机将根据以上两个ID为设备选择相应驱动程序。在我们的应用中,我们一般只需修改例子中的这儿两个参数即可完成设备描述符的设置。

  1.2配置描述符

  const u8 Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC] =

  {

  0x09,

  USB_CONFIGURATION_DESCRIPTOR_TYPE,

  JOYSTICK_SIZ_CONFIG_DESC,

  0x00,

  0x01, /*接口数目*/

  0x01, /*Set_Configuration命令所需要的参数值*/

  0x00, /*描述该配置的字符串的索引值*/

  0xE0, /*供电模式的选择,bus供电、自供电、支持wakeup*/

  0x32, /*最大供电电流*/

  /************** 接口1配置****************/

  0x09,

  USB_INTERFACE_DESCRIPTOR_TYPE,

  0x00, /*接口编号*/

  0x00,

  0x02, /*端点数*/

  0x00,

  0x00,

  0x00,

  0, /*接口描述符索引值*/

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

  0x07,

  USB_ENDPOINT_DESCRIPTOR_TYPE,

  0x81, /*端点地址,b.7表示方向(1为in,0为out)b.0-b.3为端点标号*/

  0x03, /*端点数据传输方式*/

  0x08, /*最大数据包大小*/

  0x00,

  0x20,

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

  0x07,

  USB_ENDPOINT_DESCRIPTOR_TYPE,

  0x01, /*端点地址*/

  0x03, /*端点数据传输方式*/

  0x40, /*最大数据包大小*/

  0x00,

  0x20,

  }

  配置描述符中包括了接口、端点的配置。如果设备为HID设备,在配置描述符中还应加入HID描述,具体描述可以参照Joystick例子的配置。

  还有一些其他配置可以参可相关资料与例子加以理解。

关键字:STM32  USB设计 引用地址:STM32的USB设计-单片机程序篇

上一篇:基于ARM和DSP架构的多处理器高速通信协议设计
下一篇:ARM公布64位架构 触角延伸到服务器

推荐阅读最新更新时间:2024-03-16 12:44

STM32标准库SPI的初始化
SPI的初始化比较简单,但是能明白原理是最好的,毕竟出了问题以后好排除。 SPI的初始化过程: 1、初始化GPIO 2、初始化SPI_InitStructure结构体 3、使能SPI外设 SPI的初始化结构体如下图所示: typedef struct { uint16_t SPI_Direction; uint16_t SPI_Mode; uint16_t SPI_Daize; uint16_t SPI_CPOL; uint16_t SPI_A; uint16_t SPI_NSS; uint16_t SPI_BaudRatePr
[单片机]
关于在Bootloader模式下的应用程序下载
1.引言 STM32 MCU 在 bootloader 模式下,可以通过多种可用外设(USART、CAN、USB、I2C、SPI等)将程序下载到内部存储器中,详细内容可参考应用笔记 AN2606《STM32 microcontroller system memory boot mode》。本文档主要介绍利用 STLINK-V3SET 调试/编程工具的 I2C 接口将程序下载到 SDRAM 中并执行的方法。 2.问题描述 问题源自客户的实际需求,希望通过 I2C 接口将程序下载到 SRAM 中执行,进行芯片功能性测试。 3.问题分析与定位 关于在 Bootloader 模式下的应用程序下载,有多篇 LAT 可参考。例如《如何使用
[单片机]
关于在Bootloader模式下的应用程序下载
详解STM32中的ADC
ADC简介 STM32F103系列有3个ADC,精度为12位,每个ADC最多有16个外部通道。其中ADC1和ADC2都有16个外部通道,ADC3一般有8个外部通道,各通道的A/D转换可以单次、连续、扫描或间断执行,ADC转换的结果可以左对齐或右对齐储存在16位数据寄存器中。ADC的输入时钟不得超过14MHz,其时钟频率由PCLK2分频产生。 ADC功能框图讲解 学习STM32开发板上的外设时首先要了解其外设的功能框图,如下: 功能框图可以大体分为7部分,下面一一讲解: 电压输入范围 ADC所能测量的电压范围就是VREF- ≤ VIN ≤ VREF+,把 VSSA 和 VREF-接地,把 VREF+和 VDDA 接 3V3,得
[单片机]
STM32的GPIO输入输出的几种模式的总结
最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD开漏输出 (6)GPIO_Mode_Out_PP推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 对于刚入门的新手,我想这几个概念是必须得搞清楚的,平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但一直未曾对这些做过归纳。因此,在这里做一个总结:
[单片机]
<font color='red'>STM32</font>的GPIO输入输出的几种模式的总结
STM32 IO 问题
今天调试一块板子出现如下问题: 某口 PB5,用某个芯片的复位工作。 配置如下: #define GPIO_PIN_REST GPIO_Pin_5 GPIO_InitStructure.GPIO_Pin = GPIO_PIN_REST; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIOB- BSRR = GPIO_Pin_5 ; jlink调试,观看GPIOB,keil显示是Pin 为1 但是芯片实际测量管脚的电压却是0V。搞定不懂 后面改为:GPIO_Ini
[单片机]
STM32的启动模式
刚开始接触STM32,最先遇到的问题就是下载程序。我按照教程,使用串口下载,感觉很简单。但是,最近需要使用LCD12864,就把以前的MSP430上的程序移植了一下,结果我发现了一个奇怪的现象,每次下载完程序后,断电,再上电后,液晶屏就不再显示了。这让我感到无比的头疼,因为我总以为是我的程序有问题,反反复复修改了好多遍,经过几个小时的调试,我最终找到了问题的缘由:那就是启动模式。 STM32不同于51或者430的地方是,它有两个管脚:BOOT0,BOOT1用来控制单片机上电复位后启动的位置。如下图所示: ● 第一种启动方式是最常用的用户FLASH启动,正常工作就在这种模式下,STM32的FLASH可以擦出10万次,所以不用
[单片机]
<font color='red'>STM32</font>的启动模式
stm32 串口的printf函数重定向
串口的printf函数重定向分为2种情况:使用MicroLIB库与不使用MicroLIB库,具体实现代码见下: #if 1 /*****************不使用MicroLIB库需加上该部分****************************/ // 取消ARM的半主机工作模式 //#pragma import(__use_no_semihosting) // 确保没有从C库链接使用半主机的函数 // //struct __FILE // 标准库需要的支持函数 //{ // int handle; //}; //FILE __stdout; // FILE is typ
[单片机]
认识STM32的复位与电源管理
复位功能是一个非常重要的功能,大到PC,小到单片机,每一台计算机系统都有。在我小时候,去网吧的时候,但凡是电脑出现任何一点小问题,网管的第一回答一定是重启。重启和复位就是同一个意思。 发展到现在PC已经很稳定了,复位按钮慢慢的淡出我们的视野,但是在主板上我们依然可以找到复位电路的存在。单片机上的复位功能也有着类似的变化,在我们学单片机那个年代,需要在单片机的外部一个复位电路,从专用引脚上接一个电阻和电容组成的复位电路。如果没有这个电路,单片机就没法工作。现在的新款单片机都把复位功能内置到单片机中。如果是开发项目要手动复位,我们可以在复位引脚上接一个按键用来手动复位。 复位 复位功能的作用是让RAM 中的数据清空,让所有连接
[单片机]
认识<font color='red'>STM32</font>的复位与电源管理
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved