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

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

[复制链接]
STMCU小助手 发布时间:2022-7-5 22:02
一、定时器介绍
/ z6 ~5 H+ E  sSTM32G4系列共有10个定时器
% d7 g* @" ^( D9 H8 W9 {! w% [2 z0 E) k" _! C( K
• 2个基本定时器(TIM6和TIM7)。
( ~4 N3 X+ H; K) x. b+ C+ D/ p• 3个通用定时器(TIM2~TIM4):全功能通用定时器。
$ m8 F$ u$ X% W" Z& o2 \6 F• 3个通用定时器(TIM15~TIM17):只有1个或者2个通道。
  E: h3 E% `$ l3 |7 M! ~• 2个高级控制定时器(TIM1和TIM8)。
5 h3 R0 e3 ?0 A% H/ v) k, \' Q/ X- }0 B
{]4T~3)27A84`[WT3{NC6(N.png
2 c" w2 ~" I; ^7 ]; a& M9 G  W) S
不同定时器的功能区别:
8 k. Q4 e, T$ _9 z; ^$ v  \
# Y1 g: L9 ^+ ?, {5 C基本定时器有的功能通用定时器都有
" b/ s3 i9 N* f通用定时器有的功能高级控制定时器都有& m! m6 r; r0 |
5 }7 K9 ]* P6 v* Y  a7 i
功能:, q/ F  s! l3 n, m2 w; C' Q- C

# z* N& H( l# L3 r8 f. L• ADC和DAC开始转换触发0 {$ f# p' |$ p; f# n
• 输入捕获:脉冲计数、上升沿或下降沿时间检测、PWM输入检测2 i% @: }) \) m' H
• 输出比较:脉冲输出、步进电机控制' c- P  Q* {. A% i+ y
• 脉冲宽度调节PWM:电压输出控制、直流减速电机控制、直流无刷电机控制( ?: U, Z. d: ~2 I3 l& ^- k
• 单脉冲模式输出" }' P6 U% N; p$ y' [
• 编码器接口、霍尔传感器接口- \4 g, ^7 @* ~" [8 U, ?2 o- G; E8 |

7 J5 N4 O# f5 f: |- b! Y5 M. X定时器时钟:来源于APB7 V& J# z6 B. E, F, F: h6 I) T# Y- }3 e: A% M

6 u* q! g- z) L& C0 ?/ l$ P ]@4N(`BB@QX0@[MT~76AK1K.png
% C5 @8 L5 d: I8 j( B' E
5 @+ S7 }/ o( F1 O  Y0 J' b) ]" A0 H当APB1/2分频系数为1时,给定时器的时钟为X16 [( ?% _: `9 }; M1 c: \" X
当APB1/2分频系数不为1时,给定时器时钟需X2
9 C1 o' t: Y" L9 ^# P5 c) c, K+ X8 G+ |' b" P, I9 B# s
总之给定时器的时钟频率是高频率,若不分频,分频系数为1,给定时器的时钟为X1;若APB1/2进行了分频,就给分频后的时钟x2,提供时钟频率
8 V' B$ {+ P* J0 `
. `( U8 r$ b+ F+ e3 g; R6 J+ y时钟引脚:
: f! U, U2 A) ]. m9 g# ]/ I 6)3LP9I5F7@OGA}@I15XC8G.png 9 S: o* _/ y' _$ u# e

! `* d' O! Q/ a注意一个定时器有多个输出通道,引脚要与通道相对应: l/ p& G, g9 o% h1 D

0 x/ D9 ]* ]' d$ r( Y+ d$ Y定时器计数方式: A% L# W: ]* q' r1 j3 t/ E

