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

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

[复制链接]
eurphan 发布时间:2016-3-12 20:15
继上一次对Nucleo32-f042做了简单的介绍之后,这次,让我们来看看这款芯片的内部资源。" y, y$ s# q- i+ z6 v: c' d
& C6 a* q, A" c
大家都知道,STM32的片内资源是相当丰富的,而这些资源里面,要数定时器功能最强大了,F042K6有1个16位高级控制定时器,1个32位4个16位通用定时器,共26通道PWM输出,用来控制电机是非常不错的,下面,让我们看看定时器的PWM输出功能。* e, v- u/ U: L# y3 C% e* |3 u  @
: x; d% T& |, b
看原理图:
" _& w" t  a4 e6 k! p! V PB3.JPG 0 U: @/ A+ \! L5 x# \/ a- V
% F' m. ^  N. J4 P8 N
LED.JPG 3 ]! A, ~) ~& S# S* {8 ~
* p8 a2 P# s) p; J4 K) |$ b
板载LED连在了PB3上,而PB3正好是TIM2的CH2,那么,本篇将介绍如何使用定时器弄一个呼吸灯。
$ T7 }' _$ ^: x5 f/ o
3 f& A* j' M& Z: A  ^ 工程目录.JPG
- K& i9 i! L% H新建工程目录如图,并添加相应标准库文件  g; c5 t. a, O7 e1 j

5 c/ n% `) }. q) T3 \! ?- _ 型号.JPG / k3 ]4 ?* R4 J# s0 o
工程2.JPG
) }3 x1 N4 Q8 ~5 ~! h( _. q; C; _+ Q4 u7 K' v/ K: V8 F
选择型号,建立工程: U! J' W% a  ^4 f
6 J5 J0 i/ N: q  K
编写初始化代码如下:
1 d2 h) v( s4 d. R3 I5 S; _
, i, H$ `% K$ D
  1. void TIM_Init(void)1 r& j# ^- [2 L1 k2 v
  2. {
    , v1 @+ F3 O; D. n8 y% m& `
  3.         GPIO_InitTypeDef GPIO_InitStructure;
    3 F8 R( O' ]% P! ?7 T- ~1 j
  4.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    ' m5 }. o  U$ S" Q( ?* q& Y
  5.         TIM_OCInitTypeDef TIM_OCInitStructure;  r7 z  e, J. X) h9 l
  6.         
    2 D/ k: v/ o% X! r, U
  7.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);0 \% i2 U- ?  y! x
  8.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);) u; ~; q: N: N0 a  l: r" y8 r/ S
  9.           s2 X8 ], t0 k" w/ f+ @1 E$ w
  10.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
    ! Y+ h/ I' z$ q* [& D4 b
  11.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;4 H5 S. I" X  I8 ]% P  Z& J5 L/ y8 p2 A
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ' O4 z1 S) z/ {2 O: _. u
  13.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    ) M& i9 j0 {5 T
  14.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;. O+ @- u7 e" Y2 ]  M. v
  15.         GPIO_Init(GPIOB,&GPIO_InitStructure);
    $ z  _9 d& R: q+ L
  16.         
    $ z3 O0 P( O5 M# e9 r
  17.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_2);5 t$ _0 a! `' H; d+ z" i9 g
  18.         8 Q( o8 K, B! I' l( j- n4 F
  19.         TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;
      q* f+ ^+ |7 }1 A- b% C# X8 u; i7 Q' F
  20.         TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Down;' r& V0 z0 h  `/ U: j) e0 C8 ~
  21.         TIM_TimeBaseInitStructure.TIM_Period = 1000-1;2 u4 i* S: f7 ^' L
  22.         TIM_TimeBaseInitStructure.TIM_Prescaler = 48-1;
    1 }! ^; m0 h9 u6 b
  23.         TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);5 Y: d% c+ c. `* S" V; B! |  o
  24.         
    ( k% v  K+ O: y& x5 ]
  25.         TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
    ; g7 V( g2 G0 r3 \" v3 n2 t6 u3 J
  26.         TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
    ! V' S; H5 H- r/ h
  27.         TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
    & e) i1 X4 ]7 S. k, k8 d' M* u
  28.         TIM_OCInitStructure.TIM_Pulse = 0; ; Q4 h4 r5 z: h1 G# K4 a
  29.         TIM_OC2Init(TIM2,&TIM_OCInitStructure);
    : x, w8 W+ w7 ]2 m4 [
  30. # g- V0 `3 n7 x3 h7 }; A( U& A/ ~
  31.         TIM_CtrlPWMOutputs (TIM2,ENABLE);( Q9 q& f/ s4 H0 w
  32.         
    8 L' C/ b, E7 t, E
  33.         TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  //CH2: a4 n* U6 Z# G* y
  34.         TIM_ARRPreloadConfig(TIM2, ENABLE);
    " T5 n# p$ h8 P: z
  35.         
    8 J+ r2 W8 j3 g; G- o; t- E
  36.         TIM_Cmd(TIM2,ENABLE);1 ]3 @+ ]" s, [) G: {5 `
  37. }" a% X, z$ f1 H
