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

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

[复制链接]
攻城狮Melo 发布时间:2023-3-18 16:40
SysTick是STM32中的系统定时器,利用SysTick可以实现精确的延时。
* @0 F( C' D' [; N# z6 D/ KSysTick—系统定时器( d* P3 \( }2 T
属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。
. ~& q# \8 F3 r5 N0 Q* L3 p, L8 G

- o+ ]5 m4 i& l$ z延时模式:
& p, t! `; K* U2 pSysTick的延时可以有俩种模式:
5 U# b9 A: J2 U- {1.单纯递减延时
' ?  s) D# G( V: M7 O% v' ^, Q2.利用void SysTick_Handler(void) 中断函数延时
6 o* K+ q: A+ f2 l
6 P- n/ T; q% x3 K  T1 ~# o3 U
俩种方法都涉及到一个函数,那就是SysTick 配置库函数 ,6 m( R* t# K8 v  R
  1. __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
    # i; v  Y0 U6 p9 d! p( B
  2. {. q0 D" f" D, E( `
  3. // 不可能的重装载值,超出范围
    0 h3 F* p0 ~; K2 N$ b. m9 s# S
  4. if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)* g4 r8 B/ Z9 e8 H0 _' Z' d
  5.   {
      P- I( d! `3 a( y
  6.          return (1UL);1 m- t+ d' a+ E
  7. }
    5 g* H. P( C7 h0 h/ N( t9 `
  8. $ N% o8 L( G- A
  9. // 设置重装载寄存器
    7 U2 }3 t! J: A- I9 K/ ?" P" F
  10. SysTick->LOAD = (uint32_t)(ticks - 1UL);' ?& ?. d+ g! C% W8 H: M# k$ |# h2 l2 I
  11. 2 O* C/ x! L7 m7 K$ l6 t
  12. // 设置中断优先级" O) {" Q' e( V1 s* u+ x
  13. NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);
    5 r: y; U/ _" @8 P0 D

  14. , |' |8 S( n7 l1 _; \1 {5 a. B6 ~
  15. // 设置当前数值寄存器
    0 ]4 ^2 ?1 t3 _
  16. SysTick->VAL = 0UL;7 e8 P4 M/ B( v7 ~/ l' T

  17. 7 f6 {$ \, I; X, f& p
  18. // 设置系统定时器的时钟源为 AHBCLK=72M
    , g* |7 G* Z+ n8 R; `/ ~+ o. z
  19. // 使能系统定时器中断8 m. a3 I# _2 c
  20. // 使能定时器
    4 _8 F' z) D9 x8 e8 M0 Y% @" p/ c
  21. SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
    5 d1 @6 D! ^7 ?0 s# b* V
  22. SysTick_CTRL_TICKINT_Msk |
    # d6 c* o- H: q1 A+ N. X( B( R8 O) \
  23. SysTick_CTRL_ENABLE_Msk;0 r/ W' |" I$ Z2 _
  24. return (0UL);
    ) W! i1 K/ Q; K1 D$ e8 l. P6 ~7 `- f
  25. }! L) n/ n3 K# a, d0 t$ B
复制代码

0 W+ W# h4 I  Q2 o6 \4 l% T其主要任务是装填计时器初始值、设置时钟源、设置中断源优先级。初始值不能超过2^24,时钟源一般为72M。
3 P/ s( X; p4 q1 C/ J4 G; F+ [4 c  y( \6 l, ?' R, x' K% l3 {! c
20190726212429892.png
/ o) N9 W% d$ I3 z2 K: _0 s/ Z7 J! s* Q' @6 q* X
1.单纯递减延时3 J7 A/ W: Z7 S& x
毫秒级延时/ b# E' b  B: p' L' j3 e% e
  1. void SysTick_Delay_ms(uint32_t ms)
    $ H+ ]! x% q% g& Y' c
  2. {8 s5 L- e! ?- H7 G
  3.         uint32_t  i;
    0 e4 B: U7 e- `9 m( ~2 I9 M
  4.         SysTick_Config(72000);  /* 设置初始值为72000 */
    + G" c. t7 Q- |: a3 F
  5.         for(i=0;i<ms;i++)
    - ~% p6 C$ a) d/ Y9 g
  6.         {6 v$ i+ J* M9 @
  7.                 while(!((SysTick->CTRL) & (1<<16))) ;       /* 检测一次计时完成 */
    5 y& z7 `3 v% m7 ]' }; f& p; L1 S
  8.         }                % r4 H6 O  O9 N& A/ j
  9.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  /* 操作寄存器 */
    % C, e6 z8 N3 q) X
  10. }
    - Y1 o, l0 i3 d3 F+ ]- h
  11. 4 a0 @$ A( [$ b) n( d8 y
复制代码
5 B, T. D# m/ [% S. @
2.利用void SysTick_Handler(void) 中断函数延时
& f0 f9 R* W! o毫秒级延时
& N( x+ l( w/ a( t  i5 H
  1. volatile uint32_t isr_ms;
    ( U$ R) L8 p: D. f! L
  2. void SysTick_Delay_ms_INT(uint32_t ms)1 g5 X, T4 p& F+ \/ ?' I$ b4 W
  3. {        
    : b& a0 r6 P3 G9 s+ l
  4.         isr_ms = ms;
    / N* X( y- j& @+ C" O
  5.         SysTick_Config(72000);$ N& k$ W& _: u# ~1 u: w$ _3 @
  6.         # P! H5 T/ y' f6 U; w5 A
  7.   while(isr_ms);  /* 在中断里递减 */
    % t& ?1 i9 H( ~+ `3 s* \* g+ ~
  8.         
    2 M( t: D2 v1 o2 y+ @1 l
  9.         /* 失能systick */) \7 s+ Y; p7 u3 k( s. @
  10.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;+ ?8 a4 f' W9 D5 q
  11. }
    1 k1 K- P& @( o" Y5 C
复制代码

; q# e6 h+ @* F+ G  r在stm32f10x_it.c中的代码如下:' w7 D- H6 w: z8 G% Q" ~! p3 e
  1. extern volatile uint32_t isr_ms;   /* 这个变量在bsp_systick.c里面定义 */" z1 d7 `6 Q+ d: ^& l
  2. void SysTick_Handler(void)
    , p3 p0 J$ V; {7 @7 v( C5 o8 F* v
  3. {
    / ^+ T* d9 z: o6 C6 j
  4.         isr_ms--;
    1 d! p. A5 q6 u: U9 c: V" A- x
  5. }/ z, A, ^; @) W1 M: U
复制代码

2 t$ v# B$ q- N8 u% N' \————————————————$ u; f  }/ _0 i% r$ `4 b" @/ J
版权声明:Aspirant-GQ
+ E! l& ]! I# l6 ~+ L如有侵权请联系删除
; D( V* \" i$ L$ M; E. d8 M1 d2 ]
赞 收藏 评论0 发布时间:2023-3-18 16:40

举报

0个回答

所属标签

相似技术帖

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