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

STM32学习笔记07—基础定时器实验

[复制链接]
STMCU-管管 发布时间:2020-10-29 12:53
STM32学习笔记07—基础定时器实验
0 E: T* R7 x+ [4 O9 F5 _
7 b  r' y8 q& c6 [9 z, h3 P! ^0 D3 ?( w
7.1 STM32定时器概述% [& _- V: X/ l& X) r
       STM32内部共有8个定时器,其中Timer1和Timer8属于高级定时器,Timer2~Timer5属于通用定时器,8个定时器的资源独立,互不影响。

1 h: X. P, A6 `, o/ t       STM32的通用定时器是一个通过可编程预分频器(PSC)驱动的16位自动装载计数器(CNT)构成。STM32的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32的每个通用定时器都是完全独立的,没有互相共享的任何资源。
! b( }7 L. `* f7 `1 H通用定时器的内部结构如下图所示。
1 W. w9 ]) E' N
1.png
: D" z( G3 @$ V& M$ R4 V8 m% l5 m- B: y
7.2 相关寄存器
5 t5 U. D2 E- j" G要使用通用定时器的基本功能,一共需要配置4个寄存器,剩余的寄存器都是在输入捕获和输出比较中使用到的。
# t  W2 p! Q" p6 M6 E
7.2.1 控制寄存器1:TIMx_CR1  L! Q, e! }, L4 I4 V
2.png . N3 P9 ^5 T  G8 \. k& e
Bit 9~Bit 8:时钟分频系数,定义定时器输入时钟频率与数字滤波器采样频率之间的分频系数4 J. D, y1 \7 h# r1 |2 @
       00:采样频率与定时器输入频率相等( g1 c$ G0 P" `& F
       01:采样频率是定时器输入频率的2倍
; U- h) K/ v! F6 |+ H       10:采样频率是定时器输入频率的4倍; k7 p* B, Y9 H. D- z! [8 t/ |) \
       11:保留0 S+ p" E0 F5 \  M. R: x