复制代码
然后编写呼吸灯相关代码5 M. V( W) ]3 ^3 {9 T
  1. i=0;. ~7 U7 V# D# J$ x# p
  2.                 while(i+=5)0 A: }/ K! ~# ]0 j
  3.                 {
    ) G1 Z* q3 W: Q& y  m
  4.                         TIM_SetCompare2(TIM2,i);
    4 f: ^/ q5 d7 U1 d, C) G% |
  5.                         delay_ms(10);# B3 E" W* @. u0 S2 V3 N: h
  6.                         if(i>=1000)- R6 q! o& k6 f! E7 W! d3 [* w9 d
  7.                                 break;. j" `( N; L0 M" T4 E, f
  8.                 }
    ' w( m9 W( K8 h4 W' B5 f" m
  9.                 i=1000;1 b& N# y% Z5 P% x
  10.                 while(i-=5)) T, @/ ]& L) ~& ^& u) `* _
  11.                 {
    % {) U6 g* s, s  O4 [& ~
  12.                         TIM_SetCompare2(TIM2,i);4 u0 ~$ P  C4 V2 j
  13.                         delay_ms(10);
    ! X! P* `+ g5 _; b! v
  14.                         if(i<=0)
    9 f: ~* w: t6 A- h. @/ S, l3 h5 N
  15.                                 break;
    4 _0 S  l) J, b0 E
  16.                 }
    # l# d9 s, r9 }
  17.                 delay_ms(1000);6 l& c6 n3 x0 C! {
  18.                 delay_ms(1000);
复制代码

& D* [6 @. N% K8 y& m P60312-201305[1].jpg
3 Z4 r+ E4 I% y* M8 Y写完,编译连接下载,便可以看到这颗绿色LED渐亮渐灭了。
! Y1 R6 U; D" ^( I/ R1 I
2 M$ d# [" V3 V" R 呼吸灯.rar (4.1 MB, 下载次数: 87)
收藏 评论4 发布时间:2016-3-12 20:15

举报

4个回答
ct3paul 回答时间:2017-3-22 16:12:23
楼主您好!" v- z' I+ q( n9 i
麻烦问下我现在在使用STM32F042的板子,使用定制器TIM17 CH1输出5Mhz的PWM波,发现输出的波形为5.3MHZ,占空比为33%,但是输出1kHZ的就是正确的,麻烦帮忙分析下,附配置代码:( H( q3 x  c& \" F
  1. void TIM17_CH1_PWM(void)/ d+ P* H  W# y- e3 l' `/ L
  2. {
    3 W& b! u+ ^1 L
  3.         GPIO_InitTypeDef GPIO_InitStructure;; S$ Z, Q* `/ r- {7 j3 U6 V
  4.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    - s$ g. ?' e0 A% Z0 J. I( P2 ^
  5.         TIM_OCInitTypeDef  TIM_OCInitStructure;
    4 s% I( f. E( ~/ [" O8 v
  6.         uint16_t TimerPeriod;  x7 w! f6 n, E
  7.         uint16_t Channel1Pulse;
    / a3 n) S4 Y& h2 R) Y
  8.         8 f" s* L0 g1 T' ^6 r) I9 c
  9.         //RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16 | RCC_APB2Periph_TIM17,ENABLE);& s4 h, f) q4 a/ d
  10.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);. S; w% o8 m, j( ?8 i
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM17,ENABLE);
    1 Z6 I8 s" ?6 R
  12.        
    ! N- l5 n  }$ O0 n$ _
  13.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_2);
    7 O/ ~7 S$ H  o" o- b+ M
  14.         1 D2 H4 J% Q) |
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    / c+ X( p# ~% @! o3 ~0 |3 H8 K0 p: n/ @
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;: `3 J* s# D: \- x, K$ F+ C& A" ^
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    + @) x) q4 ]3 Y
  18.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    ; T* R+ u( t2 j  l) v, J! w
  19.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    7 T0 c7 @2 A  T
  20.         GPIO_Init(GPIOB, &GPIO_InitStructure);8 k. w6 K& R+ O$ K" v" i

  21. ( p2 X$ I5 M# T" B! [
  22.         TimerPeriod = (SystemCoreClock / 5000000 ) - 1;
    $ w0 ^0 D% m6 z! v* Y
  23.         //Compute CCR1 value to generate a duty cycle at 50% for channel 1 and 1N 1 C6 S+ p$ }( U; r+ `6 i1 R7 q
  24.         Channel1Pulse = (uint16_t) (((uint32_t) 50 * (TimerPeriod - 1)) / 100);% X( E8 u9 q5 X' u0 r3 k$ @; v% g/ }
  25. 4 d" T8 @. Y1 ^' W
  26.         //Time Base configuration, T) }7 @# S/ a3 F9 \# b/ N' E, w$ ^
  27.         TIM_TimeBaseStructure.TIM_Prescaler = 0;
    " Q# u# B, q6 B* i* |
  28.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    ! L) x5 L& X' U) O6 n, g5 U1 \1 g8 m
  29.         TIM_TimeBaseStructure.TIM_Period = TimerPeriod;% V; F; H9 K8 z. e9 Z7 r/ L6 B9 ]
  30.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    & [1 B5 F. @' B; |! r6 H+ t# @
  31.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;# b+ M  v( i% W: T1 X$ O+ |
  32.         TIM_TimeBaseInit(TIM17, &TIM_TimeBaseStructure);* v5 m; \( p; n9 I7 |% ~

  33. * }1 W$ c) O) n% E) g" U
  34.         //Channel 1Configuration in PWM mode1 H! h' X+ G( c  s( F8 o
  35.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;3 E( r, z! Y: Z
  36.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    2 L' s7 W" q0 |! o  |
  37.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;9 f0 Y7 O3 D- Z. z2 b9 t
  38.         TIM_OCInitStructure.TIM_Pulse = Channel1Pulse;; b0 b/ `9 W0 l
  39.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;! ~$ `, h5 C5 P
  40.         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;* g3 C: e! n) d
  41.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;2 q- P$ a# Z* Y1 r  q1 j
  42.         TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
    7 H& ~, D" M# n" Y7 p. Y5 S: I1 g
  43.        
    5 G: J: H3 U9 @) i9 e
  44.         TIM_OC1Init(TIM17, &TIM_OCInitStructure);
    3 ^! D1 f+ U0 X& c8 Q: p- S
  45.         TIM_Cmd(TIM17, ENABLE);4 j0 Q8 m9 o% A2 U
  46.         TIM_CtrlPWMOutputs(TIM17, ENABLE);
    . @1 \* ]# y; `/ t  b; P# H) Q8 E9 C2 ]
  47. }
