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

基于STM32的USB程序开发笔记(一、二)

[复制链接]
乡村布拉德 发布时间:2008-12-23 11:48
lbxxx原创 3 [  g( O: ~& ]/ p# B
, J6 y' |3 u1 f0 w. z; |
 / \" c. M  }+ [, B
基于STM32的USB程序开发笔记(一) - R, E& i+ ^0 }- X  V/ u5 {' X5 P
5 i5 E: _) U/ t# @
第一篇:需要准备的一些资料
5 l" _' c0 \8 f& S
) c2 z" l/ f* ?' L. w1:STM32的参考手册,这对于设备底层USB的硬件配置以及事件驱动机制的了解尤为重要,你需要了解各个寄存器的功能以及如何操作,比如CNTR、ISTR、EPnR、DADDR等等,如果你想学习USB,这个手册是必须的。
4 Y9 Y+ f# I  o  l2:USB2.0 协议,这个资料同样必不可少,如果因为英语阅读能力而苦苦寻找中文版的USB2.0协议,建议不要这么做,现在网络中的所谓的中文版的USB2.0协议不是官方撰写的,大多数是一些热心朋友自己翻译的,却不是很全面,如果你在为寻找这类的资料而无所获时,建议认真塌实的看看官方英文版的USB2.0协议,官方协议阐述的十分详细,650多页,一字一句的了解全部协议不太可行,可针对性的重点理解,比如对第9章USB Device Framework的详细理解对于你的USB Device固件开发不可缺少(这里就是STM32)。
% B% M, V0 P( q( Z6 p/ [3:ST提供的USB固件库,这个类库较为散乱,但不可不参考   k6 v8 L( a, E

6 {5 k; _! u+ i" ~* \以下是最近这段时间的成果,包含固件、驱动以及应用程序,固件部分有些功能是不被支持的,如SR_SetDescriptor()、 SR_SynchFrame()等等,在此说明战士不支持非故意如此,而是还没时间仔细深入编写完善,因为这些目前不被支持的部分目前不被使用到。 * b5 T: H% ?% C% D/ t6 P
后序将接着对各个部分进行一些说明,希望朋友们多多支持,同时欢迎朋友们讨论。 2 m/ S1 a8 t* P2 B: T
如果你使用的是万利的STM3210B-LK1开发板,则可以烧写hex文件后进行测试。
* s! \" ~' X$ O, u3 C$ X0 y  V' S
; X. |5 H# L% F2 E1 A下载该文件请参阅:
. o' s7 _$ v" Bhttp://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=1808061&bbs_page_no=1&bbs_id=3020
  M: b' k% f4 ?/ E/ r2 s! v) |2 H! B2 t) f0 x0 A1 M# G
6 X- V- ~! V6 _) |& Y5 \$ e
第2篇:STM32 USB固件函数的驱动原理 7 j, ]; d9 }9 _: _) @
首先需要了解一个概念: 9 S! O( }. X( \" a
USB 设备(DEVICE)从来只是被动触发,USB主机(HOST)掌握主动权,发送什么数据,什么时候发送,是给设备数据还是从设备请求数据,都是由USB 主机完成的,USB设备只是配合主机完成设备的枚举、数据方向和大小。根据数据特性再决定该不该回复该如何回复、该不该接收该如何接收这些动作。
0 y' B# }+ k3 K% K! K+ A% ^了解这些,再仔细查看STM32的参考手册USB部分以及STM32的中断向量表,从中可以找到两个中断: 4 ?; q) C+ ?( q1 ?0 v- }$ x
/*******************************************************************************
# G% t; x: B; ]1 r/ P; F( n* P: `4 |, O! S* Function Name  : USB_HP_CAN_TX_IRQHandler ) N2 p$ n  [  }. h- D2 Z, ^1 w$ W8 u
* Description    : This function handles USB High Priority or CAN TX interrupts   l; ~% ]' t$ u6 C: r
*                  requests. , U5 o+ G8 u  p- G* N
* Input          : None 3 J  J, A  B0 i% y) _( \1 l* w- R4 S
* Output         : None
; }9 x" L/ @/ F3 b" X5 ?* Return         : None
5 K/ i/ C" Z  ^1 s& W- v+ ]*******************************************************************************/
  b: k& b7 r& l, s' S; vvoid USB_HP_CAN_TX_IRQHandler(void)
& |* u3 r- O% |5 K, E  @3 A9 C  c5 ~{
0 M6 ~# W$ W% G4 s" H0 {; q( z1 m  USB_HPI();
- {3 j3 ^$ j( ]( ~' }: O  E) Y6 w}
7 [  W2 @0 J- V1 N1 H4 x; t! o1 C% v" v  S
/*******************************************************************************
7 j* M* |  G' ~" k5 x* Function Name  : USB_LP_CAN_RX0_IRQHandler   g, g% ^7 E8 C
* Description    : This function handles USB Low Priority or CAN RX0 interrupts
+ o0 r+ t! _( Y: _6 G& r6 d1 L*                  requests. 8 U' |+ l. q$ m3 R$ K0 s+ S
* Input          : None & n2 e( K6 q+ z$ c9 ^6 Y
* Output         : None ; p$ f" E, a) k0 O5 }3 o& F; R
* Return         : None + L% m$ X+ x5 v- M# ]
*******************************************************************************/ " x& s  e6 {) _9 d: a' T
void USB_LP_CAN_RX0_IRQHandler(void) 4 t" L+ v6 P' x& `: T# Q; J5 I8 Z
{ " ~/ |3 W, R% A! y2 t
  USB_LPI();
8 @9 x$ L, |( F: P5 e5 ]} $ X6 ?" |- ?9 X; S2 N

8 s! K$ M: ?4 x* h6 ~2 S1 }5 }  R6 \即 USB的高、低优先权中断处理函数,这也是整个STM32 USB的事件驱动源,USB_HPI()与USB_LPI()既而转向usb_core(.c,.h)进行相关处理。中断传输(interrupt)、控制传输(control)、大流量传输(bulk)由USB_LPI()响应,大流量传输(bulk)同样可能响应USB_HPI(),同步传输 (isochronous)只响应USB_HPI()。
0 [  S3 e  ~. l9 ^# Q$ I1 y( |+ I* u: w$ h5 q+ R
这样响应USB的所有请求只需要关注usb_core.c文件中的 USB_LPI()与USB_HPI()函数。由于本人也是对USB刚刚有所了解,因而在本例笔记中USB_HPI()函数未做任何处理,在此开源希望大家能完善与纠正错误并能共享喜悦。以下是USB_LPI()函数: 0 J. l( E. |9 e1 r  u4 o0 s5 r7 u! E, J
// ***************************************************************************** 3 s* _: {+ b# |2 z' x
// Function Name  : USB_LPI. / E! K& [7 K# \7 U- F# s
// Description    : Low Priority Interrupt's service routine. 4 p) y" A% x, j/ D
// Input          :
3 M8 [) E9 K& A( q' Y' d! E// Output         : 3 n1 m) G- k0 M& {/ |5 w' g2 V! }
// Return         :
& u4 h  a: g1 I, c// *****************************************************************************
) v3 L: S. D# l8 s& N. }, G, Evoid USB_LPI(void) ) E+ m  x0 K1 t  W
{
6 S1 `: `: [3 G  unsigned short wValISTR = GetISTR();
* u$ l* H5 m8 r2 \
5 w* q+ l/ R0 j. M) Q8 y#if(CNTR_MASK & ISTR_RESET)   // Reset
/ ~0 M$ H0 A/ ~; T  b  if(wValISTR & ISTR_RESET & vwInterruptMask) 4 M3 h% b9 g6 P: H; }2 z! {
  {
8 q% U) i6 i3 m) R4 G4 A    SetISTR(CLR_RESET);
* S4 Y( _) f, I' f* x$ t8 A  [    INT_ISTR_RESET(); 6 l" P" y% V4 \' g8 B9 g
  } % s3 m$ Z1 R3 z
#endif
( }1 I7 c3 a, X0 {/ P  o* A2 S
#if(CNTR_MASK & ISTR_DOVR)   // DMA Over/Underrun ; }+ @' j8 k! Y) }0 D
  if(wValISTR & ISTR_DOVR & vwInterruptMask)   k/ k3 Y9 C5 H8 F/ `. K& K, c' @
  {
% t& T9 h( I. ?/ A    SetISTR(CLR_DOVR);
' J1 f$ y, c- [0 k    INT_ISTR_DOVR();
0 M9 B* @6 j7 P7 b1 m; ]- \  } 6 |' y# M% k* r4 x* n
#endif
# P- N# b/ n$ K% N; u$ _" B  }  Z1 {  |
#if(CNTR_MASK & ISTR_ERR)   // Error
- q" A* F' A: M3 B1 `  if(wValISTR & ISTR_ERR & vwInterruptMask) ; F& a; F6 ]3 T) b- r3 K4 [6 ^
  {
) J- R9 ~) r- R/ A% {    SetISTR(CLR_ERR);
# q2 K/ q( O! j3 _. {( {    INT_ISTR_ERROR();
/ Y- A) i8 P, @3 Q8 t. L1 a5 E  } % M7 f& u7 l0 L: P7 R- E
#endif 0 e* O& @& i$ I# l( y

. p' n  D& a- X1 i$ `" b( {#if(CNTR_MASK & ISTR_WKUP)    // Wakeup
! r& U9 w# [' H1 Q  if(wValISTR & ISTR_WKUP & vwInterruptMask)
& @; K% g8 ?0 w0 ]$ G  { ' m. c: _# [) g% f& H
    SetISTR(CLR_WKUP);
/ Z7 v0 c9 x. c% R  G' Z# H    INT_ISTR_WAKEUP();
- W& t! c3 g- U% o1 Z  }
  n; p) d: i2 [0 }#endif
/ c1 _8 P! a6 P2 X" K7 ?  \* L- c7 e* t- ^% p% L
#if(CNTR_MASK & ISTR_SUSP)   // Suspend 7 v9 m5 D6 ], K) l, H1 W* z* z
  if(wValISTR & ISTR_SUSP & vwInterruptMask)
  r& c, @  O7 ?# n4 k+ a& J  { ! Y, T' {+ u0 f: X
    INT_ISTR_SUSPEND();
3 e$ ^! k9 Y0 h9 x& A  V5 h    SetISTR(CLR_SUSP);     // must be done after setting of CNTR_FSUSP
  |0 C: Y$ K& A5 o; h5 l+ ?  } + Q' z8 f% c: J8 m! }/ A
