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

基于stm32定时器定时中断经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-1 16:00
主频72MHz:最大计时59.65s6 {' G4 a3 w/ |! J, F8 k* ]2 n
  f  U% i2 |2 M
b6241eaf4d78470d80fd0e3798321cc3.png % c, r2 q. V; }( f6 O$ q+ `

' Q& }0 E: i* K  ~* `
3 A0 |) _* W0 a/ g: P
基本定时器:
3 l# Q2 P1 m/ N( T  [8 O! ]# C$ V! R. N, `8 {3 a% q
基准时钟 预分频器 计数器 计数器与自动重装载寄存器进行比较 相等时计时时间到 进行中断相应
! N8 k5 a* G  R5 b9 d
2 t9 h7 j- t$ l9 }  y
主模式触发DAC 硬件自动化
: d% u( `: a& e' b$ ?# J$ n$ p
. ^! o/ d; M3 j( k通用定时器:
! g, }4 h- w& j" `
' t5 r. q9 U* w6 Q( ?
c07844004e234b34ac06fa0e8c9745a7.png ! u: v* @8 c$ |

, a4 b% H8 Y  u3 R' F
计数模式不只一种:9 [/ R8 w' n; X, g: v) v1 ]6 {
向上计数:计数器累加到自动重装载模式的值后进行中断相应
# ~+ `& A& y# D2 v0 V: p向下计数:自动重装载模式中的值向下减到0后进入中断! O( }" ^/ b9 c! F6 M2 s# h0 L$ a
中央对齐: 向上计数到自动重装载值中断产生向下自减到0后进行中断的产生
) Z# t* Q* K  i+ `; R1 c2 f' L
1cd051f0c9514f1eac39f944da83b767.png
& x9 q8 ^, S6 \- [6 L5 U8 d+ {: w( h
  Q! w8 t* Y/ b
定时器级联:初始化TIM3(使用主模式)把更新事件映射到TRGO上 选择TIM2 对应的就是TIM3的TRGO   选择外部时钟1/ O1 z' T' N2 A  ^( E

7 q; V/ q% j1 S. I 定时器的使用: ETR引脚,CH1、2、3、4 边沿  其他定时器  |. z. w5 s& K8 Z8 _/ I6 b! c
9 K2 y$ r" T3 B
输出控制可以产生PWM波形 ,左边的输入捕获可以捕获输入的频率
2 w% H7 R& t0 P0 g- c6 Q) r" k/ r4 H( ]+ }/ z, c4 f' Y
2ef24777045a49b0822575d52a29f220.png # K  x- D6 i/ b: v: i

1 ?& R( d* `# N" D
初始化定时器* i" {7 \& M7 i* }
开启定时器的时钟线RCC, 选择时钟(内部时钟可以不调用),定义时基单元,配置时基单元(定义时基单元结构体,)初始化时基结构体,更新中断到NVIC,配置NVIC 的分组  ,定义NVIC结构体 , 配置NVIC结构体 , 初始化NVIC结构体,启动定时器  i8 O3 r/ y; U9 Q& o
定时器中断函数:判断标志位,清除标志位' [% r* Y4 y) W0 B
+ ?5 ], _8 |. F4 a0 Z' Q
NVIC结构体:中断通道,使能  抢占优先,相应优先级
. k, d# a) m0 ?* {+ m* s! f: Y  u! s
3 z7 k1 E/ V7 z) l& X
时基单元结构体;: 指定时钟分频,计数模式,时钟周期,预分频,高级定时器配置给0* V" f: k- h' x) s) Q# R
) K+ a+ M0 y& p5 D; D
预分频是将前面的整数弄掉,时钟周期是自己想设置的定时长度 可以这么理解 时钟周期+上预分频一共有6个0  以定时一秒为例:
# K% B+ w8 H& C4 T
9 J6 y0 y2 c) W6 f( \( B
预分频:  7200-1  时钟周期: 10000    定时的长度=72000000/ 预分频 /  时钟周期
% W6 M- L/ k' h) m# D0 g* }! }' D; ~2 Q6 \
找到TIM的定时器库函数:5 H# q; T& B6 o$ O5 M, q

3 `, x3 n& @7 _* B. _% F8 _0 ~
3a5f28024d5c4b2290dc5cb28720d4f6.png
7 y8 {% _( V! R( x  y; F0 w8 o
. t& X& }8 t5 ]4 l; W' x3 l

5 L; b9 G" U' w4 V第一个:清空配置& q. Z) o9 R" L  `( p
0 [2 m0 }4 B, A$ X7 H
第二个:时机单元初始化
! B% U/ P- j4 c: C, |' y/ ~
& f* G  I, M& Z: Q3 z  g9 n
Timebasestruct  附一个默认值% T$ p9 g, y( ]. ~3 z- ?

6 F; [* A# p+ I5 F; x7 y* UTIM_cmd  使能定时器% O$ [- [" E3 L$ k" T! ~6 d

* @/ g9 A& h0 R. f
f68281e4d512408f8347cda171414d30.png
1 I, r# D! z; d' ^! {

) _. r2 I6 H0 q( W TIM——ITconfig  使能中断
- h; z0 h% u1 p+ c) v, J
1 S7 L8 |* r' U7 e& V. t5 K: Y2 N
77458f799cbc4bafa5c17582b98b0af1.png * ?: e. \. G1 L8 Y7 i  D- l( H8 s
! L# |, B8 Z6 |+ c( J
选择时钟
# `) L) P0 X9 n; I$ S' d2 A9 y2 f# f2 V
  具体步骤:
1 ]$ u2 G  F0 }2 z- n9 W  Y0 {. t, g+ P. w# |) G
d6a42cf6bf754376a46501b9fda8dff8.png
, s+ q" ^9 Y. e. Z

# A+ b8 P& ?. i8 X8 X9 `- W5 B: O这里的分频和自动重装值需要理解一下
  k; t% s; v7 B. q7 a2 I! U: O
* O  L" ?% `- l4 |
c296f3fb1810406f999f06e9dec26e60.png
8 G6 h$ {1 k$ N( @5 z2 C. m7 ?

3 j( [, x2 g0 d4 d 72M/分频/计数个数:; ~1 {9 c0 K, k8 [! R( O

& R% H  {: b; e72M分频7200为10kHZ 然后计数10000,得到的时间就是为1s
' B. A, V: ]) \0 d9 C. q' g! f2 l3 `/ l
76c656a4d2914480b2d264f022905074.png
  T) K( a* }1 L7 G1 q5 ~5 e
2 ^6 F* X8 X- ]. f5 S6 X/ L 打开定时器时清除中断的标志位1 x# Y! t5 Z. x& K
  Y7 U0 F% M0 a2 k
37bea5bb89a64a1b8d17ed82cb47f444.png ; ^8 k) \2 n' M1 r

$ M0 C4 n  q% a 判断中断标志位然后进行相关的操作
6 y( [* \; p) \1 ]' g
, G  C, R# {1 a+ [$ t5 n外部定时中断: 通过外设的变化让定时器的计数值进行加减,然后进入中断
* m- X% l) H3 X2 o/ q* U8 w& w
( m0 j& x% B. G# f使用的外部时钟,需要用到GPIO
5 Y" l) H0 K: Z# P6 p
+ G9 C' @; f; [4 @( ?( N配置外部时钟; 配置外部触发的时钟. {0 E9 [9 \& I! U  k) `: T
: f" ?0 W" w. |* Z+ W
bbb7d542ae65412ebd9cbc88229e51cd.png 1 A7 {* V% y& ?' O7 k! f) K
* @/ \. h* }1 L/ E4 u" d/ U: `
复用的是PA-0口+ V! ^7 ?! A# r* S1 J4 {: H
; T( ?: u. o& |
2be0a931addb43299f21f80c46205425.png - S8 T8 Z8 F5 N" Q& E; M

9 y5 L* C! g$ M) J% _( n$ K
48f0205c6243422cafaaa3c9e2616264.png
8 U- F) r$ [2 X. M3 C) j+ v( H8 @  Z% ]2 \! L
外部重装值:外部产生一个信号号重装值+1,当加到9时进入中断,
5 t  l* x3 E4 e& O- i% g
1 ]2 F' j& d) L' x1 D- r4 b% Y预分频:外部产生多个信号重装值+1;没有预分频,外部产生一次中断重装值+1" u5 ~' n. U- C* q; A2 P* |
; {$ z0 E8 O6 h5 H
定时器中断代码总结:
2 i" R0 O% H* W9 l! H' R, K
2 [% E+ ?( N; }3 S打开定时器的相关时钟,选择定时器的时基单元,配置时基单元结构体,
( n+ j# q. N6 y: @2 l3 M. _+ }5 T% j! ^- t1 s# {1 @' Y4 _  \+ F: ^
打开中断定时通道进入NVIC6 h: `; v# I2 ]( s' J/ X

, H: {( V8 U8 T; V配置NVIC中断优先级,打开计数器
) B! X' _* B1 k' h/ s

! f* J2 e0 X( i7 Y外部中断时钟触发定时器,需要用到相关的GPIO口来进行定时器的触发
% {3 Z% P# i8 e- l. ~; W6 ]* w. L+ M4 M* v
不用预分频 就直接用周期来进行判断进入中断' `& X+ `5 u7 z
————————————————
- O+ u  R  r% R, ^& M6 t版权声明:小聪不想秃头
. J4 y+ i9 p, w* |$ _& S7 W( r9 |# p如有侵权请联系删除  @/ [6 X* N1 D5 _5 C" V

; k- Q3 S+ t( }2 {! c, ~4 M3 b) Z3 n8 L. a; N) X4 F9 ?- u% R/ t
- ]) F. ~4 X" F
收藏 评论0 发布时间:2023-5-1 16:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版