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

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

[复制链接]
STMCU-管管 发布时间:2020-10-29 12:53
STM32学习笔记07—基础定时器实验
7 ^! {6 |2 U) X2 U, u
8 |6 N: }' P# @  C$ m0 r
7.1 STM32定时器概述
- m+ q; u, d0 h# j$ K       STM32内部共有8个定时器,其中Timer1和Timer8属于高级定时器,Timer2~Timer5属于通用定时器,8个定时器的资源独立,互不影响。

; x/ O1 i, T) C) M& N9 P       STM32的通用定时器是一个通过可编程预分频器(PSC)驱动的16位自动装载计数器(CNT)构成。STM32的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32的每个通用定时器都是完全独立的,没有互相共享的任何资源。6 d/ C  J' N. s1 K
通用定时器的内部结构如下图所示。
/ u" N; s- q  ^' k/ L
1.png 2 `, `! S9 K- w
7.2 相关寄存器
+ b8 X  a- T4 Q要使用通用定时器的基本功能,一共需要配置4个寄存器,剩余的寄存器都是在输入捕获和输出比较中使用到的。

, i) p% }( t0 s* K7.2.1 控制寄存器1:TIMx_CR1
/ K2 T; c9 \- a( ?
2.png
! r; N" Q9 h+ L/ C/ f  t
Bit 9~Bit 8:时钟分频系数,定义定时器输入时钟频率与数字滤波器采样频率之间的分频系数) d1 |5 g5 }, k6 [, I7 u
       00:采样频率与定时器输入频率相等$ k8 b: U* n" c) l
       01:采样频率是定时器输入频率的2倍
. v& u2 D, w  J! W8 p8 o9 \       10:采样频率是定时器输入频率的4倍
0 d4 u. R+ C+ K2 I' C  u       11:保留! \$ K, V" e8 y' A# n# R2 |; N
Bit 7:自动重装载使能1 v3 P8 `% @/ \$ P+ M
       0:TIMx_ARR寄存器中没有缓冲
1 g# k$ w; @- Z6 `5 D$ h5 m/ `2 K       1:TIMx_ARR寄存器的数据装入缓存器
; G, Y7 B; p+ X: V$ n- u+ jBit 6~Bit 5:选择中央对齐模式- Y6 k8 V* h' r. K" |! g! s& b
       00:边沿对齐模式,计数器根据方向位DIR计数
2 ~5 S8 d- h6 X# y& `- t       01:中央对齐模式1,计数器交替向上向下计数,当TIMx_CCMRx中的CCxS=00时,计数器向下计数时被设置8 I1 w% V, y4 M0 x/ Y* h
       10:中央对齐模式2,计数器交替向上向下计数,当TIMx_CCMRx中的CCxS=00时,计数器向上计数时被设置
$ l6 \1 Y1 S$ E       11:中央对齐模式3,计数器交替向上向下计数,当TIMx_CCMRx中的CCxS=00时,计数器向下和向上计数时       被均设置" u' Y1 N; D- y7 n
Bit 4:计数方向6 K6 t* a4 J) A) D
       0:向上计数,计数器从0计数到TIMx_ARR寄存器的数据时重新从0开始并产生一个计数器溢出事件& Y& `* C  t, Q$ J) [
       1:向下计数,计数器从TIMx_ARR寄存器的数据计数到0时重新从TIMx_ARR寄存器的数据开始并产生一个计数器溢出事件) K0 Q/ N, I) C( r
Bit 3:单脉冲模式$ n) N: W+ M* O- T
       0:发生更新事件时计数器不停止2 w* h; k5 q$ T: R( T/ B
       1:在发生下一次更新事件时,计数器停止0 k/ W- i% U# _) n
Bit 2:更新请求源  T$ J" v8 S( M- p% ?
       0:如果使能了更新中断或DMA请求,计数器溢出/设置UG位/从模式控制器产生更新都产生更新中断或DMA请求
0 I8 z2 e( P4 ]% Q! [0 N       1:如果使能了更新中断或DMA请求,只有计数器溢出才产生更新中断或DMA请求
" R+ ]+ H8 _; V% x  v* Z6 p" KBit 1:禁止更新
3 Q2 B. b7 N. s       0:允许UEV。更新事件由计数器溢出/设置UG位/从模式控制器产生更新事件产生
' q; G6 `7 _  e- E, ]! G       1:不产生更新事件2 P7 e2 a/ S  e
Bit 0:使能计数器" C4 }6 ^5 z% N3 h5 v- Y
       0:禁止计数器3 k2 H# _" f2 ]+ q3 _0 c9 D, E
       1:使能计数器7 X" H* e  L/ r& L
