请选择 进入手机版 | 继续访问电脑版

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

基于STM32的SysTick系统定时器经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-18 16:40
SysTick是STM32中的系统定时器,利用SysTick可以实现精确的延时。
9 `; r  z$ z/ y* a: E( A( j1 KSysTick—系统定时器. w6 s8 d$ T( G
属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。/ L2 v9 I0 Z4 l1 y* r( r+ C

3 ^; L. Y  E: i0 T延时模式:
$ Z7 s) K- v: Z2 {SysTick的延时可以有俩种模式:
: K& U$ a9 o) C0 [1.单纯递减延时
7 s. U' ?$ E0 q: i& v+ y) O# m2.利用void SysTick_Handler(void) 中断函数延时
. [3 p" S  ^/ D9 s, s

% ^( t4 N4 |' ?& ^7 ?俩种方法都涉及到一个函数,那就是SysTick 配置库函数 ,% j# W# [$ O: y+ ?: `
  1. __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)% J2 j: s( _& ?6 [  B" Q( i7 Q
  2. {
    ( i8 q3 F6 @+ @/ p0 o1 X3 H( b' Z' g
  3. // 不可能的重装载值,超出范围
    & [: [/ x$ E4 e  ~( C5 G8 o! l% O
  4. if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)( {* a% j+ X0 x' K
  5.   {
    2 W; ]2 [+ Z' b3 U
  6.          return (1UL);
    8 C' X. E* r& a" q3 W. ~
  7. }0 S# l/ h* z' P2 A8 M# D7 C1 o
  8. 7 [$ z; q: C; V  [  c( a
  9. // 设置重装载寄存器' G, [5 y5 E) m& K2 B! O
  10. SysTick->LOAD = (uint32_t)(ticks - 1UL);
    & U# h& G' X. ]* f

  11. ' z) y# e3 S; M6 X; r
  12. // 设置中断优先级% K6 U" k. D0 r9 U1 |1 r& ^
  13. NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);
    + n: Y$ `, `' @
  14. 8 A& w$ g; n; N% h
  15. // 设置当前数值寄存器3 }7 _% z8 o; {4 c9 E
  16. SysTick->VAL = 0UL;
      m: t  J/ Q$ [" j( E

  17. & F9 x5 D+ |2 n/ D$ l
  18. // 设置系统定时器的时钟源为 AHBCLK=72M8 ~! }' m+ J2 Q+ b: B7 P* P) S! u0 X
  19. // 使能系统定时器中断
    0 x1 P% Q3 i, B! ]
  20. // 使能定时器
    5 t. Y2 n. M  Z. ~1 F! Q5 n
  21. SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |0 Q: D" X/ A5 S" Y
  22. SysTick_CTRL_TICKINT_Msk |
    ( t1 N' a: R5 ]
  23. SysTick_CTRL_ENABLE_Msk;
    6 G; v( E6 ^2 L4 g$ C3 G7 X9 I2 J6 y
  24. return (0UL);
    2 i% a7 \  ?8 U$ c) d5 x1 X
  25. }7 f( r1 M8 f% U& Q' H' t% n3 a
复制代码

5 H2 r! f2 B6 q$ y其主要任务是装填计时器初始值、设置时钟源、设置中断源优先级。初始值不能超过2^24,时钟源一般为72M。
5 n6 q& c; r* t; I4 C% W" n+ w3 D5 P/ h4 R2 i
20190726212429892.png
2 ~  K; Z* m0 q  p5 z
) l6 `8 n+ q- h9 D0 w1.单纯递减延时
# X$ Y  y/ N) A" K# m8 @毫秒级延时
# i2 }% d# P7 m  n
  1. void SysTick_Delay_ms(uint32_t ms)
    5 E, m; M+ q! z, F9 O! s
  2. {
    : ^2 U* R1 ^- f: Y9 u5 ?
  3.         uint32_t  i;
    9 N- N$ k# ~7 ?
  4.         SysTick_Config(72000);  /* 设置初始值为72000 */
    + u( b9 b( O: s0 n
  5.         for(i=0;i<ms;i++)8 X$ A7 N$ x1 K8 M' i. m
  6.         {
    . U1 ]2 C/ V/ ^2 p' W2 B. ?
  7.                 while(!((SysTick->CTRL) & (1<<16))) ;       /* 检测一次计时完成 */
    6 E* c1 r: G+ f7 l
  8.         }                " P. {, V' a: ~3 u
  9.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  /* 操作寄存器 */" d# O, R! B7 K' f+ m
  10. }
    & g$ p. m9 u! D/ Z7 e& z

  11. & O$ k7 M/ |$ U( l1 X
复制代码

5 k4 c: _7 p+ s8 ^7 B$ x2.利用void SysTick_Handler(void) 中断函数延时) P& h" J) d& h+ e5 p5 E
毫秒级延时7 z, `5 U/ O- W- t9 o& N! S4 {
  1. volatile uint32_t isr_ms;: }" R6 ]  q/ c; }  v
  2. void SysTick_Delay_ms_INT(uint32_t ms)3 A$ |! N, k- B5 Y0 o
  3. {        % ]/ d( j  E4 X. D7 w1 w# W
  4.         isr_ms = ms;& X9 H* K) @% m* v! h9 a$ J
  5.         SysTick_Config(72000);
    % U4 |* Y, u1 j
  6.         
    & S: W$ [" L6 ~2 c% k
  7.   while(isr_ms);  /* 在中断里递减 */
    0 n& ~/ y' P% E/ ]- r0 e
  8.         
    ) h/ b" [1 b/ _6 ~5 U
  9.         /* 失能systick */
    4 P* @  Y  o+ G" }$ a
  10.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;# i$ j+ H  g$ o+ J  p: [) @3 G0 _
  11. }
    + C& `$ c# s+ N; E$ B
复制代码
. [) a  i) H" S6 a4 {9 g( g" T6 r3 N
在stm32f10x_it.c中的代码如下:
# _5 X. X6 x3 a" w6 e! ]) j
  1. extern volatile uint32_t isr_ms;   /* 这个变量在bsp_systick.c里面定义 */5 s: m9 ?- q" ]6 Z$ J  D0 U, e
  2. void SysTick_Handler(void)) o% S  e) M/ g% l0 I3 D7 L+ N
  3. {$ Q0 ~5 R3 [; f# N/ f/ ?, s
  4.         isr_ms--;
    . l, j- g% F3 I: [( M
  5. }. I. z- _$ `2 |* m/ L
复制代码

1 ^  Q# y- @4 n* x) P————————————————
2 C4 V6 P# l, D" K- x版权声明:Aspirant-GQ
7 h7 R* f/ g) V0 d/ @6 e  C) m如有侵权请联系删除
* R) h. h  T. H& U, P6 v
收藏 评论0 发布时间:2023-3-18 16:40

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版