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

解密开发板界”小精灵“之定时器篇---STM32F042 Nucleo32评测

[复制链接]
eurphan 发布时间:2016-3-12 20:15
继上一次对Nucleo32-f042做了简单的介绍之后,这次,让我们来看看这款芯片的内部资源。
5 f$ X! m2 @- K& H7 b7 P7 C- O
& l5 D* ?7 J! Q2 L5 n% \  B大家都知道,STM32的片内资源是相当丰富的,而这些资源里面,要数定时器功能最强大了,F042K6有1个16位高级控制定时器,1个32位4个16位通用定时器,共26通道PWM输出,用来控制电机是非常不错的,下面,让我们看看定时器的PWM输出功能。
9 b% ^7 O  h% a
1 L. D) m" _7 R0 p" k. @看原理图:9 P1 L- N9 `' I. P' }! O
PB3.JPG
& K/ g7 j8 D2 ]$ T9 m- @4 n. \: Z) o( f$ a8 p( O4 j5 o
LED.JPG " }# G3 n' }% }# A' ?4 W

# K0 h/ C3 {3 [1 v板载LED连在了PB3上,而PB3正好是TIM2的CH2,那么,本篇将介绍如何使用定时器弄一个呼吸灯。6 C/ s: t# [; E

1 O' x. n& B# B0 C9 w- L 工程目录.JPG
5 j. }( ^: `6 Z" H: E新建工程目录如图,并添加相应标准库文件
$ z7 d; Y/ t" v* r$ a0 ^- c( [
" B( L+ {( n, n: n4 e, G1 N1 n9 v 型号.JPG 6 ]5 P* k2 [" }: i2 G1 q' L
工程2.JPG
! I  w2 ~) b1 c) D% ]( V* l- }7 ]4 [* t4 I# k; ^
选择型号,建立工程
% k, C/ l: x- W2 n3 I% B$ S! i1 G  }  T" a- g+ P; `! `
编写初始化代码如下:
  ]! f: c5 F9 R