#endif " W3 @& I/ s% m5 u

) r5 ?, C0 ]( H4 G  B3 e#if(CNTR_MASK & ISTR_SOF)   // Start Of Frame
8 e/ i$ o- }+ J  if(wValISTR & ISTR_SOF & vwInterruptMask)
* B8 L0 A) ]8 j6 A( B; E  { - l7 u+ [  q; w7 O' P! Y& ]
    SetISTR(CLR_SOF);
7 w  J( _' j6 o4 h- r    INT_ISTR_SOF(); 1 X) h. k8 @2 u! Q& j9 o% P. L
  } 6 c2 E) h/ x, x
#endif
# `4 m" q' i4 P% W+ b! n) `1 A! C0 A0 |" T& }# u5 e
#if(CNTR_MASK & ISTR_ESOF)   // Expected Start Of Frame / Q& c9 t- b6 B
  if(wValISTR & ISTR_ESOF & vwInterruptMask) 7 b5 T4 ^8 V' z
  {
% T+ F  _/ {: {' }, ]    SetISTR(CLR_ESOF);
7 s/ W% N' r. `# W' T    INT_ISTR_ESOF();
5 o4 {+ @" r4 S0 h6 U  }
' W0 p- D/ E; q; q' E; R8 u% t#endif 0 r. ^# R& v( c' r+ |! }
$ W0 d; w8 Y3 d+ J9 P- e
#if(CNTR_MASK & ISTR_CTR)   // Correct Transfer & \4 n- s5 s) K% K. n2 f( O
  if(wValISTR & ISTR_CTR & vwInterruptMask)
1 Q& L2 ~9 X  ^+ ^9 g$ \  { 0 n" p( Q* j, [( Z. j2 f
    INT_ISTR_CTR();
" [: `4 \' x2 f5 r  } , A+ U( t- |. f5 m/ X- m  C, M  |
#endif
3 t& ]( N+ k7 Z" f' @9 {8 t} ! O3 F) ]: g4 Z- V+ H
1 I+ i3 O0 `3 Y" d6 `
// *****************************************************************************
$ c# {& o8 U+ e/ F' E// Function Name  : USB_HPI.
/ i& T2 f$ b. `- R* {9 s$ ?  ]// Description    : High Priority Interrupt's service routine.
  r  S+ p& A1 q& X- s+ ~0 @" Z+ e// Input          :
, w# E1 g  `: |' {// Output         : - I6 Q3 D' u( F
// Return         :
$ ?; s3 c" G7 I) A( E4 k- n// *****************************************************************************
( m1 s* G# v7 E- t# T; ^void USB_HPI(void)
1 w8 F! S, T, U' u{ , {6 V- `/ `* j& x* z( ]0 ~
 
8 ]8 c$ F% s6 C' b, G! i5 g}
6 t6 r" W& ]( [4 N1 v2 V/ j6 c5 _2 x# |
可以看出,在USB_LPI()函数中,根据STM32 USB的中断状态寄存器(ISTR)的标志位的状态以及定义的USB控制寄存器中断事件屏蔽码,响应各自的中断事件,比如 INT_ISTR_RESET()响应USB的复位中断,一般可在此函数内进行USB的寄存器的初始化;INT_ISTR_CTR()响应一次正确的数据传输中断,故名思意,在完成一次正确的数据传输操作后,就会响应此函数。 + e# v" k( ~+ w( X) e8 O% N$ x
具体含义请仔细查阅STM32参考手册,下篇将针对这些响应函数进行逐一的详细介绍。
赞 收藏 1 评论2 发布时间:2008-12-23 11:48

举报

2个回答
党国特派员 回答时间:2015-1-21 09:27:29
1.png
子曰小玖 回答时间:2015-1-21 09:53:17
谢谢分享

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版