. Z( ?% H  j$ @' J6 p! O N9@A00EA}}4JBR}6R3A_EFS.png 5 J$ I+ x; [" l* P
6 A2 D+ z4 K7 W/ j
二、基本定时器

" N0 y" o1 {- H; V7 ?. E  x基本定时器:TIM6和TIM7
% m" M  B/ u$ {: F7 e, r  ?( P' I基本定时功能:当累加的时钟脉冲数超过预定值时,能触发中断或者触发DMA请求。是专门用于驱动数模转换器(DAC)
" x, Z; G1 Y/ g% M- t0 |3 I; H  F  u5 I
基本定时器功能框图
5 m, v: r) j5 Q" F0 q' I' F# \' s
0 B& g" L, m: J+ ` 4OX0OHX}UFJOOLKJ%~2]GPR.png
5 ~; I. n" R1 y' y
# V: r3 z3 J3 w% ^* z+ }1 E触发控制器:核心功能是控制CK_INT时钟是否可以正常传输到PSC预分频器内  k+ r" E9 f' N: h: b( {
2 m8 T4 e& ^+ z) {
基本信号
$ P  G+ C# L/ G: z
) }; H9 V' p4 o" L
9 l. J6 p1 A9 s6 p0 e6 A& {- ]# z4 Q8 P) B9 t* k" i) I! O
定时器时钟 tim_pck,即内部时钟 tim_ker_ck,经 APB1 /2分频器后分频提供,定时器时钟经过 PSC 预分频器之后,即 tim_psc_ck,用来驱动计数器计数。 PSC 是一个16 位的预分频器,可以对定时器时钟进行1~65536 之间的任何一个数进行分频。具体计算方式为: tim_psc_ck=tim_ker_ck/ (PSC+1)
1 [) T' q6 d  h8 a. F5 \% Y/ @2 [( \( U" h  _+ j
计数器 CNT 是一个 16 位的计数器,只能往上计数,最大计数值为 65535。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数。
! Y: W5 s" W# [* c
' O) q8 {: f+ _4 X& {自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。' e- V0 j8 Z, ~1 i
0 F$ Z( s) ~+ W) p1 {
该寄存器在物理上实际对应着 2 个寄存器。一个是程序员可以直接操作的,另外一个是程序员看不到的叫做影子寄存器,当更新事件发生的时候,重装载寄存器的数值才传递到影子寄存器里。影子寄存器是真正起作用的寄存器。当使用定时器过程中,如果不修改这个寄存器,就不涉及这个问题% \5 j) F; P6 [% e. k3 f1 Z
- V8 [$ F# ~1 ?7 _3 [: @
定时时间的计算:1 [- B8 r) q& [, J5 f, B
定时器的定时时间等于计数器的中断周期乘以中断的次数。计数器在 tim_ker_ck的驱动下,计一个数的时间则是 tim_ker_ck的倒数,等于: 1/(tim_ker_ck/(PSC+1)),产生一次中断的时间则等于: 1/(tim_ker_ck* ARR)
2 J3 C  Q% a# H& v( j; P) Z% _5 ^) N9 t# s- V
如果在中断服务程序里面设置一个变量 time,用来 记 录 中 断的 次 数,那 么 就 可 以计 算 出我们 需 要 的 定时 时 间等于 : 1/tim_ker_ck*6 f. s- m6 _7 Z" d4 B6 m
(ARR+1)*time。) T8 I& t, }4 {  ?+ |. F

( f& _& q* g9 W$ @. B" ^: a若tim_pck = 80Mhz , TIM6定时1s:分频系数设置为8 000-1 ,tim_psc_ck=80 000 000 / 8 000 = 10000hz,周期=0.1ms,arr寄存器设置为10000-1, 因为从0开始计数的,既定时1s.
5 \# F3 y, u3 g. Z7 P( w
: A* H+ a0 V8 f' m计数过程:% N3 Z$ z  E( L$ g$ J8 {- x- Y
每来一个CK_CNT脉冲,TIMx_CNT值就加1,当TIMx_CNT值与TIMx_ARR的设定值相等时就自动生成更新事件(也可以产生DMA请求、产生中断信号或者触发DAC同步电路),并且TIMx_CNT自动清零,然后重新开始计数,不断重复上述过程。( n0 d( k( \2 a9 L* T' J( O: z
0 N8 W3 g& U4 ?! S9 {
因此我们只要设定TIMx_PSC和TIMx_ARR这两个寄存器的值就可以控制事件生成时间。对应的就是程序中定时器预分频设置(斜率)和定时器期。
. z3 L6 A7 B3 ]$ S7 c9 O- q/ D5 l; t1 G8 D
小结:
2 P. S9 Q, f, w, n% f; N寄存器组成:- z# o5 M& Y' Q0 K

& m3 W( E# o# g3 n% m5 M计数器寄存器(TIMx_CNT)、
4 U! x2 I2 f0 S( ^预分频寄存器(TIMx_PSC)、
% A0 Q" `% Z: u4 g0 ]自动重装载寄存器(TIMx_ARR)。) p$ I3 o& B& f" {
三个寄存器都是16位有效数字,可设置的值为0~65535。
  y$ U+ h1 i5 \! p2 o- c9 _0 B4 {% S4 ~$ l/ j* X$ J
三、STM32CubeMX配置2 E5 N0 p* v; K9 `5 _# M2 H
设置基本定时器6定时1s' ]! N" n* ~/ N% U: n3 d* o# F4 ~' y
4 O  Q! B' p5 x2 h+ M4 k
(1)激活定时器6
) ]2 O7 W! g- E; Z6 \
: r: ]. i8 `( E3 W YDKLEZS2KN8P(4)SI02[8~7.png 9 |+ y- }# `  u

2 h+ `( w: Y$ M* |5 |. ]6 [( u" |(2)配置定时器参数
- m9 t3 _3 ]& F2 W. c+ g( z. `
5 i) f6 m0 E% H: o  s" F, Q! U SNG]FU6KBGTW13JA85V71.png 8 F( s9 `  g! Q! I$ K2 E+ ~) l
" `, ^  e, f' t5 P. k7 W% D1 k
(3)配置NVIC
& u4 l' \5 u" A# i' z9 R6 v  R  R8 U3 O8 V
F4)2{PK~8]BJP3M]SV}8HPO.png 4 x2 {: n3 K# f3 h  J1 u6 t  ^

8 k. i' L/ x. Q- ]9 Z/ O. u6 I四、编写中断回调函数
/ ^' Q+ x- i" G5 {2 I
注意在定时器初始完成后,一定要开启定时器中断和串口中断一样的,
  1. HAL_TIM_Base_Start_IT(&htim6); // 开启中断
复制代码

8 B, S8 D$ u8 z: ~+ h回调函数模板
) Z$ @+ ^  I4 E6 k& |6 y& [0 s8 U( i. |0 `
  1. // 1S更新一次4 D. D, h' r) I  {  C
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)& a6 X& _) y6 v. X7 c0 \3 q
  3. {
    . f. n6 _3 z- Q( q
  4.         /* 程序编写*/+ Z% j; V5 L7 V& R/ C! ?5 i$ m
  5.         HAL_TIM_Base_Start_IT(&htim6); // 这里也要写开启中断. M0 d( _8 f9 m* j0 y
  6. }
复制代码

( ~/ _* U/ e. C# a8 G  H5 F
* J6 [. E' E! `* T! z; R4 Y; a1 a
, t! c; j6 j, g. Z/ m
6 ^9 n0 b' x) ?7 z. r3 K* B; p& X5 r+ ^! w7 H" m
收藏 评论0 发布时间:2022-7-5 22:02

举报

0个回答

所属标签

相似分享

官网相关资源

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