7.2.2 DMA/中断使能寄存器:TIMx_DIER
+ D" J) M9 K" x9 J4 Z
3.png
$ C+ s' L; [2 Y% j- f& z$ J8 G% E4 z# F
Bit 14:允许触发DMA请求$ T! ]( m  d7 X6 O
       0:禁止触发DMA请求
3 o8 D0 y) r" ^+ t9 `       1:允许触发DMA请求
6 N4 z, ^2 G8 T3 k# lBit 12:允许捕获/比较4的DMA请求& U' `6 A' z9 }, ~- ?' l# h
       0:禁止捕获/比较4的DMA请求
+ R" q( X4 }$ E6 s4 Z       1:允许捕获/比较4的DMA请求8 n% J  [. ]4 ?
Bit 11:允许捕获/比较3的DMA请求
1 O4 G; H* q$ L4 O3 g- S5 ~% _4 |       0:禁止捕获/比较3的DMA请求" m; u. K5 k& R* Q0 h
       1:允许捕获/比较3的DMA请求" I" a( {3 C- H3 k
Bit 10:允许捕获/比较2的DMA请求
  e% j+ {" x8 a  j/ O% w: t       0:禁止捕获/比较2的DMA请求; L+ a; E1 ^4 s3 n+ R- v
       1:允许捕获/比较2的DMA请求  |" j1 S' `: L# B/ w  v
Bit 9:允许捕获/比较1的DMA请求& V; e( y& u! y2 Y9 Z
       0:禁止捕获/比较1的DMA请求
' J' D3 h) B% F$ o       1:允许捕获/比较1的DMA请求
, y# j0 M  a) b; c4 qBit 8:允许更新的DMA请求, r' n. N  k/ b
       0:禁止更新的DMA请求9 v+ |: t  a. w, |) r% L  r' ~2 e
       1:允许更新的DMA请求3 K8 ^2 y6 a7 A5 H( d7 r
Bit 6:触发中断使能
3 z( X% w; _: M' K* ?       0:禁止触发中断
" j# g6 V$ h' K/ {) L6 h+ z       1:允许触发中断- `4 y& k' E# g0 U3 h5 q- ?& b/ B
Bit 4:允许捕获/比较4的中断/ s# o( O. {, x8 V5 O' A
       0:禁止捕获/比较4的中断! |0 X) }1 w/ I
       1:允许捕获/比较4的中断$ Y# o% K2 d8 A) r* k
Bit 3:允许捕获/比较3的中断1 Y& N0 T% E+ u4 B
       0:禁止捕获/比较3的中断
$ x4 o8 \) S% j5 M5 n+ [       1:允许捕获/比较3的中断
" r7 Z, g7 U  q) fBit 2:允许捕获/比较2的中断$ i) O, ~0 i: \, S6 v& {! `
       0:禁止捕获/比较2的中断. Q! m! J9 g( [& }2 I  R
       1:允许捕获/比较2的中断
* [5 J# ^% P% _# J. l: _Bit 1:允许捕获/比较1的中断1 A$ q6 }% g0 O% r' d, Q
       0:禁止捕获/比较1的中断' B- J0 }: n5 a; t
       1:允许捕获/比较1的中断  e: B% A  v1 l8 \
Bit 0:允许更新中断
$ u. I7 U$ @* s# {7 S       0:禁止更新中断5 L/ ^* A' M' {6 h+ B8 {
       1:允许更新中断
  P: ?1 E* O+ Z7.2.3 预分频寄存器:TIMx_PSC/ O' X% x+ r. w
4.png
Bit 15~Bit 0:预分频器的值,计数器的时钟频率计算公式为/ `( F7 j) P- \! S( a/ z$ b( O
' o! i& ?" A- X/ K
' n, W4 H4 r1 D0 C6 I
7.2.4 自动重装载寄存器:TIMx_ARR4 L  O3 Y! N9 z4 Q6 _2 A
5.png 0 B! V; ?/ \- |3 t1 O8 h
Bit 15~Bit 0:自动重装载的值,该值就是传送到实际的自动重装载寄存器的数值,当该寄存器的值为空时,计数器不工作。
' M* U# i( R) g; \# |% \( j$ G6 S7.2.5 状态寄存器:TIMx_SR2 d( B0 v" m" n4 X7 h8 o  D/ o$ a
6.png 4 c. o) D+ q6 z0 L7 |' l  Y" z+ y
Bit 12:捕获/比较4重复捕获标记7 L, _/ t7 b' R' q- S9 e
       0:无重复捕获产生& B' o8 K5 h' b2 i* K
       1:当计数器的值捕获到TIMx_CCR4寄存器时,CC4IF的状态已经为1
4 f, B4 n$ L/ q' _Bit 11:捕获/比较3重复捕获标记% t4 t6 K0 G4 m: C: b; n, E
       0:无重复捕获产生6 G  J" H. C" |6 @
       1:当计数器的值捕获到TIMx_CCR3寄存器时,CC3IF的状态已经为1
" Y  i+ X1 v! S+ B# YBit 10:捕获/比较2重复捕获标记
$ k/ R, _5 s$ i7 g- g8 s1 L       0:无重复捕获产生' @6 h/ ?% C0 k4 U! n' E9 d
       1:当计数器的值捕获到TIMx_CCR2寄存器时,CC2IF的状态已经为1% @( r: Y! \5 S) ^4 G8 Z) V  M' d
Bit 9:捕获/比较1重复捕获标记
% W4 |* u# w/ X0 {; T       0:无重复捕获产生
3 a. I) v- e6 w) P& E" W/ a; @       1:当计数器的值捕获到TIMx_CCR1寄存器时,CC1IF的状态已经为1$ U5 J# Y8 j+ X& x0 M1 f
Bit 6:触发器中断标记
( C: s  v, h$ ?* @" ~6 r       0:无触发事件产生, f8 S; v8 L/ u/ l, u5 q
       1:触发器中断等待响应
8 M2 N& t# y$ A/ R: Y. c& O! RBit 4:捕获/比较4中断标记. _( v% ~, P! K! B8 B& g
       通道CC4配置为输出模式:
. F1 M) P& {: z& Q       0:无匹配发生9 q* E/ y. ?9 \& F+ G9 r3 V% M4 A  W
       1:TIMx_CNT的值与TIMx_CCR4的值匹配5 G4 q* e0 {8 c9 u
       通道CC4配置为输入模式:& Y; X) _+ G# U
       0:没有输入捕获产生5 m. p9 n  E6 e# Q3 g9 ?) K
       1:计数器值已经被捕获到TIMx_CCR4中(在IC4上检测到与所选极性相同的边沿)
8 X* R9 D" d2 p; o; n/ p  V! }( R8 K. wBit 3:捕获/比较3中断标记
! S7 l  O# k' A       通道CC3配置为输出模式:
/ M: O( ~. ^8 W       0:无匹配发生1 L/ p# \! V/ N' V) z# h
       1:TIMx_CNT的值与TIMx_CCR3的值匹配
/ r7 A" R6 B$ i/ e  R! n       通道CC3配置为输入模式:+ W4 h+ M; c9 E- Y; k
       0:没有输入捕获产生
) j2 W( Z7 p. r5 Q! B2 X       1:计数器值已经被捕获到TIMx_CCR3中(在IC3上检测到与所选极性相同的边沿)
0 U' F3 P. f9 [4 ~) `: x2 iBit 2:捕获/比较2中断标记
1 b7 c3 y* Z2 f& t2 t9 K       通道CC2配置为输出模式:7 x7 n$ a9 p* W' U* T6 X6 ^
       0:无匹配发生- y: d) A+ E0 ^# H( e/ t( Q
       1:TIMx_CNT的值与TIMx_CCR2的值匹配& f$ T2 ]9 _9 l  f
       通道CC2配置为输入模式:) V" Y/ Z( E5 x0 O
       0:没有输入捕获产生& U3 ?4 @1 ^9 I, g6 `
       1:计数器值已经被捕获到TIMx_CCR2中(在IC2上检测到与所选极性相同的边沿)- m; T, s0 a& y9 x) H
Bit 1:捕获/比较1中断标记( J, k8 \  G/ Y7 n/ T
       通道CC1配置为输出模式:
; l2 a  }* Y/ K2 m/ M       0:无匹配发生
4 Y9 R: ^. J2 S; m       1:TIMx_CNT的值与TIMx_CCR1的值匹配
5 v& a* W/ X6 N1 m& x       通道CC1配置为输入模式:7 L1 z) U. i8 X, ]+ ]4 w6 i
       0:没有输入捕获产生
" S2 [2 W, U; q$ \( A9 |+ ^       1:计数器值已经被捕获到TIMx_CCR1中(在IC1上检测到与所选极性相同的边沿)' ^' f# }$ w9 x) o* S
Bit 0:更新中断标记# i* ]! W& r7 C, X$ ]2 R
       0:无更新事件产生: E0 a: N. L/ `# c+ m8 T
       1:更新中断等待响应,当产生更新事件时该位由硬件置1,由软件清0
8 n, W' h$ p3 U4 |7.2.6 计数器:TIMx_CNT
( z4 _/ C' `- b' ?1 i' b
7.png / s) |/ Z2 t* a# J9 k3 d/ C
Bit 15~Bit 0:计数器的值% c* U+ w0 g& ]
7.3 定时器例程4 S! P& L' V8 Q3 g
利用定时器1实现LED以1Hz闪烁,LED接在PA1上。
, k. g) F) N. m0 U2 M. l3 F$ z' Y
(1)创建TIM1驱动文件,tim.c和tim.h,并将文件添加进工程。1 h+ w- Z' Z& F1 }* K( t' d
8.png
4 L: U) d, i3 d( ?
(2)在寄存器文件中添加定义如下图所示。* E+ I! ~" S% R& O0 c* R9 H/ l
添加定时器地址( a* h* ]# ]9 `+ l8 q. B
9.png
8 l  q/ C' p9 q  }+ o& _; a
添加定时器结构体映射& m# F2 ^5 S( ~2 ?
10.png
2 H* r* `( ^9 P% n: K- m
(3)tim.h写入如下图所示代码& Q: Q; \' h- ^7 I! l: E( j+ g
11.png
8 Q& K& G8 m7 J- W(4)tim.c写入如下所示代码! r) l- z/ R0 [9 c. g
  1. $ U, M* {/ h: {6 k0 q
  2. #include "tim.h"- E6 ], Q# k7 K, i# R7 `
  3. /***************************************************  U. X7 m8 \1 T" c5 R) q
  4. Name    :TIM7_IRQHandler! K! u/ Y5 B: V* r$ R5 F( z4 v' E
  5. Function    :TIM7中断服务函数+ Q3 `, ]2 f* X% j8 m" O
  6. Paramater  :None7 k2 J# j. r! O7 B3 h1 F) l( C, B- Z
  7. Return    :None% z: r4 V; u- }
  8. ***************************************************// r) w2 F4 C" D$ w" R( t& O
  9. u8 TIM1_Count ;7 M$ E5 ^% V, @# S6 ~  O
  10. void TIM1_UP_IRQHandler()
    . S9 Q3 A* [0 M7 h" Z( @
  11. {( E  D( j1 B  W0 B  T
  12.   if( ( TIM1->SR&0x01 )==0x01 )
    3 f9 |' b; \( F" q- c+ T
  13.   {7 y  h' r4 J! G- d0 b7 E# ^6 t
  14.     TIM1_Count ++ ;
    ( l) v7 {# D/ p1 o& n
  15.     if( TIM1_Count==1 )
    1 S  ~) V, S8 O4 Z3 S' s, h! j
  16.       LED = 0 ;; e( K, N* v; t
  17.     else if( TIM1_Count==2 )
    , k% G2 b; ], q/ ]
  18.     {6 F5 z) j" @' ~/ e
  19.       LED = 1 ;
    " a5 e2 o3 M: Q* J& n* M
  20.       TIM1_Count = 0 ;8 Z9 s2 B' U/ B; v  b
  21.     }$ R- ?/ C# J5 _
  22.   }* J! j* J( Q1 F, H/ i8 g% `
  23.   TIM1->SR &= ~( 1<<0 ) ;/ K% q( c* y. F! P9 o7 N% I5 X8 x
  24. }  E. Q  P1 X2 `: \* l7 s
  25. /***************************************************
    1 P% w; u- C( \9 D+ w  l4 w
  26. Name    :TIM7_Init  t3 _) v: j* [+ A% T1 O! @
  27. Function    :TIM7初始化
    ; l9 F1 J6 h' O) n# U: }) \3 q$ L4 K
  28. Paramater  :  F5 M7 J2 w1 O4 `# A1 U
  29.       psc:预分频系数
    ( Z  |+ x' Q" h4 N( {6 G2 g
  30.       arr:重装载值3 C$ o3 ]5 l% T& ?. \7 }
  31. Return    :None
    & ]' `$ t8 x/ D6 I/ W1 n% a
  32. ***************************************************/
    2 S1 \5 t1 {" `# A0 X& Q
  33. void TIM1_Init( u16 psc, u16 arr )
    6 C; H% F" }& V& t) s$ e- j% R: e
  34. {
    # @5 |: N6 F% Y1 z6 e9 ~5 g
  35.   //LED初始化  T9 m7 @% o( @2 k- [! ~
  36.   RCC->APB2ENR |= 1<<2 ;
    2 T8 [; H% B' w9 I- b1 v7 {6 k
  37.   GPIOA->CRL &= 0xFFFFFF0F ;; N8 Z' u* A7 d0 g/ ?
  38.   GPIOA->CRL |= 0x00000030 ;2 V) s* Q9 |1 b2 b2 Y
  39.   LED = 1 ;
    & u8 D( V, A  P) m* l8 X
  40.   //定时器初始化
    % C) x  E" a8 a% g' {) I
  41.   RCC->APB2ENR |= 1<<11 ;
    - G$ \8 S" r( |8 ^
  42.   TIM1->DIER |= 1<<0 ;
    8 \8 u% H2 g3 J0 D4 u8 q& c# M
  43.   TIM1->PSC = psc ;. n7 z3 q4 P$ P$ b+ h% R
  44.   TIM1->ARR = arr ;. q0 I$ r% U9 a9 x
  45.   TIM1->CR1 |= 1<<0 ;
    / ]8 A& ^  N3 ~
  46.   NVIC_Init( 3, 2, TIM1_UP_IRQn, 2 ) ;
    8 S# @6 U# n' q! h$ m! F
  47.   }
复制代码

7 Y5 G. @) o. [. Q% E# n8 y
, q9 f0 j! l! K8 l(5)主函数编写如下所示代码' a$ t, l& Z0 O3 F- q
12.png
4 M, w: o) j$ [# f7.4 软件仿真截图
; ?7 J0 `8 @0 L( g- S9 k0 G- W: }6 y4 |7 ~% `4 q( Y
13.png 6 q* b4 Y9 S: G+ T. Z* h

6 ~3 \% @' _* y  d" Y$ p/ @
8 G2 M) @$ f) a$ ~) {, i4 v: {
收藏 评论0 发布时间:2020-10-29 12:53

举报

0个回答

所属标签

相似分享

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