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

【零基础学习STM32】第十二讲:通用定时器——定时点亮LED

[复制链接]
kkhkbb 发布时间:2018-4-11 11:21
本帖最后由 kkhkbb 于 2018-4-11 11:33 编辑 ( @: p$ P9 d0 F) B3 j8 {

, w( K7 |# s! u4 k% m
一、 概述
1、 TIM3简介
      iCore3使用的STM32F407IGT6芯片的具有10个通用定时器,分别为TIM2-TIM5、TIM9-TIM14,可用于定时、计数、输出PWM等。不同的定时器的计数方式、计数位数及功能有所不同,实验中使用的是TIM3,所以只对TIM3进行介绍。
2、 TIM3简介
      TIM3是一个16位递增、递减和递增/递减自动重载计数器,16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于 1 到 65536 之间,可用于:输入捕获、 输出比较、PWM 生成(边沿和中心对齐模式)和单脉冲模式输出。在实际应用中,可以根据需要进行相应的配置,使用相应的功能。
二、硬件电路
图片1.png
                    图12_0 三色LED
      在iCore3双核心开发板中,三色LED与STM32F407相连,限流电阻为1K。
三、 实验原理
      实验中,通过TIM3实现500ms定时,每过500ms,LED颜色变化一次,三色LED按定时间隔交替闪烁。
四、 源代码
1.主函数
  1. /*# I9 `; a8 }/ R+ j
  2. * Name                : main
    ; P- l" Z% j8 n8 Q
  3. * Description         : ---
    . m; @2 k9 U4 D) L1 M: u, ]
  4. * Author              : ysloveivy.7 ]( z1 ^1 N  G) C  W1 K  s) y9 W
  5. *5 S# ]4 w& P+ ]( v
  6. * History6 X0 d4 n, G3 z; W# ]  a* T" h
  7. * --------------------
    - A; o! E$ u$ n$ x1 L
  8. * Rev                 : 0.00
    1 w) Q; Q7 y! `2 R% M
  9. * Date                : 11/30/2015
    ! B7 h( }( V) A: ]  ]! s
  10. * 4 B- K, ?( ]  c2 @0 z) l
  11. * create.
    . v; P6 c: e) E6 B* S0 _; n- {
  12. * --------------------( |( i3 d) L9 b8 }, E8 r
  13. */! H8 I+ p2 o; E5 r. u. M
  14. int main(void)8 l( |- t! ~0 k9 H
  15. {
    6 l) L; k0 d; h  b, _" f
  16.         //定时500ms,每隔500ms三色LED灯闪烁一次
    , g! i  b5 o2 R) w
  17.         led.initialize();9 P8 w  ?1 L: ]& P0 L: X
  18.         timer3.initialize();
    - c# i" M9 a( E2 y0 R$ b
  19.         while(1){
    3 H* B% y- X: O! ^5 f
  20.         }
    3 R5 t" q$ i0 q
  21. }