# [$ t8 e" ^, ?1 \0 m+ @( o, I$ l
  1. void TIM_Init(void)& A1 @& t* y8 K, |9 G; m; B0 `! x
  2. {# p. m+ E/ w- i, @9 Z! K' z3 s
  3.         GPIO_InitTypeDef GPIO_InitStructure;
    9 _9 s! L$ ^; B) k
  4.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    6 j, |5 b$ W; f. b
  5.         TIM_OCInitTypeDef TIM_OCInitStructure;/ s5 y% }% }5 O1 j! V. n
  6.         
    ; Q( R% z: g0 E& T* n
  7.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
    6 l6 f( H- i. |( b3 D: ]8 T
  8.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
    9 a3 A) v/ s9 S* Z
  9.         
    2 w- Y  _3 U: G4 V& N
  10.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
    8 m% v4 [8 H% n: M' I
  11.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;6 w. N% r! ?: k$ o! F  b
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    . f8 C8 Q  X/ D: g( x4 Q8 t
  13.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    : K6 P+ w2 g6 O& U* w5 s
  14.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    9 e9 ~% m6 ~9 R- {& {! J; ^! [
  15.         GPIO_Init(GPIOB,&GPIO_InitStructure);) h- c  l5 U4 I) H, L8 k# S. @8 M( k
  16.         4 C9 p: D0 l+ k+ Q( K7 R
  17.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_2);' I4 N0 c3 a; Z1 k' w6 d! e
  18.         5 o0 D' s5 P) q8 ~1 w8 H
  19.         TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;+ T: v9 J* A2 i$ r
  20.         TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Down;
    % r5 N) \+ [& Y8 Q7 @! W
  21.         TIM_TimeBaseInitStructure.TIM_Period = 1000-1;
    $ f& X6 J, a0 ~1 D$ R6 e% W! u
  22.         TIM_TimeBaseInitStructure.TIM_Prescaler = 48-1;! ?% {8 R9 p7 G8 I& y/ l
  23.         TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
    6 w; _7 R, I- k, G
  24.         # g# [, M+ U+ }) k% X  C' R4 h
  25.         TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
    / E3 Z$ n& }1 d8 w9 D4 |
  26.         TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
    3 L+ ?7 d; `$ t, b
  27.         TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;" t0 N  \% ?1 v( z+ }
  28.         TIM_OCInitStructure.TIM_Pulse = 0; 6 }5 @2 S6 k( |2 Z- ~+ U
  29.         TIM_OC2Init(TIM2,&TIM_OCInitStructure);
    4 i, w9 h$ `8 @: m: Z0 V; C8 j9 M+ A

  30.   B2 A$ c0 {. g# m8 [2 o
  31.         TIM_CtrlPWMOutputs (TIM2,ENABLE);/ F2 y+ u/ w/ E5 P- k2 g
  32.         
    + W, \4 x: p' A! d1 r, h" s. O
  33.         TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  //CH2
    , R4 r9 ]% k* Z. H* N( P6 L( F
  34.         TIM_ARRPreloadConfig(TIM2, ENABLE); . U. [  q- M$ A) k' ^: z$ U
  35.         
    7 [3 h0 R7 t1 ?5 }# G! S
  36.         TIM_Cmd(TIM2,ENABLE);
    ( C: Y: @) y  I5 m! s0 x& E6 D
  37. }0 A  p9 O4 a, G5 N2 H$ k1 t
复制代码
然后编写呼吸灯相关代码
. z3 |4 f/ m% ^) ~2 x+ S% F" }- ~7 q
  1. i=0;/ s  [0 ?2 A; L7 J/ a' m7 k! f9 F' t
  2.                 while(i+=5)
    ! M4 E* o4 D5 s1 G3 R
  3.                 {) U, F/ A7 c3 B  {. t
  4.                         TIM_SetCompare2(TIM2,i);
    0 K! [" d& u/ @; U4 B0 v
  5.                         delay_ms(10);
    : p1 J- S, n0 l" L
  6.                         if(i>=1000)" S# N! ]' f+ _& [8 W; m! c, i' x
  7.                                 break;% G& V) z* Y/ ^8 V( _
  8.                 }
    6 ?5 y  n/ `! x% p7 j$ I+ X& ~# R
  9.                 i=1000;
    ( f  G6 M4 ^/ M% z
  10.                 while(i-=5): @/ h# J5 z& m% a' o
  11.                 {( j9 r! y2 `. m9 n& @: x* N( X
  12.                         TIM_SetCompare2(TIM2,i);: V- U2 }! I5 n
  13.                         delay_ms(10);
    9 c! T, w/ y& h5 }9 _7 `  t. G7 ^
  14.                         if(i<=0)/ x) |5 T* v) v. k8 ^
  15.                                 break;( v0 v4 n; `4 ]: `1 _- }" d
  16.                 }
    1 R4 x% y( z+ p) E1 |9 C# _6 n
  17.                 delay_ms(1000);
    2 y$ s+ e7 J5 f" M( c0 c
  18.                 delay_ms(1000);
复制代码
% S& v, H+ v* B% Y6 C  _: a1 x
P60312-201305[1].jpg
* M. t& h2 Y+ @; ]+ q6 m写完,编译连接下载,便可以看到这颗绿色LED渐亮渐灭了。) M& E6 g- k: d, Q' `8 R

