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

STM32中的Systick定时器

[复制链接]
STMCU小助手 发布时间:2022-12-26 15:00
概述, _6 X" I% }: r; n; N* ]
Systick是一个定时器,Cortex M3,M4的芯片中都有
, q+ Q4 b  ]( A& U( F: U+ C7 b

: w( L4 M. \- Y% Y% oSystick定时器通常用于实现延时函数,节约MCU资源
2 T3 p" o( d! P0 n
* p* x& W' B8 B  y
3 b7 Z* h8 N" {9 i6 g5 y$ T
Systick定时器就是系统滴答定时器,是一个24位的倒计时定时器,计到0为止
; V7 s8 ]+ S% q  ?- a/ e2 ~; |) d% O4 g) J1 ]4 I: }

7 R, k% F1 @% d/ q9 @/ R& f从RELOAD寄存器中自动装载定时初始值
+ V; O, D8 q- r6 o3 |
. q- R/ q4 o) c; c4 C  i: L# L

5 @% ~# C( k, C# h只要不把它在Systick控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作' B4 V4 E9 }8 I. J: \! _

. H3 n( x* i# c+ W
+ R  ]9 ^1 M" A
Systick定时器被捆绑在NVIC中,用于产生SYSTICK异常
; r7 ^/ h0 `) N
( p' U# _: U, f& |% S1 |

2 x2 \0 L. ~# o7 ]3 ]4 n. PSystick中断的优先级可以设置
; n' l6 I  r( y9 s( K. L5 Q
, O. z6 v( z$ t# T5 l+ `; {

! b; m& j" z. m+ c2 j! F' V( [. cSystick的寄存器& s& ?4 |( i2 T

4 B. f& d. K) Y& e1 [+ c! ] UE8VEULGH_{8~NJSW7H%H4J.png
- _$ Z4 i# ?% K5 X+ r
( |0 n, W- ^  L) @: KCTRL
5 N: X. f7 c7 a  G% D4 r
7 r8 r( K% j) E  L6 T) {& L, |
9 o& h- K8 H/ J8 O0 Q6 T
b8d06822b75b450aadc96ae2a5b42344.png 4 d6 }3 ^$ j% C% x7 U

7 ]" B2 U" a0 J4 A
6 f0 w! o0 s( o2 h$ J0 W
ENABLE 使能. @* U+ ~: k, }

$ n- I# ^) q; n: `: \

