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

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

[复制链接]
攻城狮Melo 发布时间:2023-5-1 16:00
主频72MHz:最大计时59.65s! r' i- G: w* E8 b( m: `
3 y3 ?7 \7 j0 ?/ }$ o
b6241eaf4d78470d80fd0e3798321cc3.png
% l1 t+ a$ T8 s. |" N9 Y2 u6 y" _1 P, B1 |0 |) c: E8 z- Y/ ]
9 o' }5 U4 W0 I
基本定时器:
* |1 Z; ^$ l- ^7 O& p
* @% W! c8 X9 a, j. w1 z+ z基准时钟 预分频器 计数器 计数器与自动重装载寄存器进行比较 相等时计时时间到 进行中断相应! b1 `, s$ E! R7 P
  O- D6 Q0 p- w3 c" r( _8 E* Z( ^
主模式触发DAC 硬件自动化$ `7 \$ S1 W' t9 U& B

, b9 l1 L3 E) R3 j- L' c! ]* J通用定时器:& f7 ?# s2 }! Z/ e6 P: V# G( W
3 f2 m, j( W% l# }: ^3 {
c07844004e234b34ac06fa0e8c9745a7.png & d: t8 W8 W" ^8 v8 w8 V6 X, e

2 q: r5 _. g6 N3 S. Z
计数模式不只一种:. U  t) |7 x7 U* t
向上计数:计数器累加到自动重装载模式的值后进行中断相应
0 _8 ]; S6 p3 e/ y4 ^向下计数:自动重装载模式中的值向下减到0后进入中断/ |1 J. e! x- S& D& i
中央对齐: 向上计数到自动重装载值中断产生向下自减到0后进行中断的产生6 h+ s1 k+ n* x