复制代码
2.TIM3初始化代码
  1. /*
    6 p% w. X4 v5 v- F* z. b# \, H
  2. * Name                : initialize$ A/ X# g, i4 `+ M! k
  3. * Description         : ---7 `, V, }4 w9 w/ E" K/ x0 h5 y
  4. * Author              : ysloveivy.  ]/ W0 F9 ~7 P. t9 F
  5. *& U3 Z* j$ E" o* z
  6. * History" h/ a; P$ @1 O8 {
  7. * --------------------; d7 E" P( }3 w
  8. * Rev                 : 0.00( [) p/ R3 U* L) ?$ N4 y; |
  9. * Date                : 11/30/2015, \5 x4 ?0 A' ?/ L
  10. *
    / o( O& Y. m% [/ h" B: N/ m% r
  11. * create.3 Y3 J+ _, S2 C
  12. * --------------------
    * p/ d' I8 w4 u0 h
  13. */$ \/ N$ P, n- o, j. {
  14. static int initialize(void)
    * Q- V) D+ X5 [5 _7 e
  15. {
    9 M( ~# p# P& b. Q: z+ S+ v) I+ Q
  16.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    2 D0 F0 p9 z" _" [$ i
  17.         NVIC_InitTypeDef NVIC_InitStructure;- T* \2 E4 a( U$ z) i8 T1 ]

  18. 8 ~- r4 @- g- U$ p+ c# r: \/ e
  19.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);               //使能TIM3时钟
    : z# e9 {! Z+ n
  20. ; G8 ~7 ~) T% ^
  21.         TIM_TimeBaseInitStructure.TIM_Period = 4999;               //设置自动重载值
    + P) O) }! M- X$ g* J
  22.         TIM_TimeBaseInitStructure.TIM_Prescaler = 8399;              //设置定时器预分频系数7 O* Y1 g7 x/ E5 k
  23.         TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;      //设置时钟分频因子+ r" {. |/ ]) E0 }3 {
  24.         TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;   //向上计数模式
    0 A" {: c6 g; t
  25.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
      C7 H1 B& p& b- p$ a; ]- x
  26.         TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);                  //使能TIM3更新中断
    ' i6 @2 ^4 W( |! q( e
  27.         TIM_Cmd(TIM3,ENABLE);                                             //使能TIM3$ O6 r; K4 Z" g( A9 ?0 Q
  28.           //中断优先级分组
    7 N# t7 x7 v$ D6 H  o! |
  29.         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
    7 m8 w) _$ v4 [3 d$ r
  30.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
    $ D8 c7 [8 ]5 b: Y
  31.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;: {. v1 W9 S2 ^$ Y
  32.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    9 o  C/ Y+ B( n" U3 b  t
  33.         NVIC_Init(&NVIC_InitStructure);
    2 N! a, m0 _# g

  34. $ s: E' w! ?2 X' l7 z- e' x/ d# z
  35.         return 0;
    + U, C8 {2 M3 y( F/ D
  36. }# [' [, Q/ Q) c4 J9 K* X* j
  37. + U: V( d4 |2 a4 t3 N
  38. /*
    8 k" f, X# h0 O1 i+ z8 E! j
  39. * Name                : TIM3_IRQHandler. @9 M* d4 b2 N. H
  40. * Description         : ---
    . I5 n3 i1 `7 m. N
  41. * Author              : ysloveivy.4 m$ _5 ~. w& |3 i
  42. *
    6 s2 C/ {- f2 c& O+ o' O& L" L9 G, [7 ^
  43. * History
      Y( A( j7 o1 d: P
  44. * -------------------- _- P4 G" ~+ D4 b
  45. * Rev                 : 0.00
    " C$ p7 I2 d: s9 q" q: y' C2 ^
  46. * Date                : 30/11/2015! q4 C4 K4 {% A* {9 A% L
  47. *
    ( O4 @: N& H# K' U* T- p
  48. * create.
    5 T* i" R& R; W4 o; Q
  49. * -------------------
    " a: C: M; u& Q# H2 |
  50. */
    7 n) ^. w/ d4 C5 d$ o
  51. void TIM3_IRQHandler(void). a" h7 }! U* c; j
  52. {
    8 H' `/ Q2 e7 j2 o! y/ p4 h3 g
  53.         static int counter = 0;. I2 u; m5 i- {# ^6 T+ D; c3 [
  54. ' }" Z" t9 t) ]; h. R  S* I
  55.         //定时500ms,每隔500ms三色LED灯闪烁一次, T3 k* Z# q. N% P
  56.         if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET): r8 Z% }& O1 O2 ~% g) M" w  x4 B
  57.         {
    ; ^- D; y' U# d; {/ x
  58.                 if(counter % 3 == 0){, f  q% p" B/ g; {: n$ |1 B! m
  59.                         LED_RED_ON;
    : [2 B/ r! V8 T# [
  60.                         LED_BLUE_OFF;
    : M- y" d& \1 U5 p5 Q# M
  61.                         LED_GREEN_OFF;) A' B2 d, T! o# a% H4 d
  62.                 }else if(counter % 3 == 1){
    / R7 ~; o- A8 S( B2 v$ `
  63.                         LED_RED_OFF;9 J5 m! n3 l1 w: T3 o0 e/ t7 L
  64.                         LED_BLUE_ON;
      g4 t- G5 d# J
  65.                         LED_GREEN_OFF;
    0 ?# v* Q" N" a; `! O! t
  66.                 }else if(counter % 3 == 2){6 w, R+ K# k0 S: O# e' @
  67.                         LED_RED_OFF;
    $ ~8 ?# m0 p0 z' t0 a% U
  68.                         LED_BLUE_OFF;% w7 Q  m8 A' S5 x) s* u
  69.                         LED_GREEN_ON;
    4 n3 Y; Z  P! v. ~7 n7 ~1 V9 k
  70.                 }
    . h' A0 _$ J1 V  Q; s! z/ W
  71.                 counter ++;
    " P' T/ E$ F  n
  72.         }
    ) e/ U9 K$ w/ |1 V
  73.         TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
    6 W6 {% @- _3 ]3 ]% V
  74. }
复制代码
3.定时器初始化结构体
  1. typedef struct
    6 C5 c+ Z& }, Q4 I
  2. {+ I+ ]; P1 F2 r
  3.   uint16_t TIM_Prescaler;                                               
    * p9 q" _/ f$ O* `& B6 d7 O
  4.   uint16_t TIM_CounterMode;      
    % O7 z# Z/ O) o' w! E
  5.   uint32_t TIM_Period;         
    ' u1 e8 ^" ?) V# Z  j& x" D
  6.   uint16_t TIM_ClockDivision;    + X! Y# @  A+ ~( [/ Z
  7.   uint8_t TIM_RepetitionCounter;  ( }7 j9 \. q( H
  8. } TIM_TimeBaseInitTypeDef;
复制代码
   TIM_Prescaler:定时器预分频系数,0x0000- 0xFFFF。                                            
   TIM_CounterMode:计数模式,可选择向上计数 、向下计数和中央对其模式。  
   TIM_Period:定时器自动重载值,0x0000- 0xFFFF      
   TIM_ClockDivision:时钟分频因子,可选择1、2和4分频。
   TIM_RepetitionCounter:重复计数值,重复溢出相应的次数,进入中断。
五、 实验现象
       iCore3 双核心板三色LED每500ms交替闪烁。
六、 代码包下载

+ c6 v1 p# Q8 i& }3 |
( p. ^+ E) S* U1 P4 O/ E3 R8 C
赞 收藏 评论0 发布时间:2018-4-11 11:21

举报

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