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

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

[复制链接]
攻城狮Melo 发布时间:2023-5-1 16:00
主频72MHz:最大计时59.65s5 A+ M2 m* M# R) [
0 v3 P  U& u# D7 O
b6241eaf4d78470d80fd0e3798321cc3.png + A" ^: F; t# ?- s6 _: R

7 j0 ?6 h' J3 X+ ]

: `' k0 f3 ~2 _3 u; R基本定时器:) p# K' J' G  Z$ w5 y' E% ~- A8 N' F
) p$ ^* n* w' G* {2 c% o
基准时钟 预分频器 计数器 计数器与自动重装载寄存器进行比较 相等时计时时间到 进行中断相应
( Y9 C# E' O( W' v5 p$ j
; i# h4 T* h* Z8 {
主模式触发DAC 硬件自动化
0 _- S7 @1 H" n( Q! w8 @
; l2 O" i8 @2 e, Z( c5 T通用定时器:
: Y4 _: ~' \- S9 t9 q0 ~8 y) }8 K/ M, c. T# ]
c07844004e234b34ac06fa0e8c9745a7.png   z, R* y0 U/ p+ p
3 p  [1 m2 H5 p7 ?
计数模式不只一种:
; k# l& V5 {9 T向上计数:计数器累加到自动重装载模式的值后进行中断相应& y% z! d; n! l. q
向下计数:自动重装载模式中的值向下减到0后进入中断+ c. p2 ~" S$ W  U
中央对齐: 向上计数到自动重装载值中断产生向下自减到0后进行中断的产生
) _: x4 z' a5 E, j( X" ]$ Z: g! C# C/ T: N
1cd051f0c9514f1eac39f944da83b767.png / _/ k, _. s* ?' R2 V7 B3 ]# J# d) O
: t3 _; F# h. A+ m8 \7 w
定时器级联:初始化TIM3(使用主模式)把更新事件映射到TRGO上 选择TIM2 对应的就是TIM3的TRGO   选择外部时钟1
5 x5 _6 {' F  Q$ }2 H8 ^- q

* g- c& j* I: k: x; Z) x' T 定时器的使用: ETR引脚,CH1、2、3、4 边沿  其他定时器: g0 D+ l  j6 p
7 l6 _* m/ H2 T' V
输出控制可以产生PWM波形 ,左边的输入捕获可以捕获输入的频率9 g; P$ H' \" I9 U
$ h" ~% ?6 z8 e2 [. P( ^' }8 z4 H9 }
2ef24777045a49b0822575d52a29f220.png ' B* X0 K" j3 K) [" j. M2 C

& \5 n& [+ R5 D" O' l: k
初始化定时器
0 q( S2 x1 N* G& u6 e" O8 q  _9 i. k开启定时器的时钟线RCC, 选择时钟(内部时钟可以不调用),定义时基单元,配置时基单元(定义时基单元结构体,)初始化时基结构体,更新中断到NVIC,配置NVIC 的分组  ,定义NVIC结构体 , 配置NVIC结构体 , 初始化NVIC结构体,启动定时器* [+ G' p$ }8 G' O' M
定时器中断函数:判断标志位,清除标志位
0 t9 B& e- X3 M; V2 i" J$ s) p/ g# N$ f# N: V2 w0 J
NVIC结构体:中断通道,使能  抢占优先,相应优先级) j; z  R" z. `5 v* c* U. d
2 {% \- J! \) ?' `* r, A& D
时基单元结构体;: 指定时钟分频,计数模式,时钟周期,预分频,高级定时器配置给0
# F7 N0 P9 M( d; ~( ~
5 X, E  Y% r! H( X6 T
预分频是将前面的整数弄掉,时钟周期是自己想设置的定时长度 可以这么理解 时钟周期+上预分频一共有6个0  以定时一秒为例:. Z3 b& R  q6 o7 p7 p

8 A( R/ @9 D3 W% N7 a4 m
预分频:  7200-1  时钟周期: 10000    定时的长度=72000000/ 预分频 /  时钟周期4 C$ j9 g) B( D9 o  V. o7 ~6 c

9 R, j  f: G) _  P9 u7 a2 e
找到TIM的定时器库函数:
! J  J: W3 A6 z; O  K8 h
9 m: d$ d( f% z; {' {
3a5f28024d5c4b2290dc5cb28720d4f6.png
  U8 n1 ?) M5 P3 R, T0 l- t7 X* z! x0 Z4 h% b1 `, i5 S. {1 \8 h

7 u8 j! L+ D9 o+ A第一个:清空配置" y1 P1 G4 w1 x

7 R0 h6 o7 g$ B) c! W# }8 S4 k 第二个:时机单元初始化
) {& B+ Q' m5 h. [- N  [' h
9 R9 M; J" v: t% v
Timebasestruct  附一个默认值% @! y  l, n* @# L

4 {( Z" f  ~& a: D$ q. B, LTIM_cmd  使能定时器+ U( J& h# m" ~# x5 q; Q; U$ C

( I: h" h; U" O
f68281e4d512408f8347cda171414d30.png , P" P1 p* H& g1 D- t. t# d# g2 A
! r& {6 O8 D6 a6 u4 ^# o2 n
TIM——ITconfig  使能中断
& r: ^3 G6 }+ ?. }: T; f3 n7 u8 S8 ]* ]& H+ C- N
77458f799cbc4bafa5c17582b98b0af1.png
# S9 R, E: x1 L7 q% v0 l
6 }- t" q* S8 l: c; W! u! S. b选择时钟
/ G2 R& s1 H/ q5 G6 c0 W8 z5 C+ N& {) e- M. Q: Z! ?
  具体步骤:
: A. {0 t1 ^4 A8 O6 I6 m- k6 S0 [3 c2 p
d6a42cf6bf754376a46501b9fda8dff8.png # }* \# J) Y# u( y; X4 M
% b9 F, E. R$ ]4 N0 q& W
这里的分频和自动重装值需要理解一下7 ~7 E8 ^% j7 H& r# t
9 A  o$ A3 q0 N# l- g' L" n
c296f3fb1810406f999f06e9dec26e60.png : a# a3 ?& h" \' X* c1 j6 m8 L
8 S8 v& a6 U5 T* z) Z9 O
72M/分频/计数个数:
% I. a& R# I! J; p3 N
2 G9 D; m$ g! h( f; r/ @) `72M分频7200为10kHZ 然后计数10000,得到的时间就是为1s( F3 m5 v- X& C: T6 H

3 X0 B* Y" R% w7 [8 t8 g; q
76c656a4d2914480b2d264f022905074.png
/ j+ T0 D" G; W$ B& i7 r7 i9 j. F6 t- b1 {1 e5 z% {
打开定时器时清除中断的标志位
8 q* `/ O, h5 S, C. t/ }- u9 j7 q* _* U+ _! X
37bea5bb89a64a1b8d17ed82cb47f444.png * u- K# K# z- W( f6 p5 y3 {
% a9 J$ X) z2 ~
判断中断标志位然后进行相关的操作9 {+ C$ {( b+ H; F) o3 m) T2 {, m
$ }5 |4 y2 D" O& n
外部定时中断: 通过外设的变化让定时器的计数值进行加减,然后进入中断
' O# e, n, Z! d/ \% e' C  Z& y% w1 a, X+ }3 ]9 X2 A
使用的外部时钟,需要用到GPIO
2 H7 A8 |& T5 G, `/ r: H9 P. l! E8 p! e& h# ]
配置外部时钟; 配置外部触发的时钟/ e3 t7 m* ~$ [4 r

; a; l" n; \' j# B) N6 ^' _. q
bbb7d542ae65412ebd9cbc88229e51cd.png
' x, V5 E) t. H5 i
/ u' }8 F* v0 |" a, j
复用的是PA-0口
3 M( L. B1 u/ _0 n+ J% V. [
* D* a. M! B! a# |" J. W5 D0 F
2be0a931addb43299f21f80c46205425.png
3 v# o' g* J+ ^, Y: }( s2 X6 x6 [" ?( Q3 l5 E
48f0205c6243422cafaaa3c9e2616264.png
5 r# N( e' l( ?% y( ?
+ H1 n' R3 b% J' F: X, g- `$ ~ 外部重装值:外部产生一个信号号重装值+1,当加到9时进入中断,
8 }8 k# l- e, s7 i
5 ?( }" ?0 f+ l  ^, v预分频:外部产生多个信号重装值+1;没有预分频,外部产生一次中断重装值+1; R0 z, {+ X4 G6 r& A
9 w! l6 W8 D: {3 W& q  I
定时器中断代码总结:! v$ m8 a. ^  x, q. E

5 L: Z# z# k" T/ }打开定时器的相关时钟,选择定时器的时基单元,配置时基单元结构体,7 \1 n4 O4 u1 @: V
9 l6 ?/ T1 t6 x. ^, ]: Q, ?
打开中断定时通道进入NVIC* X! `+ ~3 I% `% h* h

! M' H" b$ I! i. [配置NVIC中断优先级,打开计数器' I: [- O( |2 n8 O1 s

# {, v' K+ l' W% S; k' k5 }外部中断时钟触发定时器,需要用到相关的GPIO口来进行定时器的触发
7 f* g/ @8 G! a  [5 \
2 ^( Y( N7 L% t6 \3 a8 a不用预分频 就直接用周期来进行判断进入中断' w2 ^( D& U) }2 a7 K. E+ D9 z
————————————————  p" t6 }8 U; Z
版权声明:小聪不想秃头1 F: i/ q5 W8 A( k* \
如有侵权请联系删除
: q; O! B+ h. }: q6 m. N0 L' m1 H, B2 V% e8 k. G6 M4 R
3 H: ~2 }1 J* M

7 R6 n3 O. t) d" Z& a
赞 收藏 评论0 发布时间:2023-5-1 16:00

举报

0个回答

所属标签

相似技术帖

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