打印
[STM32F4]

授人以鱼不如授人以渔之USB应用 第一节:基于stm32cubemx 建...

[复制链接]
16149|88
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 z755924843 于 2017-3-13 13:37 编辑

来21ic也有几个年头,正所谓有索取必须有回报,看到大神们发的各种教学贴都是敬佩不易 ,由于本人最近一直在做usb相关的工作,从门外汉到现在可以说一般usb的问题都可以解决,在这之中经历了很多,看了好多本书比如《圈圈USB》《USB开发大全》《USB应用》等,也得到了论坛很多的帮助(比如小i)。但是我发现市面上关于usb的资料虽然很多但是特别的杂乱无章而且有些书籍完全落后与当前USB的发展,导致学习起来特别的费时费力,但是由于各个厂商都提供了各自的usb库,在实际应用上能够节省一些时间,usb可以说是“会了不难”,我想分享一下我的经验好让大家快速入门可以直接应用到工程中,提前声明我的经验是基于实际工程来做的,而其中关于usb的基础知识只是简单的说一下,想学的请自行百度吧,之前使用过atmel和stm32407的usb库,但是觉得stm32cubemx比较简单一些,可以自动生成usb例程,所以准备使用stm32的usb例程为大家推出一个系列教程(其实想推出一个视频教程来着,毕竟视频讲的更加详细,但是本人是一个腼腆型的理工男,所以想想还是算了。想和我交流的请加我的qq:1916365117):
第一节:基于stm32cubemx 建立usb工程和usb的基础知识

第二节:基于stm32f407实现usb鼠标(1个endpoint)和usb的运行过程

第三节:基于stm32f407实现usb键 (2个endpoint)

第四节:基于stm32f407实现usb鼠标+键盘1个Interface

第五节:基于stm32f407实现usb鼠标+键盘2个Interface

第六节:基于stm32f407实现usb鼠标+键盘+自定义设备

第七节:基于stm32f407实现usb大数据通信

第八节:基于stm32f407实现usb大数据传输(usb)+上位机libusb驱动简单操作
(备选:基于stm32f407主机读取U盘)


终极版:基于usb的stm32f407的bootloader的实现。
进入正题
第一节:基于stm32cubemx 建立usb工程和usb的基础知识
1.      打开stm32CubeMx(下图)点击New Project 选项
2.弹出选择芯片选项,选择STM32F407ZGTx芯片,点击OK按钮
3.      配置外设功能

1)  选择时钟:RCC->HighSpeed Clock中选择Crystal/Ceramic Resonator
2)  选择调试接口:SYS –>Debug中Serial Wire
3)  打开usb:USB_OTG_FS 中选择DeviceOnly
选择USB设备:USB_DEVICE ->Class For FS IP 中选择Human Interface Device Class(HID)
4.      配置时钟
我的板子外部时钟使用的是8M晶振,并且usb必须使用48MHz频率
5.      配置选项
    1)打开配置界面
   2)点击USB_DEVICE选项:
   将描述符修改按照下图修改
     
  3)点击USB_FS选项弹出以下界面,VBus Sensing 默认是Enable的,需要将它关闭disable,如果不关闭的话,就会出现其他功能正常,usb没有反应的问题,最开始调试的时候一直不知道问题所在,不停的新建工程浪费了不少时间。
   
  4)之后就可以点击生成按钮弹出下图:
   将LinkerSetting 都改成0x1000,这个设置堆栈大小,原来的大小是Heap size 是0x200,StackingSize 0x400,ST的认为已经足够了,但是对于新手来说这个空间是远远不够的。
   
6.点击OK生产工程

