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

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

[复制链接]
STMCU小助手 发布时间:2022-7-5 22:02
一、定时器介绍
# {. `. v: b! P; \% f% A8 ^STM32G4系列共有10个定时器
& @* Y) g% w" l' D
* P. C# u8 F8 r: s• 2个基本定时器(TIM6和TIM7)。
0 Z4 f( d+ v* w• 3个通用定时器(TIM2~TIM4):全功能通用定时器。
: M4 ~, m8 D) \% L3 k0 w2 |. L• 3个通用定时器(TIM15~TIM17):只有1个或者2个通道。
4 N" w; D' k) Y, ~; O% a! v• 2个高级控制定时器(TIM1和TIM8)。
; z+ O, x# U" }4 n# O
( d- |6 }8 ~2 q, u7 I$ W {]4T~3)27A84`[WT3{NC6(N.png
4 r( {0 W, ~/ z" X6 {/ A
; v( ~, Z4 z8 m9 m: S不同定时器的功能区别:0 B' N9 k" F4 D# z
7 `1 ?2 X: m+ H8 N
基本定时器有的功能通用定时器都有2 j9 D( {) \, t
通用定时器有的功能高级控制定时器都有' b6 `5 D3 a' X3 P9 E

/ W3 w# `+ O% C7 [功能:
8 j' N& t1 \. v+ R8 S9 e) P4 @9 a+ U/ ^( @* `2 Y3 o3 r' N
• ADC和DAC开始转换触发. _. I& ?* u# u* n8 m
• 输入捕获:脉冲计数、上升沿或下降沿时间检测、PWM输入检测. w* L7 `0 x" U5 m+ _) m7 a6 ^: U
• 输出比较:脉冲输出、步进电机控制8 K8 H; F- O, o0 M
• 脉冲宽度调节PWM:电压输出控制、直流减速电机控制、直流无刷电机控制
% j; d9 q8 i4 x• 单脉冲模式输出! s3 ]7 E7 M# {. {$ G2 w6 A
• 编码器接口、霍尔传感器接口4 W* m2 w6 b: q1 v6 m

! w* A3 j5 ?3 v2 O5 \定时器时钟:来源于APB
+ m5 [- P/ X5 _( i1 n$ k( G0 N$ f7 }' N" y$ T& y9 O" q* t6 z( l' V
]@4N(`BB@QX0@[MT~76AK1K.png
1 O( }7 x& a( _% x2 X* o9 t3 t( t4 O; W
当APB1/2分频系数为1时,给定时器的时钟为X1$ d1 |; F6 s2 ]3 p+ c: C1 \4 }
当APB1/2分频系数不为1时,给定时器时钟需X28 J& L; [1 g$ j& J8 d+ [6 H' u

2 m, o; @& V7 ?! L- w7 Y总之给定时器的时钟频率是高频率,若不分频,分频系数为1,给定时器的时钟为X1;若APB1/2进行了分频,就给分频后的时钟x2,提供时钟频率- M" j2 c# U" W3 x
" v5 f- ^$ ^! G% J
时钟引脚:
. N$ Y- Z$ ]3 ? 6)3LP9I5F7@OGA}@I15XC8G.png 9 w  m4 ^3 v* M6 M- @# m

. X+ f9 X, m6 F) w; a* u注意一个定时器有多个输出通道,引脚要与通道相对应
, F$ Y# V% u9 P8 x; C  ?. |. W, W0 P4 o
定时器计数方式4 @; @' [; z/ X* o) ^7 l
  o  g" j1 |1 e" ]$ W; V$ P: ~
N9@A00EA}}4JBR}6R3A_EFS.png
1 W. I" I7 [  |8 L1 z% A% a3 W1 q. \* m2 V4 S: |, n5 C0 v/ `' \2 |: u0 Z
二、基本定时器

