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

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

[复制链接]
乡村布拉德 发布时间:2008-12-23 11:48
lbxxx原创 ' x* ?  `3 c) J4 B

; @! S& m% A* ~) p5 \0 K 9 k4 O8 _+ u/ P( Z% [
基于STM32的USB程序开发笔记(一) 7 m. Q. z1 [7 F) X5 `5 W+ w
: }7 f& K( o" r) n1 w" P
第一篇:需要准备的一些资料
& ~! F: A7 r4 Z% D+ U7 |& M: R7 c
; N' s% F; N, K# \) U/ S1:STM32的参考手册,这对于设备底层USB的硬件配置以及事件驱动机制的了解尤为重要,你需要了解各个寄存器的功能以及如何操作,比如CNTR、ISTR、EPnR、DADDR等等,如果你想学习USB,这个手册是必须的。 ( P  O9 o6 s$ a  }
2:USB2.0 协议,这个资料同样必不可少,如果因为英语阅读能力而苦苦寻找中文版的USB2.0协议,建议不要这么做,现在网络中的所谓的中文版的USB2.0协议不是官方撰写的,大多数是一些热心朋友自己翻译的,却不是很全面,如果你在为寻找这类的资料而无所获时,建议认真塌实的看看官方英文版的USB2.0协议,官方协议阐述的十分详细,650多页,一字一句的了解全部协议不太可行,可针对性的重点理解,比如对第9章USB Device Framework的详细理解对于你的USB Device固件开发不可缺少(这里就是STM32)。 ) Q7 h. W; q5 J1 U
3:ST提供的USB固件库,这个类库较为散乱,但不可不参考 / Q# E7 }" Q' Y: X7 k1 p7 W

1 b9 o+ q5 \$ V/ v9 l, t以下是最近这段时间的成果,包含固件、驱动以及应用程序,固件部分有些功能是不被支持的,如SR_SetDescriptor()、 SR_SynchFrame()等等,在此说明战士不支持非故意如此,而是还没时间仔细深入编写完善,因为这些目前不被支持的部分目前不被使用到。 & @9 k$ N- s/ D' q
后序将接着对各个部分进行一些说明,希望朋友们多多支持,同时欢迎朋友们讨论。 8 T* Z% @: l0 q/ @
如果你使用的是万利的STM3210B-LK1开发板,则可以烧写hex文件后进行测试。
0 K6 Q3 {  ^$ j
9 o" E. F' J& U  I" C下载该文件请参阅:
8 A2 Y1 |8 K4 N3 Lhttp://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=1808061&bbs_page_no=1&bbs_id=3020
5 E3 E& z' c0 g, |5 G9 L% w. r8 w4 u; i& f- m3 y* M. _
0 t% ^2 _! |: r, k; m
第2篇:STM32 USB固件函数的驱动原理
7 b5 y4 ?# J" A9 S- M0 ]首先需要了解一个概念: " _: U9 _& P5 `- f
USB 设备(DEVICE)从来只是被动触发,USB主机(HOST)掌握主动权,发送什么数据,什么时候发送,是给设备数据还是从设备请求数据,都是由USB 主机完成的,USB设备只是配合主机完成设备的枚举、数据方向和大小。根据数据特性再决定该不该回复该如何回复、该不该接收该如何接收这些动作。 2 g- N7 T' o; O" t
了解这些,再仔细查看STM32的参考手册USB部分以及STM32的中断向量表,从中可以找到两个中断:
( ^1 z+ e5 O- Q5 w5 f! f/*******************************************************************************
$ r$ b" x$ F' X- z5 a* Function Name  : USB_HP_CAN_TX_IRQHandler
( m; g4 t* F6 P3 M6 j1 R. `+ v* Description    : This function handles USB High Priority or CAN TX interrupts & w. G! ]3 e8 I9 D! C
*                  requests. ( O$ d( i% o: k% Q
* Input          : None
2 P; g  o4 `, |7 D4 {* Output         : None " J$ P: P# B  [' L  p' B
* Return         : None
1 s; Q$ |3 d! [1 l*******************************************************************************/
7 O% ]' j/ l4 b' r9 \void USB_HP_CAN_TX_IRQHandler(void)
; k! g: d8 ~1 ]{
7 S3 `2 J$ l8 W0 }, X  USB_HPI(); * ?! L2 r. Y: t! u) D
} % |0 H1 b: V" n' b5 i8 n. ?

8 ]" t, U3 u/ Z! B5 l* u7 T5 J/*******************************************************************************
& e: Z* G0 W! L4 u! S* Function Name  : USB_LP_CAN_RX0_IRQHandler 2 W" x6 C. `" l
* Description    : This function handles USB Low Priority or CAN RX0 interrupts ! ^5 Y/ n( v: I: s
*                  requests.
0 D" l& @  Q9 d& ]2 A* Input          : None
; J, `1 d5 ^  d! b3 U* Output         : None 2 z' Z7 \9 N) Y5 V8 p
* Return         : None
" m- E) p8 f) i3 x8 q1 N*******************************************************************************/ + b/ U2 `" E$ B- h: @2 H, h! S# {: ]
void USB_LP_CAN_RX0_IRQHandler(void)
9 N9 K6 e  d% E+ |' r; x; G9 d{ ; ?( G: i) D( J2 [4 _9 n
  USB_LPI(); ! n" [1 H# v: b9 |0 u3 x, [# L5 e  v2 \
} 6 d( H( E" Z5 e3 P# _% [
5 F5 f) ~1 @4 r7 w) w) U: W
即 USB的高、低优先权中断处理函数,这也是整个STM32 USB的事件驱动源,USB_HPI()与USB_LPI()既而转向usb_core(.c,.h)进行相关处理。中断传输(interrupt)、控制传输(control)、大流量传输(bulk)由USB_LPI()响应,大流量传输(bulk)同样可能响应USB_HPI(),同步传输 (isochronous)只响应USB_HPI()。 , [+ A+ K  ?$ y+ F( m. i
2 e9 N+ c6 N" X$ @8 m
这样响应USB的所有请求只需要关注usb_core.c文件中的 USB_LPI()与USB_HPI()函数。由于本人也是对USB刚刚有所了解,因而在本例笔记中USB_HPI()函数未做任何处理,在此开源希望大家能完善与纠正错误并能共享喜悦。以下是USB_LPI()函数:
7 W, ]' V) _& v* J$ t. v// ***************************************************************************** 5 G# x. [4 }# c0 G, i. U
// Function Name  : USB_LPI.
2 z# f& r* x) S1 U3 a// Description    : Low Priority Interrupt's service routine. 0 b! f$ U! }2 }" T  ~; B3 q
// Input          :
% M7 C3 |! i2 v: V4 }) t: s( T// Output         : / O7 o' K9 L( u+ }3 ?
// Return         : 8 k. S" x! A7 f; p" y& ~! o8 ?
// ***************************************************************************** 8 ]% F+ ]9 i# S5 \( X
void USB_LPI(void) 4 H; ~+ e/ b& C9 _6 C/ D4 U
{
% h; Y! f0 ^! \2 [9 @, O  unsigned short wValISTR = GetISTR(); 5 y4 ?1 x& U& j' v6 _

/ y7 |2 B+ A: A& r+ O$ x#if(CNTR_MASK & ISTR_RESET)   // Reset * P* j( h. z0 F9 H5 o3 Z$ k
  if(wValISTR & ISTR_RESET & vwInterruptMask)
7 A6 |/ d7 U, [. w  {
2 |% [. F( [3 y' K% H    SetISTR(CLR_RESET); % l' d% O. u6 V
    INT_ISTR_RESET();
# R1 C: r& d" m0 Q  } # z" H, A7 w. ~$ u. m; i1 C
#endif
. Q$ E0 p9 z/ h' V7 N9 h8 O7 s
( V  f! Y. J4 j9 L$ i+ B#if(CNTR_MASK & ISTR_DOVR)   // DMA Over/Underrun
4 J7 Z- O# l& ^# Z  if(wValISTR & ISTR_DOVR & vwInterruptMask)
3 G. L$ G! Y6 l: K$ {1 K  a  { + Q+ U& R9 _5 k7 _  v) h% z8 ]
    SetISTR(CLR_DOVR); 0 e4 Z4 y! u6 R& L% X
    INT_ISTR_DOVR(); 0 J* ~( T( m2 Y
  } & x2 ~9 G* B5 K7 `) V" [
#endif " ^: Z5 Z" v- L* h( s/ b" Q% w

2 G# F6 J6 h# n+ n0 m) _#if(CNTR_MASK & ISTR_ERR)   // Error 4 G2 V4 X% |4 {/ ^7 [& h, K8 {6 e- m$ _
  if(wValISTR & ISTR_ERR & vwInterruptMask) 5 _1 m2 h. h/ O7 b9 b
  { 8 K0 B2 _0 F2 N- y0 m6 m
    SetISTR(CLR_ERR);
5 d' M& S! C  ?    INT_ISTR_ERROR();   A. F0 n. y1 \+ K0 q! ^) T! ^
  }
& c6 M2 M% A! l- L8 Z#endif # {% H+ t2 R/ k. Y$ {( v" ^( N
* e" D" q! y4 Z# D$ F! X" ~/ y
#if(CNTR_MASK & ISTR_WKUP)    // Wakeup 5 b, \5 L# v) w. n& Y9 c/ i; x0 ~
  if(wValISTR & ISTR_WKUP & vwInterruptMask) 1 J5 v: ?" |* l6 X! R- R
  {
+ p2 W) a  K( l8 R. r+ C    SetISTR(CLR_WKUP);
4 Q+ c- u1 ?9 `- a- C; W    INT_ISTR_WAKEUP();
! w5 G' x9 ^% x- P  } % O  t! X- r0 i( l+ X' G6 Q' d* {* p
#endif
3 q6 P1 M& V$ ?" r
) U( j- V9 F4 n( l# a: J; z#if(CNTR_MASK & ISTR_SUSP)   // Suspend 8 L  }6 J8 m/ K9 N8 l
  if(wValISTR & ISTR_SUSP & vwInterruptMask)
7 t% ]3 @; r* Q/ R9 w" c' ?2 v7 @  {
6 D7 M0 H: y( Z6 T$ b( \+ _    INT_ISTR_SUSPEND();
1 t0 W  H3 S% x& f1 _    SetISTR(CLR_SUSP);     // must be done after setting of CNTR_FSUSP 3 o$ g0 s) L8 X" b  j
  }
* j. c6 v; N2 ]$ U" p2 Y/ n3 }0 z#endif
# B) U( B% e& J# ]2 U2 C" C* j
/ X/ @$ o4 ?/ y0 I$ I( l8 r2 R#if(CNTR_MASK & ISTR_SOF)   // Start Of Frame
5 e- j- M0 J7 _2 v- \  if(wValISTR & ISTR_SOF & vwInterruptMask) 0 |& t6 G% S8 V! O) m
  {
# l* b  U! l( P    SetISTR(CLR_SOF);
  {! U/ [. i$ G/ e6 Q/ y    INT_ISTR_SOF(); , ]7 D; }' Z" ~% A* }' ]  \/ {
  }
& `: C: o" i7 }# i5 f/ e#endif
" m/ ~- G  g5 }+ Q( o, b0 X7 p1 E5 o! b- P, m' r  K* f
#if(CNTR_MASK & ISTR_ESOF)   // Expected Start Of Frame # R- L7 \( l; u* D4 Z- Z$ S
  if(wValISTR & ISTR_ESOF & vwInterruptMask)
# C1 o/ ~* m1 n& u, g/ @  { . Q# w- G% N# Q- e/ ]
    SetISTR(CLR_ESOF); , h5 e/ _  g8 Y' T2 A+ c! q
    INT_ISTR_ESOF();
! M" {1 w3 a& y* O9 y& ~' X- o  }
$ L7 k! p9 j2 I% r#endif 5 p3 Z, M" ]1 J, _! c
" M5 i4 G8 x5 y; D/ j- M
#if(CNTR_MASK & ISTR_CTR)   // Correct Transfer
7 G0 F' `5 r! a7 W# ]+ a) }) x  if(wValISTR & ISTR_CTR & vwInterruptMask)
4 [* `6 v' H' ]8 G( c  {
- L* P' z+ w8 d4 }. W3 C7 f) h    INT_ISTR_CTR(); " u' M% @* J1 s& h, l1 W
  } 9 a1 X; h' I# E2 Z' c% G/ b
#endif . F# c4 T" d" B: @
}
3 f" U) T( z0 j0 u1 {5 R. w5 i1 u# ~+ N" S) F8 c/ z/ x& k) C7 A% Q) D  l
// *****************************************************************************
$ d' E# M+ b, W! x# ]// Function Name  : USB_HPI.
! B5 i6 J; T. W' A4 L( n- d// Description    : High Priority Interrupt's service routine. ( T# Q  y; ]4 E1 D( i+ a8 O2 z
// Input          :
( Q0 A4 E0 o, `+ T) M5 s' @// Output         :
2 D( H. h; n4 G: H8 V// Return         : , B2 @3 x. D& ]! j6 w: o9 `& \
// *****************************************************************************
7 I% M) q* i0 z' z8 n4 K7 S) \: n9 yvoid USB_HPI(void)
  L/ u, |: D6 s9 w3 v7 i{ 7 b8 J3 q% K) T6 h8 t2 F  ]5 ^
 
% N  V( H# a6 ^} * c' k& r4 v; f' Z- M, {1 T
3 \$ R8 G$ w( K9 N
可以看出,在USB_LPI()函数中,根据STM32 USB的中断状态寄存器(ISTR)的标志位的状态以及定义的USB控制寄存器中断事件屏蔽码,响应各自的中断事件,比如 INT_ISTR_RESET()响应USB的复位中断,一般可在此函数内进行USB的寄存器的初始化;INT_ISTR_CTR()响应一次正确的数据传输中断,故名思意,在完成一次正确的数据传输操作后,就会响应此函数。
; f/ E* y- F. W" @- h具体含义请仔细查阅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 手机版