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

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

[复制链接]
STMCU小助手 发布时间:2022-7-5 22:02
一、定时器介绍
4 i) J+ {2 T: J8 R6 k8 f, l1 S$ M8 LSTM32G4系列共有10个定时器
: X2 u  {: e$ n, a6 X0 H0 e3 l2 R) J. J! e+ M
• 2个基本定时器(TIM6和TIM7)。. P/ I2 o/ l5 X! G+ s
• 3个通用定时器(TIM2~TIM4):全功能通用定时器。
* r3 h! D9 w& x• 3个通用定时器(TIM15~TIM17):只有1个或者2个通道。
1 r( g+ ~  M. ~• 2个高级控制定时器(TIM1和TIM8)。
6 J7 I7 c" K2 |. q
* U& c; S( x- z  R2 m; N, j3 w {]4T~3)27A84`[WT3{NC6(N.png 8 g# |5 F3 l9 f

9 P4 P) p2 ?5 {* \9 I不同定时器的功能区别:
. p  c1 x, Q5 q9 p; Q- h% ~
/ R/ G9 c8 r( E+ l" {基本定时器有的功能通用定时器都有
. r1 u& U% H2 d2 C通用定时器有的功能高级控制定时器都有
2 D. A( y2 O/ ]7 r0 e
, S7 h8 Q  B. b6 }& C" V" K功能:
$ O" |/ C; b% f4 F7 S2 C+ z* B! F$ \4 M- o) R! a
• ADC和DAC开始转换触发. |; P. [# ]' h( p0 ]; h9 p7 C
• 输入捕获:脉冲计数、上升沿或下降沿时间检测、PWM输入检测# z1 _( x7 u. f# A0 o
• 输出比较:脉冲输出、步进电机控制
. D' I8 P) Z/ E3 J2 w• 脉冲宽度调节PWM:电压输出控制、直流减速电机控制、直流无刷电机控制7 I: F6 F/ g( o4 B' n" L% h
• 单脉冲模式输出
! i# D" p* V' o! t; Z; x6 t3 V• 编码器接口、霍尔传感器接口
" h+ |7 u: E; L% \4 D% `8 f; U
定时器时钟:来源于APB- S6 y' W/ Y% g$ C9 H& a
3 Q5 K% {' B' I
]@4N(`BB@QX0@[MT~76AK1K.png % g8 \4 n8 ]! R9 V( K# l6 e  g
1 Q3 x& ~1 F! A7 w  V; W1 ~; r
当APB1/2分频系数为1时,给定时器的时钟为X1* N! j# H7 U$ M0 |6 Z9 [+ s$ Q# j/ Y
当APB1/2分频系数不为1时,给定时器时钟需X27 l1 V6 `- P' E
5 ~$ L  D. S8 [2 K) Z2 O* S
总之给定时器的时钟频率是高频率,若不分频,分频系数为1,给定时器的时钟为X1;若APB1/2进行了分频,就给分频后的时钟x2,提供时钟频率$ `+ l& K' H2 ~. v( u! `

1 S6 t+ G' j( ?, l& p0 [$ v7 L; R* u时钟引脚:
5 T# }, E% u# q7 y# ~ 6)3LP9I5F7@OGA}@I15XC8G.png
4 g+ M2 e) `. A9 c+ Z4 ~! P0 `) Q8 j5 A$ A
注意一个定时器有多个输出通道,引脚要与通道相对应
, u* Q1 m' G/ o0 ^6 D* c2 b3 f, v, a0 C3 `& s& s
定时器计数方式8 H4 q9 B. P9 U. ?- D
. I$ U- m3 {  Z& r
N9@A00EA}}4JBR}6R3A_EFS.png
! }' g' o4 t5 K) o' `, V3 ^
) S% S8 Z" @3 p0 [$ g: C1 q# f2 ~二、基本定时器
9 h  t. B( i, [6 {
基本定时器:TIM6和TIM7
- }& S+ b* e: s! d# R' }. ^3 v基本定时功能:当累加的时钟脉冲数超过预定值时,能触发中断或者触发DMA请求。是专门用于驱动数模转换器(DAC)
8 Z2 w1 O& ?3 L7 v2 e9 F8 e" J% i( s' \( `# E9 ~
基本定时器功能框图
! ?& q: d  K" X; g, U/ X
/ h) x- |8 |* \, ^* o3 f; V 4OX0OHX}UFJOOLKJ%~2]GPR.png
# N" c, i3 j% a0 S; A$ a: z( K) `, w# m/ r* m, `% {9 q3 T
触发控制器:核心功能是控制CK_INT时钟是否可以正常传输到PSC预分频器内: Q8 M* L5 a7 N  N1 S% x. K5 Y