6 z6 w4 K3 U- j0 H
1cd051f0c9514f1eac39f944da83b767.png
$ ]& l# u" u2 t  }& _2 N' ?. e
! K( r* C, W  K; }* v
定时器级联:初始化TIM3(使用主模式)把更新事件映射到TRGO上 选择TIM2 对应的就是TIM3的TRGO   选择外部时钟1
6 |/ O# I8 J* ^1 A, H$ G' T9 C
: {6 V# H9 u  c! w- u
定时器的使用: ETR引脚,CH1、2、3、4 边沿  其他定时器
$ B- S, M' A5 @6 `6 L4 \& J
/ B, H0 m. G1 t) ?- h: Q9 O
输出控制可以产生PWM波形 ,左边的输入捕获可以捕获输入的频率
1 y3 ~( N6 K/ I: N' I% p  d
, S$ n/ R; c" N" C. t- _" j
2ef24777045a49b0822575d52a29f220.png 5 w$ ]/ b( U4 O$ i& i5 @/ ^( ?4 g* b2 T

0 o- ^/ ]/ n" J! e  o% ^
初始化定时器
9 Q" ?: _! |/ w6 \* M" b/ ]开启定时器的时钟线RCC, 选择时钟(内部时钟可以不调用),定义时基单元,配置时基单元(定义时基单元结构体,)初始化时基结构体,更新中断到NVIC,配置NVIC 的分组  ,定义NVIC结构体 , 配置NVIC结构体 , 初始化NVIC结构体,启动定时器, l2 t9 r7 ?: A& U9 j4 o& U
定时器中断函数:判断标志位,清除标志位0 Q, ~' e. |2 s) g- O4 v) x/ f2 ~, A
# X/ m7 S! v% ^7 n6 @. W
NVIC结构体:中断通道,使能  抢占优先,相应优先级
/ R" F: t( C- Q) f2 {" @6 m- M1 V* R  S8 }7 h7 P; N. Q
时基单元结构体;: 指定时钟分频,计数模式,时钟周期,预分频,高级定时器配置给0
; g, p6 ~- F; _- d: b
# j' W) g+ ~) W+ I
预分频是将前面的整数弄掉,时钟周期是自己想设置的定时长度 可以这么理解 时钟周期+上预分频一共有6个0  以定时一秒为例:
0 {( d: E6 {, ?9 z
( C# i: G+ K/ [
预分频:  7200-1  时钟周期: 10000    定时的长度=72000000/ 预分频 /  时钟周期
! m% P) g9 F( M$ C2 O+ s
2 G; x3 b4 S' n& j
找到TIM的定时器库函数:% L+ k, c; I& l5 c* u( E. H

$ w! \: d* B; f
3a5f28024d5c4b2290dc5cb28720d4f6.png 5 T# @- w  C9 w) P
) B* `) M' L% k9 ?' r0 E
( z7 a% E- _3 J) r6 H& _( R
第一个:清空配置" w( |; r/ X" t$ W

4 X- j% [. Q" S- l" O 第二个:时机单元初始化  w! X" ]  }- v$ n# a- H% @/ X8 w! d6 e
, F7 `3 h% Q5 U% N3 S7 X
Timebasestruct  附一个默认值9 s- `$ B2 }9 @  B7 i
0 A. Q7 Q: C/ \3 [
TIM_cmd  使能定时器* u2 T0 b( o8 M' R( g9 d7 d# F
" j7 j; g5 p& u5 _4 V" ]
f68281e4d512408f8347cda171414d30.png   m4 ~  m3 W- k; [$ f# q5 ^
) q, v. @7 x$ }! I* a8 e3 w1 E
TIM——ITconfig  使能中断
" ?9 h; p1 H; v8 e) _" J1 X* ?* g/ n1 E4 k( q& J& ^
77458f799cbc4bafa5c17582b98b0af1.png
* L3 }: f5 p) ]+ C5 Q1 o+ n) `- p1 F( r0 D$ D
选择时钟
; y4 O2 l$ Z! `. ~9 Z5 o
& h/ `7 H# g+ R/ L0 m1 W  具体步骤:3 q! J+ G1 g: T( s, V9 {$ r

) B& a9 w5 u& ~! _' \8 {7 {: [4 j
d6a42cf6bf754376a46501b9fda8dff8.png
( P3 Q, D% S: J1 m: Z
" `$ A4 d/ Q' M: Y, C
这里的分频和自动重装值需要理解一下
; b; B* t) J! o7 Y9 Q
6 D, `8 H1 [) L8 b/ y
c296f3fb1810406f999f06e9dec26e60.png 9 W( }4 a9 t: s1 s& i
/ T5 o# \- \6 a6 S
72M/分频/计数个数:
+ C- p/ e' r- o
) ^8 I) w. H$ s7 B72M分频7200为10kHZ 然后计数10000,得到的时间就是为1s
+ B1 j2 Z) _' V0 O$ z5 q& v/ A+ ?0 H/ ?0 e
76c656a4d2914480b2d264f022905074.png
: f; o# z! `" K3 X
: Q. t  ~/ S  k+ Z" r 打开定时器时清除中断的标志位. K8 B2 U9 D" ~( N5 k4 N7 u
9 O# ?) ?4 E, j
37bea5bb89a64a1b8d17ed82cb47f444.png 1 v4 d- [4 N6 s5 O* h' S% L
& H# a% N; C" \9 U
判断中断标志位然后进行相关的操作
: j/ C- B# g' r& P6 \( i  i+ L! {0 V" y2 G: w6 m$ ?: `
外部定时中断: 通过外设的变化让定时器的计数值进行加减,然后进入中断
& J/ t2 z0 i' Z
, j* J. j/ N0 |# W6 e+ T! C+ j使用的外部时钟,需要用到GPIO( f% Y+ z+ H1 {1 f. h) d$ j

5 i1 u9 s1 N- |4 e. c* I% L配置外部时钟; 配置外部触发的时钟
1 ]2 i9 |4 h, ^' V8 e
# Q9 C( i  ~6 a
bbb7d542ae65412ebd9cbc88229e51cd.png
$ ~& n" e' _* y" n

( ~! D, M2 M1 n6 r4 |5 n6 M 复用的是PA-0口
7 o  m6 g# _8 q3 O# G5 s( |( a: U$ ]
2be0a931addb43299f21f80c46205425.png
& R9 i; _# Y2 J) A% g8 A- q. H
" Z; N+ n2 b, U4 m5 V# ?6 B
48f0205c6243422cafaaa3c9e2616264.png
8 I7 ~- D6 I- @3 l$ Z8 X% W* L- ]" C& y
外部重装值:外部产生一个信号号重装值+1,当加到9时进入中断,/ B0 }- [2 t2 F2 X3 U& _

7 _/ t/ S2 ]3 {: X, h0 l预分频:外部产生多个信号重装值+1;没有预分频,外部产生一次中断重装值+11 a1 [  y# B! l; W+ T. S' ?, r

" U1 _& T3 m+ U7 h2 s* I定时器中断代码总结:
- L$ h* s2 _# ?3 Q( r% B# @2 T/ F' c) ]; G7 g: w
打开定时器的相关时钟,选择定时器的时基单元,配置时基单元结构体,- l6 O* K7 s6 N9 S
4 A' [+ O$ P, p) M& j! w
打开中断定时通道进入NVIC
7 z1 Y, o2 s$ J) s
* Q0 R2 }, z  f  c% T1 f# S配置NVIC中断优先级,打开计数器
9 e, x, F2 R& k2 O& P, `/ D

7 o. E! T5 g' B" y6 E外部中断时钟触发定时器,需要用到相关的GPIO口来进行定时器的触发
$ i& A8 G) J  z1 b5 R/ H( g1 {# Y$ c$ z" @
不用预分频 就直接用周期来进行判断进入中断' y. q9 r$ b) e6 k5 z% }$ s( c
————————————————) G+ L, M4 b6 Y4 U& x7 e
版权声明:小聪不想秃头
1 `; n# d$ _# `8 N7 l' v5 c如有侵权请联系删除
5 f6 G( C+ W: w0 c& p
' c# {2 s/ n: E# a- F; E
. r8 X$ L# E" Z4 C  @; r% f
' j+ x5 L$ P1 l/ r- C6 f+ G. L
赞 收藏 评论0 发布时间:2023-5-1 16:00

举报

0个回答

所属标签

相似技术帖

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