6 y- @, {9 I. C8 D5 c; lTICKINT 是否产生中断
! G# m9 q: v2 c: _# G0 c( O* h3 V$ ~- p6 T

; S1 P+ v9 M! \; A& k2 m9 ECLKSOURCE 时钟源,外部时钟源是HCLK的1/8,内核时钟是HCLK' l  _+ K, W  p( h
! K( \/ s# _: f7 n, O/ `

( `) U+ v6 i# P$ }COUNTFLAG 一个FLAG: {. Q) B  J8 h2 V6 V
4 a; Y+ y9 f, I' b* E

3 I. Y7 j- ?- V5 W# W3 s' }LOAD
$ O# g+ J  U( }! f" ^1 m
: O& Z7 Y# ~/ q& D3 F
) l( b3 ^$ j0 Z% D
13c51018a83544a6b8c186d3085a8c2b.png
5 V% I+ e6 }5 Q( H2 [% Z
6 Q$ P. P: z5 K1 P. k+ [) e
: R. {$ E$ M) u/ X; t/ w8 b4 j
VAL1 B: u# J8 k2 e2 Q
! P6 H$ w) `& h/ {9 o
f5d2752f8f0744368e0e27e1ea3ab9a9.png
5 [; ?, k$ p! _
2 o. V! V( v- R" T- }CALIB
- N2 u9 P- {# Y3 u7 K) P5 {不常用
: _* X5 l$ Q7 S& `9 S; [
; Y8 T0 C1 t! R$ D

9 D% H* l" t+ M. P+ v% k相关函数
6 ~: x! i) C9 q, r- _6 {) zSystick_CLKSourceConfig
" u6 b# e+ d% K! E
5 k/ |: W. m* V8 U
' b. \9 m( j- N! `, m' F
在固件库中的misc.c文件中(misc.c主要是用于中断管理)4 N2 k( }% F1 |

7 C' X. n& H# O2 R+ F; R

; }- q2 y5 J8 u% ^( \- I函数实现如下% ~) f2 H& |0 t9 d. K# L* w
: K5 t) N) C* O4 O7 r
2 W( v: W4 {. y: i8 E
c1f7c7c21a7d4952b5e37827d1fb46e3.png
1 W, ~8 F( ?5 g- `! D! w+ o
8 i. K2 x& @* p+ G) f9 A2 R

- @: Z4 I3 x, eSysTick定义如下+ a# N5 l2 U' @  ]" L/ Q
# S  H$ H7 Q. x  y( U
3 n6 I0 @& t( V5 K" @4 z' j3 z
core_cm3.h
( k2 B3 w) s/ L/ U! i3 C
; v' ]" T4 h2 Z+ v

8 Y# \, ^9 s& c) _# k d2219fc50607476982c97796e852f2a7.png
; w+ G( y" `& R) V
/ b0 e, S2 }! `
$ ~2 J! w. f6 a8 W$ \) Y+ v3 f
同一个文件中,查看其结构体类型4 g8 _# n: z( Q8 N% ]/ m

7 L* Y% I2 r  y% k; _0 w- ]

; ~, S# v4 I& M4 j! | d79259569f6341a7be65f53b63d5b2eb.png
# |/ W2 w5 f! b& i. E* l0 P& h: T7 k" c1 i9 a- _- T

! d0 S/ r3 x. u+ z+ A) O查看Systick_CLKSourceConfig函数入口参数的可选项,点击断言
- }' I  i# {# ?6 h
$ j+ c. k7 D1 `6 L8 {

  H4 _: b8 s* ?! M 2670cab137b7436eb5f9d8ec4eb02a5d.png
& u; M: H& l& [2 g4 ]) R1 b' @+ h& ^7 ~8 M- G; F3 V
0374df8e75304978925fae0954fbb30b.png 0 D: C8 ~& m; y/ _( J
% T% I0 b$ [' q6 _9 V# k

" y3 k& \2 n5 G- \8 }" g/ h可以看到,可选性分别是
) J) |; A& D5 z& A5 |SysTick_CLKSource_HCLK_Div8: ]0 r- E3 {# D* t
SysTick_CLKSource_HCLK
0 t+ u: O) O. H6 Y7 l' s: S0 O
9 C) O8 Q( R1 G- E9 p

0 X& H' v( ?& l/ ]2 B因此:
3 Q; E! Z. c( G% l  U
0 K9 F, k, B& m. b# V6 Y) ~
% N) H' j5 Z% M
60b2b379699c487eac5de7c3093976cb.png 1 _& ^- @1 n2 p9 Z8 Z% U6 o+ k

( H: d/ z. [# l2 M: w+ ]9 r3 D

3 z1 x' x! ]6 k, j& o内核级别的SysTick_Config
! Y& Z% C! ^5 \SysTick_Config
8 o, D+ W: o6 X6 X- u2 q* ]! R, ~" C2 [+ F

' f4 N' H3 F: zcore_cm3.h(用于内核级别的函数)& J, m/ ~' l) U) [. y& v

0 Q0 |6 E* I" G: R3 A. k. I
' p% u" @6 o$ p) l% J
9a0268f3c8f044f09962cb2a3880ccdc.png
" Y3 _0 A; B9 m9 @0 w3 I0 u
0 k+ V+ b* n0 _! i. y: {/ M
: r$ Q7 F6 R0 |) H: X
入口参数是两个中断之间的时间间隔# d1 k& t. X- v3 }# j& {
3 P0 ^; \  s# f& D: N

" U' U1 u( |$ p8 L, F 924c6c9fd6ae43089fc685b7d9c7107e.png
1 ]; f# f+ U( i2 k  Y2 L8 d5 h( K$ L3 m6 b  k& ~
# p( A: E& g3 V# f$ S5 v" t# m8 O' {
判断有效性
+ j7 E" n5 m8 l( y4 A% D2 t: w/ J& J# }6 j. ]% V' D
* L, |& q- S4 p
7af5750df1344f18a659d93f82cc67ab.png   a; a: d" p5 K) C' E' v

2 r/ W" p& A/ n+ o1 n- G4 t/ M% a
, g' o5 q" e7 A
设定装载值2 U- W- s& _4 q2 @2 n, X
" d& x' J$ A' N

% u/ d3 c- l# R& Y$ u0 V 9a1b00fae6bf48fc87aaf0be58efc297.png ! T+ x: D6 d+ U  x  ?" ~' }8 C6 t
6 T) k! E; D/ [
' x- [1 I) A# B8 W: ]
设定优先级,且初值为0
$ p" [6 E2 M) Y( h8 r9 A# O
! F) V% F1 A9 I* M. @% \

6 `( {( w, g- l- j0 f 00cea5e7db614828884b24fec8b9fce8.png 2 G+ J7 \' D7 `. c* o" M" c6 x- M

/ D* W$ |6 Q) U6 \

+ U0 t4 X1 ^) b6 g3 b1 @设置时钟源,开启中断,使能定时器
: z4 }- v5 x9 b( x% p0 e  {9 s" i7 Z4 f; K; D8 P
) |+ C- s  u# x% o  n2 P
设定了两个Systick中断之间的间隔,也就是说每过这么多的时间,systick的中断服务函数就要运行一次8 [  W) H9 X4 E/ g
# Q3 v1 d+ ?, I9 a7 {! S, H

1 G' S6 e1 L' y( i6 D一种实现方法- v7 X9 d. v5 W
  1. static _IO uint32_t TimingDelay;, f% Z. W0 y# K% V+ A9 k( {

  2. # a4 e) t9 @6 D, r. o
  3. void Delay(_IO uint32_t nTime){
    ( a1 V( d! N2 U
  4.     TimeDely = nTime;0 j' o/ o: V- U1 }% e- W
  5.     while(TimingDelay != 0);
    ' c5 Q/ `. ~9 M5 z
  6. }. [+ d! |. B/ X* K+ A9 u" u2 ]
  7. 8 B8 o# o5 k* G
  8. void SysTick_Handler(void){* Z) ?# l0 X1 F- L
  9.     if (TimingDelay != 0x00){
    - ]3 O* m' _* t" e' J6 l6 J
  10.         TimingDelay--;
    2 A4 l- S0 |2 R7 z- j
  11.     }% \  d5 i/ w! [
  12. }
复制代码
# x  s! K( U6 `7 C
这样子,每次Systick定时器减1,都需要进入一次中断服务函数,这样会对CPU造成很大的浪费
2 {, e: r# o0 u0 R' d5 v# f: E2 ]
9 Z: _) r( G' @+ Y" p& w9 E
: u3 y& v! z; o
另一种实现方法
7 B' n' j7 B7 ~5 o: o' |* t, H SYSTEM文件下的& v# n. O9 Y2 b& ^4 x/ T! f
delay.c delay.h
! P- c& g) P3 `4 c# J  f  i
5 Z7 s/ T( V: l7 e) B1 ~

8 E$ _: P9 `3 e 9cc4d5830f584688950c35f1e8fe6ea1.png # K8 R- `/ n+ J* Q

  y8 I( ^* x3 \* u
( o) W; a5 a/ \3 f4 W4 u  z& J
若使用操作系统,则使能该宏
: F9 o" s" x9 q, S" W( r
3 P, o. E) D2 e, d

" O" _2 `& B  @6 |. @5 f, t. [ a05612016e4041d0a257f5060881df9c.png
( D. A; K9 \; v6 N8 u8 B. s; s: t2 A
+ [3 O$ w- u' i  I3 U; N3 u4 P
delay_init函数
* h" z# V9 ~8 O( Z1 l" E  q3 P, n: u( }8 o. G, f0 w
  [  h* \' T( h5 o5 U
1fb145e9ef494c1e9fcc0d14cc7eb2ac.png 8 L+ w" m4 H/ o. K, O; s4 Y$ w

3 E+ W  R) r1 ^4 U/ N! |  }

+ c) W; v8 t6 Hdelay_us
4 l- H6 i; H4 z  Z注意:nus或nms不能大于LOAD的最大值,即2的24次方-1: I! n9 H5 T0 w

% D" C" P. ?7 [) L0 w e4dbb5ee8ee84123923434ac3321f879.png 1 Q2 _1 J/ h  m' x- |" w+ B

" \- u7 A3 X5 O! W————————————————) ^1 e1 ^0 U2 ?* {  Z
版权声明:CodeForCoffee/ g. f- P: k+ P' f! F9 M- y( j

/ ^4 @# T6 {% A8 @" C4 h* s* V5 s3 \
赞 收藏 评论0 发布时间:2022-12-26 15:00

举报

0个回答

所属标签

相似技术帖

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