复制代码
ct3paul 回答时间:2017-3-22 16:15:51
楼主,您好!0 E1 b6 V9 a4 [7 u
我在做使用STM32F042 定时器17通道1 输出5MHZ方波,占空比为50%时,输出的波形为5.336MHZ,占空比约为33%
/ y) j0 v8 @0 j; E9 U( d    但是输出较小频率是稳定,如2MHZ,示波器测量就正确,麻烦解答下
8 \' H# h% o9 }3 \    是否是超出输出上限了?
2 a9 Y: U! J  Q+ \    系统时钟为48M,HCLK、PCLK均未分频,为48M) d- k5 F: p) b
    附配置代码:
  1. void TIM17_CH1_PWM(void)
    3 L* U( S6 n8 s! d; Y8 q3 ?' q
  2. {0 E* b" l+ O( k, [; y
  3.         GPIO_InitTypeDef GPIO_InitStructure;* O6 e9 c: K+ Z
  4.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;( f5 n4 e( z" {' z1 G7 e
  5.         TIM_OCInitTypeDef  TIM_OCInitStructure;
    $ l; P( `4 S# |4 w" W. Y$ L6 L6 J
  6.         uint16_t TimerPeriod;' o% O" a+ z+ ]
  7.         uint16_t Channel1Pulse;3 I& `. {0 ~6 |( B
  8.        
    % E/ ]5 b- ^1 `2 U
  9.         //RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16 | RCC_APB2Periph_TIM17,ENABLE);# ^" K8 O  d2 C9 X7 z. q7 k
  10.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);3 U6 c3 I0 J% u% E( C+ r. i9 ~
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM17,ENABLE);
      g( R( B2 V6 f2 G2 G
  12.         ( M: W5 X5 k0 t1 Q( O7 w2 A. y' |
  13.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_2);
    - Y+ ^: ^# X& s
  14.        
    0 |# C4 j! i) d9 }
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    9 l& N8 [" e8 v, x
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;! e- q& a0 Q. A  Q
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    / o$ [8 g8 F, m1 p' d  S5 c! C8 K
  18.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;: s; l3 ]5 ?0 Q- _2 f' I% x$ v$ J
  19.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  M1 b  O3 q4 Z5 Q" g2 a* F: m
  20.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    " Z( j' Y( g6 S/ s, W

  21. % j" p- ~$ f# D8 l
  22.         TimerPeriod = (SystemCoreClock / 5000000 ) - 1;
    ; [  k1 T1 X- @4 K0 I4 z* ]
  23.         //Compute CCR1 value to generate a duty cycle at 50% for channel 1 and 1N
    ' z4 b5 |* x" s2 n
  24.         Channel1Pulse = (uint16_t) (((uint32_t) 50 * (TimerPeriod - 1)) / 100);
    5 j3 w9 b1 Y& F) ]: h& v4 l" S
  25. 1 Y+ K5 X; ^3 i9 E9 V" Y4 f
  26.         //Time Base configuration6 r6 X+ @  o. h+ k/ _! q; }- q
  27.         TIM_TimeBaseStructure.TIM_Prescaler = 0;
    ! V4 F9 i9 x* c4 S
  28.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;1 b1 r5 F! T& ~, W1 N5 E" O4 N* l
  29.         TIM_TimeBaseStructure.TIM_Period = TimerPeriod;7 P8 l7 H8 p  t
  30.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;6 y8 o/ K4 |9 W0 G. n
  31.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
    5 Q7 o5 n7 a% h- O& I
  32.         TIM_TimeBaseInit(TIM17, &TIM_TimeBaseStructure);
    ( z6 j' G2 N, g
  33.   E1 }# m  r) M
  34.         //Channel 1Configuration in PWM mode
    6 a: y5 ?. g8 {; a1 j: b
  35.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    6 W" R2 \) p6 F
  36.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    % c* Y, N9 H$ `% U1 A( B
  37.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;  C& Z4 F, B+ s7 j
  38.         TIM_OCInitStructure.TIM_Pulse = Channel1Pulse;$ n3 f8 K; y6 e
  39.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
    1 i! t* W/ I0 c* x; y
  40.         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;4 a# k% E8 U* i" c2 Q& `9 y7 ?* H
  41.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
    - N# X6 f. |2 s- ?3 S. E
  42.         TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;. q* ]; b6 ]5 K  J; k( X4 w
  43.         0 k; u( R6 M- a% v" X6 p; l. }
  44.         TIM_OC1Init(TIM17, &TIM_OCInitStructure);- z1 X7 ]" y- R- M( n9 w  P8 w
  45.         TIM_Cmd(TIM17, ENABLE);
    5 H+ f# J  Y  W& p. @5 K2 D% f8 \! X
  46.         TIM_CtrlPWMOutputs(TIM17, ENABLE);
    ! [8 O) h( G# X  k& U
  47. }
复制代码
aliuxiaba 回答时间:2018-4-30 17:06:30
本帖最后由 aliuxiaba 于 2018-4-30 17:11 编辑 & g* e, J2 ~" F/ ^

4 u4 n- w2 Z6 l楼主,我下载了您的压缩包,但是编译的时候提示有27个错误& A. e( }+ I( U1 ]  Q
小白,勿喷
. S! J/ U6 g  `& U* p; o
aliuxiaba 回答时间:2018-4-30 17:07:51
本帖最后由 aliuxiaba 于 2018-4-30 17:09 编辑 : t7 ]: k: r- s# K3 C
( t8 T* X9 r  U' X
file:///C:/Users/Bling/AppData/Roaming/Tencent/QQ/Temp/H0Z@HXCF1$4A1J16%7BYL1Q1G.jpg
1.jpg
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版