你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【转】STM32F103系列USB的学习过程及使用心得

[复制链接]
feixiang20 发布时间:2017-5-20 22:35
一、我的目地:
' X  }+ r/ D0 x  @- X! z+ j4 Y4 \1 @对于通信技术,在掌握stm32的spi,iic,USART等后,发现STM32的USB也是很好用的,对于一般的低速USB通讯任务(<1MB/s)还是可以胜任的,现在也有很多专用于USB通信的芯片,性能高于STM32的USB,但stm32的USB外设集成在了主芯片上,很便于开发。
" o4 v  u0 x# C二、我的学习过程:
, E4 }5 ?6 L" g1、移植官方库:
' I2 Q/ V" k& N5 u* F$ m" F(1)官方库下载后,需要根据头文件路径,设置“Option for Target”的“C/C++”选项下的“include path",之后选择自己MDK已安装的芯片类型,就可以编译了。
3 r7 h3 Q8 ~& |9 n. S$ {& U4 |(2)对于官例,参照官方的说明文档,调试基本都可以成功,但是由于st的win7驱动做的不是很好,对于usb转串口和音频输出的例程可能调试不成功。如果需要开发Windows驱动的话,这方面的知识我还在学习……Orz) M8 O: u/ o& N* K7 [2 v
(3)对于我来说,官例的HID和Mass Storage是比较有用的,因为不用开发驱动(/ □ \),所以我只认真看了这俩个的官例。$ {) M, E; n6 Y+ H
2、学习USB协议
/ F* X# M  |: T: L(1)移植好STM32的官例后,想根据自己的需求更改成自己的程序,就需要学习USB的协议了,查阅USB官网,下载USB2.0的协议和HID的协议啃一啃英文文档。( \& y( e6 t/ k$ K" S# J+ T2 ~
(2)在网上搜索相关USB协议的内容,论坛和电子书之类的,简单列一下我看过的比较好的一些资源,学习协议的话先看《圈圈教你玩USB》,了解一下整体开发流程,之后在看一些嵌入式开发USB的书,如《USB应用开发实例详解》和《计算机USB系统原理及其主-从机设计》,学习之后能自己编写一下上下位机的通信软件,对学习USB协议会有所帮助。
  z+ ~+ q! S8 \: S, i- q6 f' Z! F- P3、根据需求开发自己的上下位机
# q% b" Y  F' [) \8 E, j; u(1)开发上位机,用Windows的HID相关的API,开发一个基本的USB-HID通信收发程序。, M* ]& o" _2 ?( H
(2)根据stm32的官例修改些文件,但主要是要注意修改stm32的端点收发地址,在usb_conf.h里,各个端点的地址间隔为64,及0x40,否则会丢数据的,这块而坑了我好久……(/ □ \)$ ]" t' g. o- ~3 G! i5 U
(3)按照HID的协议标准写好自己的描述符,这块儿知识比较杂,可以参照网上的知识,先能用再说,弄懂的话需要花些功夫啊……Orz+ B5 _8 C( e% }/ u# Q
(4)之后就是写一些数据处理了,对于stm32的全速hid设备,使用中断协议收发数据,一包最大长度64字节,很多网上的大于64字节传输例子都是拆包实现的,这块儿也有待深学stm32的底层。
2 v* e, U) w% i$ I( @7 h" G
6 u; F& x8 \# \' `7 T$ R( v' F
收藏 4 评论8 发布时间:2017-5-20 22:35

举报

8个回答
feixiang20 回答时间:2017-5-20 22:36:01
在熟悉USB的协议后,感觉能自己做出些东西的就是HID协议了,因为HID的设备对于上位机开发容易很多,不用涉及各个操作系统和USB主设备的等等知识。按照HID协议写好的下位机程序,在stm32的芯片上跑起来,电脑就会识别出来的。3 S5 k9 }3 O8 b  Y
而且ST官方有个测试HID设备的Windows小软件,也很方便,省的自己开发上位机了) q6 M, a: R4 `" Y
1、对HID设备的理解1 c/ Q+ B- p" z3 D
(1)对于stm32的HID设备编程,最核心的就是对报告描述符的定义,具体内容在USB官网的HID版面里可以下载协议书和Usage Table来自定义HID设备;
6 e6 I/ f- s9 |(2)USB的官网有给一个名为HID descriptor tool的报告描述符生成工具,对于报告描述符的查错很有用,想自己写一份完整的HID报告描述符还得靠协议文档。但是可以先采用一些网上和stm32官例的代码先跑跑程序,看看效果,增加一下自己学习的动力。
% |+ n0 ^) m9 V# D2、使用HID协议的报告描述符8 O. D7 n9 V- l. c1 w
(1)在程序中我没使用报告ID,所以默认向0号ID发送包,(这里补充一下,我的自定义全速USB设备一个USB数据包为64字节,但是发送传输过程中,stm32会在之前加个报告ID,为一个字节的宽度),所以,上位机发送和接收信息只能在0号ID,其实这个ID很有用,主要是区分不同数据的,因为HID控制一般传输的都是少量字节数据,很少发整一包64字节,对于数据的分类很有帮助,而且很多HID设备都是二进制形式的状态数据,是按bit为单位进行控制通信的,用不着要收发字符串。
1 x& d% x' L$ J7 T; K; |(2)为了通信测试,我直接按字节传输,就是上下位机收发字符串,没有对HID报告描述符的input、output和feature做太多定义) ?. i! [+ C. h/ ^: h7 T
eg:
& a: h" z# J/ W% {, q# g0x05, 0x8c, /* USAGE_PAGE (ST Page) */ 5 A& [. c' R9 z+ A
0x09, 0x01, /* USAGE (Demo Kit) */   L$ o" e7 w  t1 H/ S% I& e
0xa1, 0x01, /* COLLECTION (Application) */
8 u* Z/ r* J* D2 l# a
/ S( B( D' j9 t. G// The Input report 9 ]6 g7 M/ Q2 G4 u) Q
0x09,0x01, // USAGE ID - Vendor defined 6 O1 \( I4 j, g9 C6 \- u& u
0x15,0x00, // LOGICAL_MINIMUM (0)
& P& D1 Y. \0 t0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255) 7 ]6 G! p) U) m  t/ S1 @; P- V1 e
0x75,0x08, // REPORT_SIZE (8bit) ) l5 A3 L2 [. F5 I
0x95,0x40, // REPORT_COUNT (64Byte) ) f' _) c3 u. e! {
0x81,0x02, // INPUT (Data,Var,Abs)
1 F# j# L- W' H) F
( ~1 z. \, w, v8 i  `& J9 R// The Output report ! N, c  |. w0 H4 _, r- W
0x09,0x02, // USAGE ID - Vendor defined
) A/ \3 k( M" m8 D8 J: t+ o0x15,0x00, // LOGICAL_MINIMUM (0) * M5 J4 E# [5 W2 i0 R7 i0 o
0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255) 3 X* B* ~& l. r( m4 W
0x75,0x08, // REPORT_SIZE (8bit) ' O& s  F$ R) g/ |! f' p
0x95,0x40, // REPORT_COUNT (64Byte) ' A& U4 _& e# U( C# Q0 C
0x91,0x02, // OUTPUT (Data,Var,Abs) 8 C7 w, u, F+ z! D/ _5 j+ ?
0x09,0x04, // USAGE ID - Vendor defined * e/ ?9 X9 `( V- d1 h# y) a& G
0xb1,0x82, //FEATURE (Data,Var,Abs,Vol)5 B/ ^: G7 |  J# H" C) q
8 Q* m; Z) V+ x. R: `/ H
0xc0 /* END_COLLECTION */4 |% x1 F- I: v  s1 Q# v

4 q' o$ F; M7 o* B' J' e**********之后,运行程序时,切记向0号ID传输数据,否则,发不出去也收不到……Orz
1 v9 t; F4 q! d/ p3、报告描述符书写规则
/ ?3 x! J! ]3 k6 e8 L这个要啃USB官方的HID协议和Usage Tables那俩文件了,书写完毕后用官网给的HID descriptor tool检查一下,这里我还没有弄明白feature和report的用法,不过最好都写上,要不然可能有问题,因为我是之前没有feature,只有report,计算机是识别了,但是测试HID设备的软件识别不出output report……(/ □ \),然后加上feature就识别了,没明白是怎么一回事啊o_O
冰封々爱恋 回答时间:2017-6-6 17:57:24
楼主的HID描述符里添加了0xb1,0x82, //FEATURE (Data,Var,Abs,Vol) 之后,在stm32官方的那个小工具里是不是只能使用SET_FEATURE 后才能收到上位机的数据?4 P0 I" e; y7 B( F2 o
楼主有没有写上位机程序啊?
epochal 回答时间:2017-6-6 20:38:28
谢谢分享!
dirty123 回答时间:2017-8-22 17:49:36
这官方USB库的链接可以发出来一下吗?比较难找,谢谢
tangyuang 回答时间:2017-9-16 11:20:34
路过!~学习学习!~感谢分享!~
西点钟灵毓秀 回答时间:2017-9-16 16:41:56
争取在十一之前弄懂STM32的USB开发
feixiang20 回答时间:2017-9-16 22:19:36
zts329547875 发表于 2017-9-16 16:41& E. P+ ^8 d" ~* p- F0 z  J
争取在十一之前弄懂STM32的USB开发

) D. T" @, t2 i3 c
护国大将军 回答时间:2017-10-12 08:55:57
HID类的上位机还比较简单些,楼主有没有做过MSC类的上位机?

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版