. B) o( I! }) s( ^% r 呼吸灯.rar (4.1 MB, 下载次数: 87)
收藏 评论4 发布时间:2016-3-12 20:15

举报

4个回答
ct3paul 回答时间:2017-3-22 16:12:23
楼主您好!
5 K; f' g5 z5 C+ W: O+ F5 T( s: e麻烦问下我现在在使用STM32F042的板子,使用定制器TIM17 CH1输出5Mhz的PWM波,发现输出的波形为5.3MHZ,占空比为33%,但是输出1kHZ的就是正确的,麻烦帮忙分析下,附配置代码:" |* J* o5 [* r/ g6 ]+ ?1 n
  1. void TIM17_CH1_PWM(void)
    8 R6 ]! l5 e$ N. r0 u" M) L  k- l
  2. {
    9 r8 C; ~. R; V$ z! _, u
  3.         GPIO_InitTypeDef GPIO_InitStructure;
    4 A0 n2 G: B0 T7 W
  4.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;4 ?- T: G* A( Z  M1 U5 P
  5.         TIM_OCInitTypeDef  TIM_OCInitStructure;
    " ~" W+ n5 B$ Q* @
  6.         uint16_t TimerPeriod;  D; ^* V1 Z/ ~, |# @% t
  7.         uint16_t Channel1Pulse;
    % W. y. D1 b4 K6 e
  8.        
    0 Y/ A9 \) d1 J  q/ F  E
  9.         //RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16 | RCC_APB2Periph_TIM17,ENABLE);
    2 d4 N! _: B! L5 U/ b* u: i
  10.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);* `. F, @6 G$ t+ d, ?
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM17,ENABLE);6 R+ i, Q  b% `" L, \
  12.         " _+ A- P; J5 G' z' i# u+ g9 N* ~
  13.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_2);
    ' ?; l5 v# p9 Q# S- M
  14.        
    : L& E, u% n3 ?; v% f, M8 [
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;1 `9 \3 q, \8 F9 w8 k0 S
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;% p  b5 W! j9 x9 Q! s" @
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ! i& ]- r1 U( L' F# v1 K
  18.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;" }' _5 b: s, F; I3 |& _, |% L& r
  19.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    . l$ W( I0 H: w
  20.         GPIO_Init(GPIOB, &GPIO_InitStructure);" v, i& c" N5 X+ |" j2 r1 X( v

  21. ' a9 s, U& ~4 y' k* r' v
  22.         TimerPeriod = (SystemCoreClock / 5000000 ) - 1;
    3 v% E, x" A; I2 i* Y# w
  23.         //Compute CCR1 value to generate a duty cycle at 50% for channel 1 and 1N ' K* S/ V9 q8 @9 d- A
  24.         Channel1Pulse = (uint16_t) (((uint32_t) 50 * (TimerPeriod - 1)) / 100);% i2 ~3 Q' n" s4 q$ g5 h6 G0 G

  25. 2 C0 H& b% q: G4 y9 |  o
  26.         //Time Base configuration. p6 w- h8 Z! O% A; X& W, M3 w3 ~
  27.         TIM_TimeBaseStructure.TIM_Prescaler = 0;7 {' P0 ~! f; j0 \3 ?
  28.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    ) {" W8 V# [+ r- W/ b3 @
  29.         TIM_TimeBaseStructure.TIM_Period = TimerPeriod;6 b  c1 R$ g; j" z# ]
  30.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;5 Y) k' M  b2 ~3 s
  31.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;' P4 E8 C2 t: `" e! H  m( o
  32.         TIM_TimeBaseInit(TIM17, &TIM_TimeBaseStructure);  R; @! n  D8 |8 u6 Y% u% H/ C; }
  33. % U/ w! x0 B7 q$ `( K$ B
  34.         //Channel 1Configuration in PWM mode
    , o" c) u+ t; n
  35.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;6 e) p. ~6 W) v: C0 U
  36.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    9 R6 |6 Q  C6 N9 B- j- S  u  Z
  37.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    6 h: [* u5 C5 h* l& D8 J3 }# z: H
  38.         TIM_OCInitStructure.TIM_Pulse = Channel1Pulse;7 E0 i+ E, q. v
  39.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
    + u2 L: y/ A; T+ u+ ^+ }
  40.         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;0 x1 i  c( q8 c: l. `
  41.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;8 d5 y" X+ n6 J9 B/ L# M8 f
  42.         TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;: U- p+ U/ Y( a9 ~4 x, x! r+ J3 p$ R
  43.        
    9 |, k6 g+ s* p' I1 R
  44.         TIM_OC1Init(TIM17, &TIM_OCInitStructure);. ~8 l( T8 X: Z: c0 S0 l1 ^* F5 x
  45.         TIM_Cmd(TIM17, ENABLE);
    4 D7 k1 q3 a5 E9 c
  46.         TIM_CtrlPWMOutputs(TIM17, ENABLE);
    4 ?! }  I. c8 f: P  G
  47. }
