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

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

[复制链接]
攻城狮Melo 发布时间:2023-3-18 16:40
SysTick是STM32中的系统定时器,利用SysTick可以实现精确的延时。1 e  v  S: M0 h, W
SysTick—系统定时器9 t" S' d6 O0 V* \6 U, [
属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。
4 |& `/ p/ `9 |) {" D/ q. L$ @
# e* d4 B7 c# a$ ~
延时模式:
4 |7 ?8 n) X, \! R! r# q# p, rSysTick的延时可以有俩种模式:6 `1 a1 B. E. D- d! u
1.单纯递减延时  w' q. k+ q$ F# N$ [4 d
2.利用void SysTick_Handler(void) 中断函数延时
/ k9 S5 H- I: P$ O/ N

- s4 p( U  {0 w俩种方法都涉及到一个函数,那就是SysTick 配置库函数 ,
  I5 [* a7 O. d) P& D
  1. __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)5 R4 x! b% c0 f: i
  2. {9 X) j6 `7 R4 z8 X7 K9 Y! v
  3. // 不可能的重装载值,超出范围  I) A" Z# s9 C) _
  4. if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)0 k4 k1 E/ |3 A$ t3 \
  5.   {: T5 C! S. \4 _, w  X/ t
  6.          return (1UL);
    0 s! m# ]' H  z6 H7 u: i
  7. }+ k( F7 o6 E3 H- |

  8. . b5 z7 h6 d* N  D& k# L0 R8 m2 b
  9. // 设置重装载寄存器) k/ F+ ?/ ~; S! d
  10. SysTick->LOAD = (uint32_t)(ticks - 1UL);
    ; {* }5 t2 s% i" I- I+ ?, b, _( e; W+ j

  11. 5 b, t9 J7 g; C' {+ o
  12. // 设置中断优先级
    + U5 Z, v- a6 [; R; ]  }8 Z
  13. NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);$ N& Q# _4 h$ u

  14. 5 {+ l/ H! z/ A5 Z0 `' }
  15. // 设置当前数值寄存器
    ' y5 h6 r& `4 f: Y1 Y" D+ H
  16. SysTick->VAL = 0UL;  T; O& p4 x; z; |$ f) v% l

  17. 3 N) v/ x0 D  Y$ {+ g/ Y& o) R
  18. // 设置系统定时器的时钟源为 AHBCLK=72M
    ) n: U) ?! ]5 [" |6 y! f' p
  19. // 使能系统定时器中断5 H5 j7 z8 m7 F3 Y
  20. // 使能定时器. u5 |/ x  Y" U1 N. k' u6 Q
  21. SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
    * L! G# D1 f+ ~, r/ y: l
  22. SysTick_CTRL_TICKINT_Msk |
    0 G: L. H4 l$ f) ^/ l
  23. SysTick_CTRL_ENABLE_Msk;
    ' r, Z2 w6 \" a9 A6 c# x. g
  24. return (0UL);0 W5 }- ?( O/ k9 h6 D
  25. }
    + y) S; G, W% e( ]
复制代码

- u% }5 ^/ f+ {其主要任务是装填计时器初始值、设置时钟源、设置中断源优先级。初始值不能超过2^24,时钟源一般为72M。
6 O. i1 ~& \% R0 z4 x/ [/ y3 _9 e( N
20190726212429892.png
8 X) q9 F) A/ t' E7 K3 H
9 c+ b4 u, D) B7 e1 Y1.单纯递减延时
9 ]- z/ B# H( j: f6 u, ~2 O毫秒级延时
7 G0 {+ y; \# B- b1 D
  1. void SysTick_Delay_ms(uint32_t ms)
    5 \5 r" E* P8 y/ c, y+ O
  2. {
    5 }  U! J) `' w2 T$ M
  3.         uint32_t  i;
    $ t5 e' C4 A( X$ O8 z
  4.         SysTick_Config(72000);  /* 设置初始值为72000 */
    1 ?9 n0 ~+ K" }. @! N' e; c
  5.         for(i=0;i<ms;i++)
    * N/ G4 b$ X0 j% K- \+ C% {
  6.         {
    5 f- B7 b, D  f+ D
  7.                 while(!((SysTick->CTRL) & (1<<16))) ;       /* 检测一次计时完成 */
    6 s# M: F% N4 E$ Y8 r1 p! {
  8.         }                - o, `3 f  W+ b! r+ K0 C
  9.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  /* 操作寄存器 */
    : |7 r3 K- W$ B1 O: i1 L) ~4 z
  10. }$ S9 R" A2 `! ]/ ^- w  H  g# x, L

  11. - ^8 q# F7 k0 v* \% V' k! R
复制代码
. |3 y  i" u9 }8 g( P: D2 C
2.利用void SysTick_Handler(void) 中断函数延时
2 y; Z% Q7 F; |8 Z毫秒级延时5 u3 ]+ q; |; o" w/ U
  1. volatile uint32_t isr_ms;
    5 q2 I7 s6 V6 f5 b
  2. void SysTick_Delay_ms_INT(uint32_t ms)' B+ E+ f3 a2 V3 U- F8 h" {
  3. {        
    4 q( B& ^/ n+ k8 S5 F
  4.         isr_ms = ms;' \' |$ p& w: _. q* W8 l) b  f
  5.         SysTick_Config(72000);- a( i( j3 {9 A7 q' w% j; @
  6.         9 g- `: @8 W* x: h, Y& @* w
  7.   while(isr_ms);  /* 在中断里递减 */
    ( p1 P" `. @8 g3 |/ @' C& V2 I
  8.         
    ) _  I& c6 Q. @7 O& `6 p4 Y
  9.         /* 失能systick */0 b* {9 }4 |  ~, z1 W& A! e# e
  10.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;) e2 W7 Y. `2 e, [
  11. }+ Z8 k4 t7 Z2 G( W7 f3 _
复制代码

2 g$ @/ G7 g2 y7 k: U+ K) O在stm32f10x_it.c中的代码如下:
! f1 g2 C0 `0 k, \# ?
  1. extern volatile uint32_t isr_ms;   /* 这个变量在bsp_systick.c里面定义 *// @; A; L3 W' B% {
  2. void SysTick_Handler(void)
    1 {' z% j! A, r: A6 h4 d& I( @' S
  3. {; E2 J9 d% n- y3 W% L( k
  4.         isr_ms--;9 i% E$ b8 @  _* B/ y4 d  C; k
  5. }
    6 Z1 h6 v% I" Z3 \, s% ^" T
复制代码

9 q: N& ^' N1 r0 A( H% L5 C' J————————————————. [% b- P; g& U
版权声明:Aspirant-GQ7 {( O/ c% Z' q  b( T
如有侵权请联系删除! |$ M; e9 \, S+ i6 R
赞 收藏 评论0 发布时间:2023-3-18 16:40

举报

0个回答

所属标签

相似技术帖

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