Bit 7:自动重装载使能" _7 z5 u- }6 n4 V6 t
       0:TIMx_ARR寄存器中没有缓冲* H5 i8 [/ x" F
       1:TIMx_ARR寄存器的数据装入缓存器' x  r' a( F* B& P% ]4 a! K4 G
Bit 6~Bit 5:选择中央对齐模式
3 c8 y5 g: V! l- c8 h       00:边沿对齐模式,计数器根据方向位DIR计数
8 A5 [& l9 b2 W2 y5 _2 ^- ~; ^       01:中央对齐模式1,计数器交替向上向下计数,当TIMx_CCMRx中的CCxS=00时,计数器向下计数时被设置( q& v8 A8 }' M4 H
       10:中央对齐模式2,计数器交替向上向下计数,当TIMx_CCMRx中的CCxS=00时,计数器向上计数时被设置4 [  T  ^* z  O) U, |- R
       11:中央对齐模式3,计数器交替向上向下计数,当TIMx_CCMRx中的CCxS=00时,计数器向下和向上计数时       被均设置% m9 I0 l; B% j2 p- t( o
Bit 4:计数方向
/ a- P+ H) Y7 e* I0 C. q9 i# ]       0:向上计数,计数器从0计数到TIMx_ARR寄存器的数据时重新从0开始并产生一个计数器溢出事件% `3 r3 C, q* U' r
       1:向下计数,计数器从TIMx_ARR寄存器的数据计数到0时重新从TIMx_ARR寄存器的数据开始并产生一个计数器溢出事件8 a! U6 d5 Q! o8 e  h
Bit 3:单脉冲模式( {' f: P. A8 w" A, a2 z
       0:发生更新事件时计数器不停止, D; h( t7 H6 {# l0 [
       1:在发生下一次更新事件时,计数器停止- h+ Y6 T4 y$ V0 b. T7 x
Bit 2:更新请求源
# [& ?) D) O) h* I. j. P       0:如果使能了更新中断或DMA请求,计数器溢出/设置UG位/从模式控制器产生更新都产生更新中断或DMA请求1 Y& H" Q8 u% V, g" x
       1:如果使能了更新中断或DMA请求,只有计数器溢出才产生更新中断或DMA请求1 ]$ K6 t/ H3 v/ d3 I6 Y: h& g
Bit 1:禁止更新, K; H0 ~0 q( g+ ]6 ?5 N" B
       0:允许UEV。更新事件由计数器溢出/设置UG位/从模式控制器产生更新事件产生
1 {6 U8 Q* N% J       1:不产生更新事件: @1 {/ C1 O  P" K
Bit 0:使能计数器
: Z. \  p4 r# p       0:禁止计数器
! r9 v- N5 }8 d! ]) h7 M       1:使能计数器
" P& A, Q& H! H1 X7 b7.2.2 DMA/中断使能寄存器:TIMx_DIER
( U# ~3 H* x6 a  c5 p: ?
3.png
3 o; s$ o6 Y2 @$ `) J+ m2 \
Bit 14:允许触发DMA请求- B- R  q, ?+ T
       0:禁止触发DMA请求
5 `4 K$ @$ C3 w       1:允许触发DMA请求
8 h- K' G7 d/ T# [7 f' ZBit 12:允许捕获/比较4的DMA请求
: p( f, `" K, o: ?% ?       0:禁止捕获/比较4的DMA请求
; M/ p: B( [9 Q4 ]2 ?       1:允许捕获/比较4的DMA请求
6 n$ R1 j6 ?  r- O  W, CBit 11:允许捕获/比较3的DMA请求
; a7 ^3 N; y6 g. A! p! x4 Q       0:禁止捕获/比较3的DMA请求
' M& U9 W$ O# w1 L! z       1:允许捕获/比较3的DMA请求
5 d3 _# ^& e* D( Z9 }6 w/ vBit 10:允许捕获/比较2的DMA请求7 T3 V0 r) t" F
       0:禁止捕获/比较2的DMA请求
$ L, F4 t1 S3 Y: \, k7 A+ p       1:允许捕获/比较2的DMA请求1 b5 }  d6 k* M
Bit 9:允许捕获/比较1的DMA请求
1 b. B& ?7 ]$ A" R/ K( D       0:禁止捕获/比较1的DMA请求" H9 O; r5 @' q) Q- C2 m
       1:允许捕获/比较1的DMA请求
: k# x) j+ `5 G& IBit 8:允许更新的DMA请求+ b3 w9 U; ^6 Q- A8 ^6 v4 i0 m
       0:禁止更新的DMA请求3 F8 L' k/ R# ]; }
       1:允许更新的DMA请求
, G" I' \0 x* M% y! O- `Bit 6:触发中断使能. L3 A# j$ o  V$ Z7 W! }$ M4 e
       0:禁止触发中断3 Q! E$ N( G$ K7 O# y
       1:允许触发中断
' J+ H- V6 G* k' A# G6 iBit 4:允许捕获/比较4的中断1 F( @  y( [2 ^; n% s, c& \  ]
       0:禁止捕获/比较4的中断4 I( ?2 {; {; J
       1:允许捕获/比较4的中断
5 C* _: ?0 A9 |& I. B1 RBit 3:允许捕获/比较3的中断
, g! q; v6 j4 {' ]) n9 V# d) o; g       0:禁止捕获/比较3的中断- H6 L$ ~) b# M% Q* H
       1:允许捕获/比较3的中断+ m, g  D4 f; i* K: E. |1 z& [6 X
Bit 2:允许捕获/比较2的中断
( p& W# b' T8 f4 r+ E5 v# d       0:禁止捕获/比较2的中断
5 z7 F' C: J7 M" b3 P; ~) B       1:允许捕获/比较2的中断9 u% J' N/ a2 f1 U; ~
Bit 1:允许捕获/比较1的中断% V6 J. l3 b; u8 X2 s
       0:禁止捕获/比较1的中断0 g+ r* B6 e6 [' }1 g% S+ l
       1:允许捕获/比较1的中断
1 p( D& G# ~; O8 m! j" Y5 a/ k" u- BBit 0:允许更新中断
8 a( x! x* |% _" S+ n       0:禁止更新中断0 c+ A* f9 |% D; p& l# }
       1:允许更新中断! a/ J; Q7 k' a) @
7.2.3 预分频寄存器:TIMx_PSC- g* I9 ^. L5 c; m: Y8 X
4.png
Bit 15~Bit 0:预分频器的值,计数器的时钟频率计算公式为
, Y  [( I  P  \! y8 e- t4 M. ^  H5 {' S9 I0 g7 Y
  A! f' K7 i( ?( o2 P3 J
7.2.4 自动重装载寄存器:TIMx_ARR
5 c  w  S3 k2 w
5.png
3 E& M  ~& J7 m0 o3 z
Bit 15~Bit 0:自动重装载的值,该值就是传送到实际的自动重装载寄存器的数值,当该寄存器的值为空时,计数器不工作。$ R9 C' a' D- q6 x6 p! I: x
7.2.5 状态寄存器:TIMx_SR
$ E* U7 f, c! v- S) J
6.png
1 y* p) _- `1 h. T/ X
Bit 12:捕获/比较4重复捕获标记
0 L* w, J$ |2 i2 y6 h8 ]0 A       0:无重复捕获产生* f8 E+ T/ Z: ~0 Z. @& c$ A
       1:当计数器的值捕获到TIMx_CCR4寄存器时,CC4IF的状态已经为1
; G% V" X6 ]4 k$ r3 A$ ^Bit 11:捕获/比较3重复捕获标记
$ b- Y/ c) r8 P       0:无重复捕获产生
9 Q# X7 w' ^/ Z       1:当计数器的值捕获到TIMx_CCR3寄存器时,CC3IF的状态已经为18 v$ Y- A3 M: C4 h8 y+ Y
Bit 10:捕获/比较2重复捕获标记3 c6 w* D( j# E/ j: U
       0:无重复捕获产生6 Z; j, o( W) D' X& [- d0 y
       1:当计数器的值捕获到TIMx_CCR2寄存器时,CC2IF的状态已经为1& A$ o4 U: U, m
Bit 9:捕获/比较1重复捕获标记
. j) q! [1 T& d5 h" c4 `* E7 W       0:无重复捕获产生  X+ I* O# h- U1 L$ g- u
       1:当计数器的值捕获到TIMx_CCR1寄存器时,CC1IF的状态已经为1. E1 ~  q. g1 L
Bit 6:触发器中断标记
8 D) R  m# Y* i       0:无触发事件产生4 d0 y1 x9 M) \4 @
       1:触发器中断等待响应. j9 K1 k& C1 [# Y* I! \
Bit 4:捕获/比较4中断标记  V1 {' ]' @& f& c9 R" S
       通道CC4配置为输出模式:( |7 Z6 E1 i/ ~! r
       0:无匹配发生0 G, M, M2 T2 U% @5 Y: D
       1:TIMx_CNT的值与TIMx_CCR4的值匹配
* r# G. ^9 k: V7 P. ~       通道CC4配置为输入模式:1 y; i7 p) V+ v1 ?
       0:没有输入捕获产生
  c0 I2 u% u. g" _0 O9 q       1:计数器值已经被捕获到TIMx_CCR4中(在IC4上检测到与所选极性相同的边沿)
/ T. p0 d: c) G1 t* J* N* aBit 3:捕获/比较3中断标记
( d' Y; e# _4 y1 \       通道CC3配置为输出模式:/ r8 z0 e3 g. X% [/ g
       0:无匹配发生
' B; T2 ]; w% r; d4 O2 @1 t' y) r       1:TIMx_CNT的值与TIMx_CCR3的值匹配
/ ~7 o: C( Z( P  y       通道CC3配置为输入模式:4 f  c! p6 S, o
       0:没有输入捕获产生6 W0 F1 @: F$ _  K  X, u
       1:计数器值已经被捕获到TIMx_CCR3中(在IC3上检测到与所选极性相同的边沿); w; h2 D! k" x# ]4 k8 u2 i  N& C0 G
Bit 2:捕获/比较2中断标记; E6 D( W/ q& z$ g; ^4 D& s1 _. T
       通道CC2配置为输出模式:( K8 d- D2 A& Z( k7 i# _) g
       0:无匹配发生
& D) }  W) B% Q- i$ S: ]1 A8 g       1:TIMx_CNT的值与TIMx_CCR2的值匹配
  z2 r; O. y, M2 a% ^/ l2 g  C       通道CC2配置为输入模式:
" E0 _( z1 e/ E. U) p       0:没有输入捕获产生
- u& x' ^. Z$ ~* N) n       1:计数器值已经被捕获到TIMx_CCR2中(在IC2上检测到与所选极性相同的边沿)
) b+ D6 }' B! U) w, B% `Bit 1:捕获/比较1中断标记+ ]( ]/ d2 y$ D3 t( z. [+ W( v: _
       通道CC1配置为输出模式:
$ I$ C+ @( Q, W7 H- n       0:无匹配发生( ?' j$ l4 _, K4 \2 V
       1:TIMx_CNT的值与TIMx_CCR1的值匹配" `7 |1 L6 b6 I6 l' H3 l, ]
       通道CC1配置为输入模式:$ ], B0 p. Z& s. S7 p! M1 I
       0:没有输入捕获产生
) ?' y+ ~) ?- s. j' O* b       1:计数器值已经被捕获到TIMx_CCR1中(在IC1上检测到与所选极性相同的边沿)
( w* k" J- S9 [1 h# A+ Y/ bBit 0:更新中断标记
8 _% x. ^, b; F9 c5 g/ ~3 j! Q       0:无更新事件产生
) C3 `5 I+ D; r5 L, [! c  @       1:更新中断等待响应,当产生更新事件时该位由硬件置1,由软件清0
; z/ R3 l3 D/ K3 L7.2.6 计数器:TIMx_CNT
" v' i) k6 X- Y; ~& P
7.png $ S( k9 u6 a- B& t
Bit 15~Bit 0:计数器的值% P( {# u8 }! z4 j' m4 {! ^6 P0 J
7.3 定时器例程
$ b5 r8 r% N. ]0 x利用定时器1实现LED以1Hz闪烁,LED接在PA1上。

, S; V. T! Z$ C- r3 _7 p7 I/ @( m(1)创建TIM1驱动文件,tim.c和tim.h,并将文件添加进工程。4 R+ a, e4 y; W: |
8.png
, E) v* m$ k! V5 Y! r
(2)在寄存器文件中添加定义如下图所示。
! X7 q# n/ t: ?9 e) s1 t添加定时器地址
. S: R6 F3 M5 `+ l$ K, s
9.png . ~, k2 l$ R% Z3 ]; I0 h/ _# O
添加定时器结构体映射
8 H% D* k0 m  G
10.png
9 S7 {# @3 p+ X. x4 m6 ?
(3)tim.h写入如下图所示代码" W3 M6 i* s% `3 v
11.png * M+ j1 Y3 _8 C5 y6 t
(4)tim.c写入如下所示代码
; j0 o5 c9 ~, t- W& M4 r( ?

  1. 1 J. ^  @4 e* [
  2. #include "tim.h"
    0 J! i8 i2 A+ M1 d1 U! k- x
  3. /***************************************************
    ; [. O8 O) }7 o5 ^; J. t0 l8 p
  4. Name    :TIM7_IRQHandler
    $ D4 I# J" b' C/ T9 ]8 K3 z
  5. Function    :TIM7中断服务函数
    1 L" a+ B/ X, [
  6. Paramater  :None
    8 u7 b4 L3 D2 o4 }% \$ t# x5 x
  7. Return    :None+ W. o  Z% Z0 O9 q% z$ j0 v
  8. ***************************************************/
    5 H! a8 W8 v: [! u: g  s
  9. u8 TIM1_Count ;
    ( c8 J) [, I. _' D
  10. void TIM1_UP_IRQHandler()  ^$ q4 ]  K& \7 J4 X$ C6 }
  11. {& V6 {8 q& E$ T, P. C) _" Y
  12.   if( ( TIM1->SR&0x01 )==0x01 )
    . ?: _3 `, n* @3 F
  13.   {
    ) P+ t/ U' I; q: ]+ i: S7 m6 B
  14.     TIM1_Count ++ ;9 G' V7 b" t* s; ]) ^8 u
  15.     if( TIM1_Count==1 )+ ~& [4 l8 H9 I1 D$ T
  16.       LED = 0 ;
    % ~, R5 ]+ g" ]# ~# b& O
  17.     else if( TIM1_Count==2 ): {* {9 ^/ D6 i4 o. m
  18.     {6 _0 _. D2 n% J; P8 `& T
  19.       LED = 1 ;
      R8 H) L; m1 ?5 z$ r# j' Q% o
  20.       TIM1_Count = 0 ;. Q/ n/ H+ E5 Q$ |* E1 @
  21.     }3 S: M/ ?+ e7 o" U( Z7 D7 P
  22.   }
    / @* U* _, {+ m, ]1 ]7 R
  23.   TIM1->SR &= ~( 1<<0 ) ;
    3 K, o+ T) ~5 U% ^& ?
  24. }
    ! N" C" p; _5 n/ E% M0 f4 h4 \5 \4 E
  25. /***************************************************9 }1 p. o3 }/ N& C
  26. Name    :TIM7_Init
    # J8 B) G! R" g
  27. Function    :TIM7初始化
    7 S: m3 J' U0 G" Y. S
  28. Paramater  :
    8 O0 A0 c' T- L1 g( _
  29.       psc:预分频系数/ P% K" n7 H% T: {- V* y
  30.       arr:重装载值; s5 K& Y0 @7 p  g; W
  31. Return    :None' X3 m+ Z$ K& L
  32. ***************************************************/
    9 O3 c2 a1 R& ?# y/ p, {
  33. void TIM1_Init( u16 psc, u16 arr )
    5 T% I8 I/ \! d, ~' U
  34. {$ t5 l; f9 ?# Z) R9 L
  35.   //LED初始化
    ' T' D" `) J5 Y% i4 c- }- L# q
  36.   RCC->APB2ENR |= 1<<2 ;7 c& A6 G, F. T, f( N: _
  37.   GPIOA->CRL &= 0xFFFFFF0F ;
    $ S5 I' a" M) N1 }  \0 B
  38.   GPIOA->CRL |= 0x00000030 ;& k! T8 J# W8 H5 Y8 {# B+ K
  39.   LED = 1 ;
    # G  @1 g1 Q, O$ ^$ r) S2 B9 T
  40.   //定时器初始化% j* J0 B+ L$ t4 x$ A+ A9 |, o
  41.   RCC->APB2ENR |= 1<<11 ;1 G& Y4 S( S& g8 B) p* R2 D
  42.   TIM1->DIER |= 1<<0 ;5 a5 U; V/ P0 J$ ]: w
  43.   TIM1->PSC = psc ;
    0 x5 T6 Z$ r+ G9 V! L- E
  44.   TIM1->ARR = arr ;: {# h! k  k5 ]
  45.   TIM1->CR1 |= 1<<0 ;
    4 q8 e  r+ ?1 Q
  46.   NVIC_Init( 3, 2, TIM1_UP_IRQn, 2 ) ;
    & |( ?; b, F. C0 i
  47.   }
复制代码
9 N3 P+ N  c, `7 r
) k4 W! o; \" I4 |0 l: X
(5)主函数编写如下所示代码4 z6 V0 C4 g2 e% ]" C% n  T! _
12.png " \; w# q" t% {3 f
7.4 软件仿真截图
$ o) P8 ]+ Y) g  L6 f
3 A  g% @7 V1 R  K# Q: @1 F  }; c 13.png ( p: I* a8 o3 P9 d( c) P
0 K: W0 S/ H( s8 u' v0 R

* B' T6 u3 F8 c8 B$ w2 c9 j3 D% d
收藏 评论0 发布时间:2020-10-29 12:53

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版