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

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

[复制链接]
攻城狮Melo 发布时间:2023-3-18 16:40
SysTick是STM32中的系统定时器,利用SysTick可以实现精确的延时。  v4 d. u) M# D5 z/ E5 S
SysTick—系统定时器2 a- f4 D. W" f! p7 R% c' K6 L
属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。
5 W$ R+ E, ?) K, o: }
  A2 w/ X1 |  c- U. F  y' L5 J1 {
延时模式:3 R5 H* ?0 X/ u1 X* y2 v
SysTick的延时可以有俩种模式:! r0 B4 F7 ]1 V8 t) A: h5 l- P
1.单纯递减延时1 J# ?9 k6 O7 X2 _+ \. ?
2.利用void SysTick_Handler(void) 中断函数延时: w) [4 \5 W  l9 x) `" a; @1 A5 }
* i! W( O5 ~9 [- i" s! n" \) Q3 T8 `
俩种方法都涉及到一个函数,那就是SysTick 配置库函数 ,& l# [5 z% Z0 x4 V* m6 S
  1. __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
    # @+ K5 D" y( h' w+ U8 k
  2. {) S9 j6 F1 c5 ^4 J
  3. // 不可能的重装载值,超出范围
    4 R/ \& f3 w5 |3 X/ ~$ d' Y4 S
  4. if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)% G! {- L' N2 q- ^0 ?6 g- C' s
  5.   {
    ) E: P& X% g& \+ l6 k
  6.          return (1UL);
    7 G) U2 q- y; T6 T  `$ b
  7. }
    $ X3 F+ `% z; N9 w

  8. % ]: j/ j/ Q& @1 W9 F0 u3 J
  9. // 设置重装载寄存器
    6 R3 X: r* [( n; ?8 J
  10. SysTick->LOAD = (uint32_t)(ticks - 1UL);2 P6 q3 p9 k' l- b4 m: M
  11.   ?; b3 e9 S; A4 a; m5 n4 n6 K# ?
  12. // 设置中断优先级! P! |# `  ^0 H) F. {( u/ m
  13. NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);/ B& {3 s( m3 m$ F

  14. 4 S8 ?# Q) w- c) S+ d
  15. // 设置当前数值寄存器2 w/ r1 t0 Q: y4 M
  16. SysTick->VAL = 0UL;( c4 d" b+ Z3 a) H( y" p  D* u1 V; U
  17. & L& T, R) f" Q) L( }
  18. // 设置系统定时器的时钟源为 AHBCLK=72M
    0 m) H) u# X+ K  T
  19. // 使能系统定时器中断0 F! z8 ]5 C% v$ ?
  20. // 使能定时器# c# J) }& K5 `8 c0 o: }
  21. SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
    ; t4 j0 P7 p- }7 T% M
  22. SysTick_CTRL_TICKINT_Msk |
    7 `0 M1 w( Y6 R% }  C, B+ |
  23. SysTick_CTRL_ENABLE_Msk;' O' s0 z. ~; r- u# B
  24. return (0UL);
    & `; \( \9 v/ q5 f& U% _
  25. }% _' J* j% G- e7 f  E. K. g' p7 c
复制代码
1 H- I; L( ?$ v% V  L- Q
其主要任务是装填计时器初始值、设置时钟源、设置中断源优先级。初始值不能超过2^24,时钟源一般为72M。
1 q5 d/ _0 w4 k0 M
* O* f- d( ]" D' P' q
20190726212429892.png , @( P) I$ M; t! P& D0 _. }; F
, w0 q3 U$ m) G+ K9 e" g! G: i
1.单纯递减延时
" {4 D- W! {# X, c9 ?( e毫秒级延时
2 V( i9 A, ?- `
  1. void SysTick_Delay_ms(uint32_t ms)
    " K2 {$ S; I9 u) \/ K$ |& C6 R7 c
  2. {
    3 D+ Z$ @5 M8 f( V7 `" n  a
  3.         uint32_t  i;
    , `& ?& K' D4 a
  4.         SysTick_Config(72000);  /* 设置初始值为72000 */
    & \( T, B  |3 O' T
  5.         for(i=0;i<ms;i++)" e# K: W( ^2 A. W8 l! o, m# v$ [
  6.         {
    , U2 o/ `0 S5 w2 i
  7.                 while(!((SysTick->CTRL) & (1<<16))) ;       /* 检测一次计时完成 */
    9 M! c: X2 c4 ~8 P
  8.         }                & Y: k+ a- E% l+ p
  9.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  /* 操作寄存器 */) N  J8 j! L* u2 V; q" K& g+ W) M
  10. }
    8 W5 p- c; Q3 Y9 j$ q

  11. 7 X; o' J: C0 P. F7 |0 A$ K. A
复制代码

) M( s$ M9 u* j2.利用void SysTick_Handler(void) 中断函数延时
' y2 U7 s  ^! K: _8 J! k毫秒级延时, u+ M9 }3 u( {* c, ~) B
  1. volatile uint32_t isr_ms;
    ' G( N3 T6 n' b' A4 t) T8 [# C6 `6 C
  2. void SysTick_Delay_ms_INT(uint32_t ms)
    5 D5 M3 o6 t$ L( {: s$ z
  3. {        1 t- E6 a& Q5 v% r! y$ h
  4.         isr_ms = ms;4 u  R; f: V  J3 B
  5.         SysTick_Config(72000);1 \5 _2 k: w8 O* Q; @: t6 m! r$ D* g
  6.         * j# j) i2 N+ z7 E3 q3 }! O
  7.   while(isr_ms);  /* 在中断里递减 */- M( Z6 F; N) s, Y; U2 }, _
  8.         
    ) P" W; \3 G3 j$ T( m
  9.         /* 失能systick */
      i. d3 ]  u3 _: F4 V$ c# D' U
  10.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
    5 R% l1 I# A& @; j3 f3 v+ r4 J
  11. }4 I" }) J2 n7 z% f
复制代码
7 r  c; z, ^* q$ p# I* g+ B5 E0 r& H
在stm32f10x_it.c中的代码如下:
7 K4 R& e! l6 T+ c
  1. extern volatile uint32_t isr_ms;   /* 这个变量在bsp_systick.c里面定义 */6 h* E1 n1 X/ P6 C
  2. void SysTick_Handler(void)
    2 a# t5 @+ I; B
  3. {) S' [6 b- R7 D
  4.         isr_ms--;' y0 h/ v* J+ t; r2 N" l( y
  5. }" d3 ?7 {3 R$ z. H7 N; }
复制代码

2 W. Z/ N$ J4 Z. U7 o* }% v————————————————
) W9 m6 U' O7 ^版权声明:Aspirant-GQ. H- p" \" l, y" g; l* u$ k& `1 }
如有侵权请联系删除; V9 K; [9 W0 |0 T; D1 ?
收藏 评论0 发布时间:2023-3-18 16:40

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版