复制代码
ct3paul 回答时间:2017-3-22 16:15:51
楼主,您好!/ ?( n( ]: N- R$ T+ J
我在做使用STM32F042 定时器17通道1 输出5MHZ方波,占空比为50%时,输出的波形为5.336MHZ,占空比约为33%
# g: U0 X! O# @, T& a    但是输出较小频率是稳定,如2MHZ,示波器测量就正确,麻烦解答下. _6 d% s3 z6 X7 t
    是否是超出输出上限了?) u- P, C5 x4 e- ]$ l
    系统时钟为48M,HCLK、PCLK均未分频,为48M  Q) p9 e4 i$ n& B1 x* Q7 ?8 o( O+ P
    附配置代码:
  1. void TIM17_CH1_PWM(void)
    * s: z7 A$ e$ n; P* W7 [/ d6 a5 ]
  2. {
    ! s, U: m; p9 x5 Q5 s  `, _
  3.         GPIO_InitTypeDef GPIO_InitStructure;" ~4 Y4 Z# o( C+ K, x* M3 `
  4.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    * S, |% `( Y4 B3 [. N
  5.         TIM_OCInitTypeDef  TIM_OCInitStructure;! e) R+ S$ G9 t# m. Y0 L7 A
  6.         uint16_t TimerPeriod;6 z% o* s+ ?4 N3 L( K
  7.         uint16_t Channel1Pulse;
    8 H! w9 n* H0 a0 q' H% x9 E( C
  8.        
    : q( `: {$ ^& R, W. o
  9.         //RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16 | RCC_APB2Periph_TIM17,ENABLE);. U6 v6 d; k3 Y; F1 B% }6 v3 @
  10.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
    # o& Z4 ~% u$ S+ S' ^1 Z: U
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM17,ENABLE);
    5 Y# z1 B( @1 A
  12.         & L8 @, I4 ?) [3 t
  13.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_2);
    1 z, g% h' M4 e1 I( V. C
  14.        
    + y; i. w- \8 E, K1 d* h7 F
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;, k1 B0 \' H$ P
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    7 Q1 d: e7 y) M& E5 t/ b
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;8 F2 Z. ~- k, \0 e; k& A
  18.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;0 {  e" A( x- O7 X. U% y& [
  19.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;) M$ c5 ]! ], d% [; f" {
  20.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    6 k8 D; j& w# W3 D
  21. 6 Z3 Z4 \4 m. d3 z! i
  22.         TimerPeriod = (SystemCoreClock / 5000000 ) - 1;
    % ?/ m) F1 N# g" e
  23.         //Compute CCR1 value to generate a duty cycle at 50% for channel 1 and 1N ) v. G  G9 q, S3 K  n4 X5 h
  24.         Channel1Pulse = (uint16_t) (((uint32_t) 50 * (TimerPeriod - 1)) / 100);
    7 _6 K: x+ ~0 ]) f# a' ]

  25. 6 Z9 m% d2 g$ q& w6 Q0 u
  26.         //Time Base configuration. l: n% X: \/ y, d3 Z
  27.         TIM_TimeBaseStructure.TIM_Prescaler = 0;
    . x$ ~+ \7 Q  n" _- ~5 N; u
  28.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
      h- w4 S  X9 M* d% e/ t# R
  29.         TIM_TimeBaseStructure.TIM_Period = TimerPeriod;
    9 ^: R5 o6 B8 g$ }* o
  30.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    : k+ O( D. }( S  n; d
  31.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;0 `/ \& P" D8 k3 p
  32.         TIM_TimeBaseInit(TIM17, &TIM_TimeBaseStructure);) X, O! F6 X# C: N5 F, x
  33. # P1 F* p" ]& O% O. Y
  34.         //Channel 1Configuration in PWM mode
    ' C- t% C! ], F
  35.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
      K" K  F, X. X' F2 W! u
  36.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    , h! v' I: {6 ?- u- E
  37.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;/ d9 C& Z0 V  r5 q
  38.         TIM_OCInitStructure.TIM_Pulse = Channel1Pulse;
    1 R9 M8 a' i8 j6 m/ o6 d% P
  39.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
    # s) Y+ g- _; p7 c2 q+ V
  40.         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
    , `8 K% s! h; H2 t; l- F
  41.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;$ s5 h! p* U0 H; T& P
  42.         TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
    8 q- w" a/ {: i( M: A
  43.        
    / C0 t# ?7 a: h
  44.         TIM_OC1Init(TIM17, &TIM_OCInitStructure);
    3 \, y$ t. V* D2 \9 Z8 u
  45.         TIM_Cmd(TIM17, ENABLE);5 D- y- m6 b9 W- B% V' Z
  46.         TIM_CtrlPWMOutputs(TIM17, ENABLE);
    $ K! O7 _* }$ {; u  w: d8 e( y
  47. }
复制代码
aliuxiaba 回答时间:2018-4-30 17:06:30
本帖最后由 aliuxiaba 于 2018-4-30 17:11 编辑
, R9 {- k/ c: ?  T0 J9 [+ S
$ }5 s3 u5 r/ }7 H1 ?楼主,我下载了您的压缩包,但是编译的时候提示有27个错误
; H: w  g6 [( u; w小白,勿喷
' ~" ~: s6 q: K
aliuxiaba 回答时间:2018-4-30 17:07:51
本帖最后由 aliuxiaba 于 2018-4-30 17:09 编辑 . m: L0 X; m2 k- C: g& _% I

4 @7 {7 F( v, c# yfile:///C:/Users/Bling/AppData/Roaming/Tencent/QQ/Temp/H0Z@HXCF1$4A1J16%7BYL1Q1G.jpg
1.jpg
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版