1 W8 J: f+ y" i: R; W# Y3 }基本定时器:TIM6和TIM7
' w+ }+ \9 d& A3 f0 E8 Q基本定时功能:当累加的时钟脉冲数超过预定值时,能触发中断或者触发DMA请求。是专门用于驱动数模转换器(DAC)
" ^  B7 B/ \' l6 N
# E% l$ v( z, K# t基本定时器功能框图
. z+ b% x8 \/ P$ W7 w
- j' t6 k7 @4 k* |/ r2 o2 O, b, g 4OX0OHX}UFJOOLKJ%~2]GPR.png
' l0 i8 q: P7 z
1 J7 k! I- w. \* `7 ]触发控制器:核心功能是控制CK_INT时钟是否可以正常传输到PSC预分频器内
; g. J6 `& k3 _% O) ~- z  I4 G$ c2 U# d$ J2 T
基本信号
! p* u% J0 P+ B1 {2 ^/ u$ ?7 C3 {8 O- [

  Q, `- A/ y8 W5 d
1 J8 O% @8 C3 V% d定时器时钟 tim_pck,即内部时钟 tim_ker_ck,经 APB1 /2分频器后分频提供,定时器时钟经过 PSC 预分频器之后,即 tim_psc_ck,用来驱动计数器计数。 PSC 是一个16 位的预分频器,可以对定时器时钟进行1~65536 之间的任何一个数进行分频。具体计算方式为: tim_psc_ck=tim_ker_ck/ (PSC+1)
- v7 @7 S% S/ v  m
1 {% }) u$ X7 f6 e; U% G+ l计数器 CNT 是一个 16 位的计数器,只能往上计数,最大计数值为 65535。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数。# E  g: Z/ s- o: [7 ~  A2 j* E8 ?
, N  ?- R! E/ E: X: t" J4 E. f
自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。
) o8 e0 `8 }# T. X; V& b4 Q* V- @% Z# G
该寄存器在物理上实际对应着 2 个寄存器。一个是程序员可以直接操作的,另外一个是程序员看不到的叫做影子寄存器,当更新事件发生的时候,重装载寄存器的数值才传递到影子寄存器里。影子寄存器是真正起作用的寄存器。当使用定时器过程中,如果不修改这个寄存器,就不涉及这个问题
3 U7 r0 [, H. H+ |  l# M" {/ l
定时时间的计算:
0 h4 E/ `$ q0 ^! q! G定时器的定时时间等于计数器的中断周期乘以中断的次数。计数器在 tim_ker_ck的驱动下,计一个数的时间则是 tim_ker_ck的倒数,等于: 1/(tim_ker_ck/(PSC+1)),产生一次中断的时间则等于: 1/(tim_ker_ck* ARR)0 j% ~$ G2 {5 f6 S& j
; K7 H+ g* N& o3 z9 }' P0 Z
如果在中断服务程序里面设置一个变量 time,用来 记 录 中 断的 次 数,那 么 就 可 以计 算 出我们 需 要 的 定时 时 间等于 : 1/tim_ker_ck*
; n& g+ N# t5 T! ]7 N( ~: P. [9 I7 W(ARR+1)*time。
9 s2 r6 v) f) a5 s5 ^1 c  F. Y7 D' m  _1 m
若tim_pck = 80Mhz , TIM6定时1s:分频系数设置为8 000-1 ,tim_psc_ck=80 000 000 / 8 000 = 10000hz,周期=0.1ms,arr寄存器设置为10000-1, 因为从0开始计数的,既定时1s.7 A" H! _: m& r, V

: s) H4 z3 a. J3 R! b. m: G/ ]5 [4 _计数过程:
  Z' g$ _! u/ u0 X) P2 Q& j每来一个CK_CNT脉冲,TIMx_CNT值就加1,当TIMx_CNT值与TIMx_ARR的设定值相等时就自动生成更新事件(也可以产生DMA请求、产生中断信号或者触发DAC同步电路),并且TIMx_CNT自动清零,然后重新开始计数,不断重复上述过程。
+ ?. q' K) A! ]8 s: O! m  R- V7 ?2 m4 d+ A
因此我们只要设定TIMx_PSC和TIMx_ARR这两个寄存器的值就可以控制事件生成时间。对应的就是程序中定时器预分频设置(斜率)和定时器期。. z3 o9 Y( z2 L4 t" J- U3 L5 S
8 N9 k0 h. P+ ^4 z( x
小结:
$ u5 e! l8 |' G5 M3 H% c& j寄存器组成:: P; p" d6 r# b

6 M: }, `8 B8 V. K( x计数器寄存器(TIMx_CNT)、/ T  S- ]( X  ^' D
预分频寄存器(TIMx_PSC)、
( c8 n# e3 H% [8 T自动重装载寄存器(TIMx_ARR)。1 e9 A8 k  W9 {; o
三个寄存器都是16位有效数字,可设置的值为0~65535。5 y) u9 y8 G' a) |
) a4 b" X$ O& ~9 ^) m
三、STM32CubeMX配置# F: R9 j  [, N; x3 e* U$ C
设置基本定时器6定时1s
! [3 ~( i; z: S" F8 m. V' H  D: R8 {; c+ Q
(1)激活定时器67 L0 ^- R5 a& I

4 j: i6 ]8 l3 V0 b/ X8 d4 M YDKLEZS2KN8P(4)SI02[8~7.png
- p) _( U4 X+ G; F- Q8 m2 q2 b3 ^) n3 B9 [) G- I
(2)配置定时器参数' x5 N2 v  p: f* f8 R, o

2 ?) U4 @+ w' t) R$ ~ SNG]FU6KBGTW13JA85V71.png
, a5 m0 t7 X* e4 s$ A) e9 {$ Q2 u* C5 W
(3)配置NVIC: Z. ?; C+ x6 A

; J' a% O9 o( }! i, m& h- J" P F4)2{PK~8]BJP3M]SV}8HPO.png 5 S9 b( B% V4 D+ l
6 ^) O4 K0 F( l( K+ g  Q" |  `
四、编写中断回调函数
7 I) J# Y0 w8 o, ]- S$ V, g: q+ C
注意在定时器初始完成后,一定要开启定时器中断和串口中断一样的,
  1. HAL_TIM_Base_Start_IT(&htim6); // 开启中断
复制代码

! c$ o; ]& \* d5 |5 d1 @# t回调函数模板! g1 a7 X/ }6 W7 y, X0 ~) ~4 i
1 }  S( d$ S/ n& b8 K1 o# h1 M% l; m. }
  1. // 1S更新一次
    2 E5 j0 I  T6 M9 j$ K
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)0 s7 ^% G* R, k3 s! k1 H
  3. {% H& W% ]% U3 R; C6 N
  4.         /* 程序编写*// m, L7 P9 q  ^- v. p9 [" X
  5.         HAL_TIM_Base_Start_IT(&htim6); // 这里也要写开启中断$ b' D- I  f* m( ?& c# l, X
  6. }
复制代码
" O" t+ b' Q3 S/ B) l' S: l7 U

4 A6 N0 W/ u: [) S* Q; d$ ^% O3 q& H$ L' b; p! m: S1 W
$ o2 E8 c+ f6 x0 o$ @

( J6 x2 Q6 }* p7 o
收藏 评论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 手机版