& v6 ]5 b6 L! A, f$ v基本信号
" @6 w+ S8 j9 P7 s# B3 a3 V6 B$ S+ W% w" x6 _* {4 c' b* A

+ R! h( I- ~2 I9 Z$ p) k+ b
5 ?6 F: p- m0 w. W定时器时钟 tim_pck,即内部时钟 tim_ker_ck,经 APB1 /2分频器后分频提供,定时器时钟经过 PSC 预分频器之后,即 tim_psc_ck,用来驱动计数器计数。 PSC 是一个16 位的预分频器,可以对定时器时钟进行1~65536 之间的任何一个数进行分频。具体计算方式为: tim_psc_ck=tim_ker_ck/ (PSC+1)  b9 b1 @# l# ]1 V" ~
. p9 c' {! x9 k: A! Y/ L) u% F
计数器 CNT 是一个 16 位的计数器,只能往上计数,最大计数值为 65535。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数。) Q" M& f5 L% {  r; k  ?

6 @. J# ?. y( ?) x: c自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。6 C0 r' Q& ?& \+ q4 L
" s4 X# r" O+ W$ _
该寄存器在物理上实际对应着 2 个寄存器。一个是程序员可以直接操作的,另外一个是程序员看不到的叫做影子寄存器,当更新事件发生的时候,重装载寄存器的数值才传递到影子寄存器里。影子寄存器是真正起作用的寄存器。当使用定时器过程中,如果不修改这个寄存器,就不涉及这个问题' G& L' ~, M) B; u% Q! o9 K* q3 [% b

$ d4 L0 Y8 c7 Z+ j定时时间的计算:) u, p& B7 p- T) h+ T
定时器的定时时间等于计数器的中断周期乘以中断的次数。计数器在 tim_ker_ck的驱动下,计一个数的时间则是 tim_ker_ck的倒数,等于: 1/(tim_ker_ck/(PSC+1)),产生一次中断的时间则等于: 1/(tim_ker_ck* ARR)1 o. n" _2 p( k/ K. b* x% P
" j. A3 ~0 t" p& g2 }5 z& v/ e; O
如果在中断服务程序里面设置一个变量 time,用来 记 录 中 断的 次 数,那 么 就 可 以计 算 出我们 需 要 的 定时 时 间等于 : 1/tim_ker_ck*5 G$ U9 S8 p+ {3 S" r. f$ F" d
(ARR+1)*time。
( l0 R& W1 H) y$ p4 i/ R8 n3 {$ Y" @# c
若tim_pck = 80Mhz , TIM6定时1s:分频系数设置为8 000-1 ,tim_psc_ck=80 000 000 / 8 000 = 10000hz,周期=0.1ms,arr寄存器设置为10000-1, 因为从0开始计数的,既定时1s.
& Y2 t, A2 r& u1 t% C4 Z) F& D' Y7 u3 R& S2 \" n; J: r
计数过程:
8 K* A* O2 x& [; C每来一个CK_CNT脉冲,TIMx_CNT值就加1,当TIMx_CNT值与TIMx_ARR的设定值相等时就自动生成更新事件(也可以产生DMA请求、产生中断信号或者触发DAC同步电路),并且TIMx_CNT自动清零,然后重新开始计数,不断重复上述过程。! B! ^2 f* @: E7 E9 _% y6 E

# B5 A4 x/ P' ?( f5 a因此我们只要设定TIMx_PSC和TIMx_ARR这两个寄存器的值就可以控制事件生成时间。对应的就是程序中定时器预分频设置(斜率)和定时器期。
% X$ _  p# o& Q! T! |/ Z+ N! C' \/ T% f; b
小结:
5 ^, J5 X: {" b3 _  G& r, K寄存器组成:& H7 Z' s, S" F$ m/ F) g7 o

; z$ K0 i' r* U4 o+ Z7 k& K( Q+ x8 v计数器寄存器(TIMx_CNT)、0 c; @' m1 i3 v* X
预分频寄存器(TIMx_PSC)、* E5 u3 n6 ]! @5 N0 K
自动重装载寄存器(TIMx_ARR)。0 x& @. i3 }# _( m% g
三个寄存器都是16位有效数字,可设置的值为0~65535。. q4 q# a- f. ~2 Q$ t: j
+ o- G# l9 w4 B+ j# _$ T
三、STM32CubeMX配置( i. F6 Z+ j! D# |8 K
设置基本定时器6定时1s; G- V6 h" B0 \3 H
0 D4 F8 C1 c" |% {; r: W* R
(1)激活定时器6
- P$ I, w6 ~/ k1 d1 I2 k9 d- C
+ K# ~1 w- K* C3 W YDKLEZS2KN8P(4)SI02[8~7.png
- W( @4 ~- _" ]. `! C' C* c- O/ c" L4 z0 ^1 K
(2)配置定时器参数
  \, C6 R1 Z. N- k2 F# L
5 K( C4 X/ c% Y% Y$ W+ d9 U SNG]FU6KBGTW13JA85V71.png 4 c7 v* c5 y; z$ j
* q- F2 F! ~# |; w) E# p
(3)配置NVIC
8 e) h5 l' y* z0 F( p7 `4 w+ O7 V% I$ ~
F4)2{PK~8]BJP3M]SV}8HPO.png
) {) l) I0 L0 M2 I7 Z* d  X4 {" R7 m9 C) W* M. k
四、编写中断回调函数

) m  B3 X3 \8 L' J* s- K* j注意在定时器初始完成后,一定要开启定时器中断和串口中断一样的,
  1. HAL_TIM_Base_Start_IT(&htim6); // 开启中断