下面讲讲USB的基础知识:
USB,是英文Universal Serial Bus(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。USB接口支持设备的即插即用和热插拔功能。USB是在1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出的。
它的优点是即插即用并且支持的设备特别多,可以连接鼠标、键盘、打印机、扫描仪、摄像头、充电器、闪存盘、MP3机、手机、数码相机、移动硬盘、外置光驱/软驱、USB网卡、ADSL Modem、Cable Modem等,几乎所有的外部设备。而且现在基于usb3.0 的type-c更是风靡手机业。
USBOTG功能更是让USB无所不能
USB OTG是USB On-The-Go的缩写,是当前发展起来的技术,2001年12月18日由USB Implementers Forum公布,主要应用于各种不同的设备或移动设备间的联接,进行数据交换。特别是PDA、移动电话、消费类设备。改变如数码照相机、摄像机、打印机等设备间多种不同制式连接器,多达7种制式的存储卡间数据交换的不便。On-The-Go,即OTG技术就是实现在没有Host的情况下,实现从设备间的数据传送。例如数码相机直接连接到打印机上,通过OTG技术,连接两台设备间的USB口,将拍出的相片立即打印出来;也可以将数码照相机中的数据,通过OTG发送到USB接口的移动硬盘上,野外操作就没有必要携带价格昂贵的存储卡,或者背一个便携电脑。
USB拓扑:
USB是一种主从结构的系统,主机叫Host,从机叫做Device(设备)。通常主机具有1个或者多个USB主控制器(host controller)和根集线器(root hub),在windows的设备管理器中可以看到USB主控制器和USB根集线器。
USB数据交换只能发生在主机和设备之间,主机和主机,设备和设备之间不能直接互连和交换数据。
Usb的拓扑
USB硬件检测:
通用的在USB接口有四根线,分别是VBUS,D-,D+,GND。其中VBUS线是HOST/HUB向USB设备供电的电源线。
OTG的usb多了一个地址线
USB集线器的每个下游端口的D+和D-上,分别接了一个15K的下拉电阻到地。这样,当没有设备插入时,端口被拉低。而设备端的D+或D-会接一个1.5K上拉电阻,接到3.3V电源。其中全速和高速设备,在D+上接上拉电阻;而低速设备在D-上接上拉电阻;设备接入集线器后,接了上拉电阻的一端的电压经过上下拉电阻分压,降为3V左右。对集线器的接收端来说就是一个高电平。集线器检测到这个高电平信号,就通知USB控制器。集线器还可以通过判断这个高电平信号是D+还是D-,判断设备是什么速度的设备。USB高速设备首先被识别为全速设备,然后通过集线器和设备两者的确认,再切换到高速模式下。在高速模式下,使电流传输模式,这时要将D+的上拉电阻断开。
有机会的话读者可以自行测试一下。
USB的传输机制:
这个我只简单的说一下,在新手入门的时候还是不要深入了解这些,因为如果在没有了解usb整理的运行机制的话,很容易让初学者觉得USB太难了,机制太复杂了。所以我只是一带而过,当我们对USB有了初步了之后在回来看这些,就容易多了。
USB的传输发起者都是主机,,主机负责管理总线上的传输,从机则响应来自主机的通信。每个传输开始后都是使用定义好的格式发送数据信息、地址信息、错误检验以及状态等信息。
传输要素:
端点(endpoint):是设备的缓冲区,用来存储接收到的数据和准备发送的数据,每个端点都有特定的编号、传输方向、以及一次通信中最端点可发送或者接收的最大数据量
事务(transaction):每个usb传输由一个或者多个事务组成,这些事务都是从输入端点(IN)或者输出端点(OUT)取出
输入和输出(IN和OUT):输入和输出都是相对主机而言的,也就是说IN表示往主机输入,数据流向是从机->主机,OUT表示主机输出,数据流向是主机->从机
IN令牌包:想端点请求数据信息包
OUT令牌包:则是主机发送数据信息的先行信息。
除了数据外每个令牌包还有错误校验位,一个带有数据顺序值的信息包ID。
传输方式:
USB支持4中传输方式:控制传输、批量传输、中断传输、和同步传输
例:
控制传输:一般在设备刚开始来连接时(枚举)的时候使用控制传输
批量传输:大数据传输使用此类传输,比如U盘,打印机,扫描仪等
中断传输:数据量小的通信使用此类传输,键盘、鼠标等HI设备D就是使用中断传输
同步传输:对实时性要求比较高的使用此类传输,音频,视频等传输一般使用此类传输。
就先说到这里吧,下个教程我准备根据生成的stm32f407usbhid例程讲解一下usb的枚举过程,请大家多多支持。
注:

Usb枚举:在应用程序与设备通信之前,主机需要了解设备,并且为其分配驱动程序,枚举(enumeration)是完成上述任务的信息交换过程。可以说如果usb设备完成枚举过程的话,那么此设备就算完成80%了。所以说枚举很重要。


13.png (327.23 KB )

13.png
评论
mailshichao 2018-8-20 08:29 回复TA
楼主,后面的没有了吗 
13951763120 2018-7-19 20:45 回复TA
很好 
13951763120 2018-7-19 16:11 回复TA
不错 
评分
参与人数 2威望 +3 收起 理由
chinahmk + 1 很给力!
zhcj66 + 2 很给力!
沙发
whtwhtw| | 2017-3-13 13:51 | 只看该作者
支持一下,赞

使用特权

评论回复
板凳
slotg| | 2017-3-13 14:12 | 只看该作者
很好的教程,顶一个。

使用特权

评论回复
地板
cemaj| | 2017-3-13 15:12 | 只看该作者
上位机驱动怎么开发?

使用特权

评论回复
5
cemaj| | 2017-3-13 15:14 | 只看该作者
stm32cubemx这个没有用过。

使用特权

评论回复
6
zj763| | 2017-3-13 15:58 | 只看该作者
怎么说,准备写下去吗,可以出书了,顶一下

使用特权

评论回复
7
frognidie| | 2017-3-13 16:32 | 只看该作者
支持  希望楼主早日完成此贴

使用特权

评论回复
8
htmlme| | 2017-3-13 17:08 | 只看该作者
谢谢楼主分享的这么多的资料。

使用特权

评论回复
9
htmlme| | 2017-3-13 17:08 | 只看该作者
stm32cubemx这个平时没有用过的。

使用特权

评论回复
10
z755924843|  楼主 | 2017-3-13 17:16 | 只看该作者
cemaj 发表于 2017-3-13 15:12
上位机驱动怎么开发?

我的是libusb

使用特权

评论回复
11
z755924843|  楼主 | 2017-3-13 17:17 | 只看该作者
cemaj 发表于 2017-3-13 15:14
stm32cubemx这个没有用过。

可视化编程是一个趋势,之前我也不用。

使用特权

评论回复
12
z755924843|  楼主 | 2017-3-13 17:18 | 只看该作者
frognidie 发表于 2017-3-13 16:32
支持  希望楼主早日完成此贴

好的

使用特权

评论回复
13
gonghanling| | 2017-3-13 17:18 | 只看该作者

使用特权

评论回复
14
z755924843|  楼主 | 2017-3-13 17:18 | 只看该作者
htmlme 发表于 2017-3-13 17:08
stm32cubemx这个平时没有用过的。

可视化编程是一个趋势,开发起来难度低了很多。

使用特权

评论回复
15
df_flying| | 2017-3-13 17:48 | 只看该作者
mark mark USB一直想学

使用特权

评论回复
16
求学问路| | 2017-3-13 17:52 | 只看该作者
点赞

使用特权

评论回复
17
serialworld| | 2017-3-13 19:33 | 只看该作者
点赞

使用特权

评论回复
18
Serge_Ding| | 2017-3-13 21:09 | 只看该作者
顶一下,必须向楼主学习

使用特权

评论回复
19
huarana| | 2017-3-13 21:13 | 只看该作者
支持一下。 跟着你学习了。  一直想有类似的教程。 注重应用而不要深挖原理的。

顺便问一下,  stm32103是不是也能照猫画虎跟着学

使用特权

评论回复
20
yuntian| | 2017-3-13 21:54 | 只看该作者
不错,现在做一个HID的 ,可以在中断里接收数据,没什么功能是的时候,可以发数据给主机,慢慢的加了功能,居然发不了数据了,再继续找下原因,用CUBEMX确实很方便。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:嵌入式相关网站喜欢的朋友了解一下http://www.micropython.group

31

主题

260

帖子

39

粉丝