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

【经验分享】STM32G4之基本定时器

[复制链接]
STMCU小助手 发布时间:2022-7-5 22:02
一、定时器介绍
8 u, W; \. c+ F: a2 }. pSTM32G4系列共有10个定时器
; e) d- M$ W$ M( G5 T* O: F% p/ f# x) u7 R  P4 z( n
• 2个基本定时器(TIM6和TIM7)。2 Y$ N6 E! d' w& r) o, g
• 3个通用定时器(TIM2~TIM4):全功能通用定时器。
9 w/ G  n& T/ a2 b6 c& G• 3个通用定时器(TIM15~TIM17):只有1个或者2个通道。
! H3 P) R6 @# ~• 2个高级控制定时器(TIM1和TIM8)。
( W- ~; E; `( V/ C  c% c4 |* N! Q8 b' B
{]4T~3)27A84`[WT3{NC6(N.png 8 P. ^8 R" z# U; [# c

! @# ?' ^3 u2 C  M; u1 y" W; ^不同定时器的功能区别:
2 K8 A( e* q8 j6 i& Y! @& m& N! ^( m
基本定时器有的功能通用定时器都有# O2 g. {( `- s
通用定时器有的功能高级控制定时器都有; q9 {* Z% B, p1 d6 R2 h* w- w+ z

# ~+ Q/ w8 n" d6 d3 w  Q# i功能:
8 ~4 ?+ H7 \" K' Z
9 r$ c) G7 M# C) ?( M! L4 v• ADC和DAC开始转换触发% W! B% \! {. B+ R+ O8 I% E* \" o
• 输入捕获:脉冲计数、上升沿或下降沿时间检测、PWM输入检测7 S/ a2 \& u6 d3 s9 n7 {. T7 m# V$ _
• 输出比较:脉冲输出、步进电机控制( j* Y& `, d7 Q8 F" |& D" v: [$ J
• 脉冲宽度调节PWM:电压输出控制、直流减速电机控制、直流无刷电机控制4 ?. ]5 o" ]3 S7 H' Z
• 单脉冲模式输出
0 C8 t; Q8 D* D( L0 X  g' E$ C9 y• 编码器接口、霍尔传感器接口: x+ m* F" x3 ~5 Z/ k8 e

4 v  h0 l2 L  E1 G定时器时钟:来源于APB( E3 x/ Y) p1 A7 N2 U+ D
4 ]0 S3 y' S, X# y3 D1 U
]@4N(`BB@QX0@[MT~76AK1K.png , P$ A. R8 D; T& F9 }/ u6 v( v" i/ u

) l) I4 u( O# B: ]% \$ ~' w当APB1/2分频系数为1时,给定时器的时钟为X1
+ K3 @6 j1 N5 |; g" c当APB1/2分频系数不为1时,给定时器时钟需X2
8 h. m9 l# B8 o" E' m: A9 v) z$ U( r% u2 R$ U7 J
总之给定时器的时钟频率是高频率,若不分频,分频系数为1,给定时器的时钟为X1;若APB1/2进行了分频,就给分频后的时钟x2,提供时钟频率
/ v2 ]( ^& ~3 o+ M) M* @" X( X) [. i. J7 l  v6 A- v
时钟引脚:, \( n; H1 f6 b5 a
6)3LP9I5F7@OGA}@I15XC8G.png
! n: [" D. R) h& y$ i+ a
0 q; c2 u& }* j8 d0 c' R4 \7 ^注意一个定时器有多个输出通道,引脚要与通道相对应/ B" [5 r# s+ S3 X) a9 K/ T

3 `% a& d% j. b定时器计数方式
- q% V- W7 r1 U: K
5 `- i2 P; }" o. C5 Z0 i  X$ ~ N9@A00EA}}4JBR}6R3A_EFS.png 1 }0 j/ y2 `4 X- M6 w" L1 H

% |1 I6 ]5 z; Z& z* P3 _二、基本定时器
5 V9 c4 ]* J8 i- \2 g3 |
基本定时器:TIM6和TIM73 C, y1 q- H5 x; v; x* X: D! z- X
基本定时功能:当累加的时钟脉冲数超过预定值时,能触发中断或者触发DMA请求。是专门用于驱动数模转换器(DAC)2 r7 Z3 w1 j4 q3 ~

6 R) u" M1 k% g! n% S基本定时器功能框图
& l2 ^& d8 k) P, _* L* g3 v
. \+ w! S9 h" w3 i1 A1 `8 M0 k, s! \ 4OX0OHX}UFJOOLKJ%~2]GPR.png " Z+ b. Y! G$ N

  @5 ]0 {8 F0 h3 v/ G" E( z7 G触发控制器:核心功能是控制CK_INT时钟是否可以正常传输到PSC预分频器内* o: X: X" F1 `: |8 |) L1 O2 V# L
" u5 b& |# g. N6 z- ~4 r
基本信号4 M* c1 a4 G: f# e' D$ N
/ X" V3 \- F# f$ L& U  @4 N# J) I
" k: B4 c0 M/ [5 b! V4 h9 h6 D% E
6 n9 M9 ]0 S: D! j1 l& H
定时器时钟 tim_pck,即内部时钟 tim_ker_ck,经 APB1 /2分频器后分频提供,定时器时钟经过 PSC 预分频器之后,即 tim_psc_ck,用来驱动计数器计数。 PSC 是一个16 位的预分频器,可以对定时器时钟进行1~65536 之间的任何一个数进行分频。具体计算方式为: tim_psc_ck=tim_ker_ck/ (PSC+1)9 T" v$ r+ K9 d( ?8 @4 I; q6 P2 j

! U7 x" ^! D% J8 v# R计数器 CNT 是一个 16 位的计数器,只能往上计数,最大计数值为 65535。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数。
" O; |8 N5 G0 D! x
1 Q* a6 p( Q( I+ M1 n自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。
4 _5 e( G7 n& {9 O" g0 @# s" ~- @- q# H- l" @3 A3 u
该寄存器在物理上实际对应着 2 个寄存器。一个是程序员可以直接操作的,另外一个是程序员看不到的叫做影子寄存器,当更新事件发生的时候,重装载寄存器的数值才传递到影子寄存器里。影子寄存器是真正起作用的寄存器。当使用定时器过程中,如果不修改这个寄存器,就不涉及这个问题' O: J. L: n5 m7 Q8 i& h
" ?, U# F2 c2 X0 P3 Z
定时时间的计算:
0 e3 \' u" L9 J! h" @- q9 ]定时器的定时时间等于计数器的中断周期乘以中断的次数。计数器在 tim_ker_ck的驱动下,计一个数的时间则是 tim_ker_ck的倒数,等于: 1/(tim_ker_ck/(PSC+1)),产生一次中断的时间则等于: 1/(tim_ker_ck* ARR)9 Y8 F/ ]4 \0 ]/ F, u% C
, ^6 B' V( f1 a2 S0 d
如果在中断服务程序里面设置一个变量 time,用来 记 录 中 断的 次 数,那 么 就 可 以计 算 出我们 需 要 的 定时 时 间等于 : 1/tim_ker_ck*# u) o5 ]. Z$ _/ K
(ARR+1)*time。4 n  R+ G; z4 v, x" M7 c, g
2 O  s/ c1 N) E8 z, |7 ?
若tim_pck = 80Mhz , TIM6定时1s:分频系数设置为8 000-1 ,tim_psc_ck=80 000 000 / 8 000 = 10000hz,周期=0.1ms,arr寄存器设置为10000-1, 因为从0开始计数的,既定时1s.9 |; [5 l6 C; `& k  S) P/ d
# Y2 V* t2 ~9 Y
计数过程:9 V! e4 m5 Y2 x3 N  W! F
每来一个CK_CNT脉冲,TIMx_CNT值就加1,当TIMx_CNT值与TIMx_ARR的设定值相等时就自动生成更新事件(也可以产生DMA请求、产生中断信号或者触发DAC同步电路),并且TIMx_CNT自动清零,然后重新开始计数,不断重复上述过程。
! A: F8 b% u+ L4 x1 J  ]
% w  G; p+ |; K/ }& _因此我们只要设定TIMx_PSC和TIMx_ARR这两个寄存器的值就可以控制事件生成时间。对应的就是程序中定时器预分频设置(斜率)和定时器期。5 \- U/ `* F6 B7 m! j
2 f- Q2 S+ o* G$ m
小结:
5 r  x$ j8 O3 m7 w" @寄存器组成:
9 J( Y5 {4 c' Q! H+ I" r' N& g5 Y/ C
计数器寄存器(TIMx_CNT)、
* h. S, j' o- n4 o( ~/ ]  N6 n预分频寄存器(TIMx_PSC)、
7 a( F! b2 M, a5 t自动重装载寄存器(TIMx_ARR)。
# V5 m$ ~/ V. @+ f# K. d1 Q三个寄存器都是16位有效数字,可设置的值为0~65535。1 e; n/ d5 L: @# {$ t2 m

* L% q7 [( r8 m) S5 ~4 M9 O三、STM32CubeMX配置
/ ~* a) Y7 d+ C- q设置基本定时器6定时1s8 s8 R% B+ s- {! Y

  M3 c, X# ^+ z* [. b, H  e0 N$ \(1)激活定时器6
9 M% ^6 W8 z( \4 x" {7 \- X4 e4 G+ x# e- U4 m# p7 o. e6 e& o4 ?2 O" M
YDKLEZS2KN8P(4)SI02[8~7.png
! z9 J. k9 F9 R  t) G
/ F0 n0 B# U1 |# u! I(2)配置定时器参数
1 q7 G% t% h. q1 i
/ r& `6 G' K! `# z# r. _ SNG]FU6KBGTW13JA85V71.png - u1 ?9 P% B& n, K