复制代码

! @  |. T* d/ n- K/ t3 m回调函数模板
' E* j! D7 r$ G7 R# p( O+ A0 n- s& D8 ?# I; E" B
  1. // 1S更新一次
    - t7 o' I( S7 P$ l% o# B/ b
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)( x; w# `2 w% K8 N& ^6 B( e2 Z0 ?9 ^
  3. {7 l9 r# ?" K- B0 I; ^$ y# d
  4.         /* 程序编写*/. A+ v$ v7 l6 K+ Z! ~" u
  5.         HAL_TIM_Base_Start_IT(&htim6); // 这里也要写开启中断( z/ s* k0 S) J# Y% P! V9 O/ v& C
  6. }
复制代码

8 `9 I2 W3 m# ]+ j/ E4 `' |
1 ^8 N( j: F* ]" O- ]" k* J) N& o8 u" u. `5 w' k. [

' z9 q2 M% u' r9 d2 O8 F7 @* C7 F! y. A4 D! c; R
赞 收藏 评论1 发布时间:2022-7-5 22:02

举报

1个回答
lvgl 回答时间:2026-6-4 13:50:07

请教一下,TIM6在stm3cuemx配置界面中这个dithering是什么意思

PixPin_2026-06-04_13-51-15.png

所属标签

相似技术帖

官网相关资源

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