2 E) F$ N! F5 ?. M* g(3)配置NVIC6 e* C: Z* x. q$ w
% A6 W7 u$ }4 ?8 N3 v/ g% \/ K0 T
F4)2{PK~8]BJP3M]SV}8HPO.png
6 U4 y' h4 F. w
2 t, P. i. }& m) E% Z四、编写中断回调函数

% T9 i5 ^, x0 Y; J* z4 Y( Q$ v9 d注意在定时器初始完成后,一定要开启定时器中断和串口中断一样的,
  1. HAL_TIM_Base_Start_IT(&htim6); // 开启中断
复制代码

8 f( b7 V* k1 F% P回调函数模板+ N* ~- W2 J+ _$ Z- j7 y7 {5 H
3 r! m; w: W  x
  1. // 1S更新一次+ ]# N  o* a; L) o
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim): P" ]6 {8 G' Z6 Y0 F3 f
  3. {* w9 S% ?2 r7 O- t/ z/ p  s
  4.         /* 程序编写*/
    9 I+ n0 n7 }# q$ Q
  5.         HAL_TIM_Base_Start_IT(&htim6); // 这里也要写开启中断. G9 D, h9 y! ?  q% W+ Y: H
  6. }
复制代码
  Y+ ^: z! W$ ]0 F
* N, _) Z) Q: U6 n, t! K

; J# f) _& Q. F; q% E* W% T8 f8 w; P
/ \0 g1 M  U: L0 Q; r! r1 d9 c2 }1 m
收藏 评论0 发布时间:2022-7-5 22:02

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版