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

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

[复制链接]
攻城狮Melo 发布时间:2023-3-18 16:40
SysTick是STM32中的系统定时器,利用SysTick可以实现精确的延时。  U: [5 l5 B: @/ l5 x; a
SysTick—系统定时器+ e, |4 ]$ D+ c; `0 r, |( u- Z
属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。
3 W4 w5 m$ V: \1 }

2 `' \+ j( x; X: D; I" u延时模式:# M: V1 H  I# S) U, w7 Q
SysTick的延时可以有俩种模式:+ C5 d& {0 w' \7 a. d- f+ W# R
1.单纯递减延时8 u" A+ Z- [0 y. n8 T/ `5 c
2.利用void SysTick_Handler(void) 中断函数延时* E. `/ ~( @$ X9 D( u

, l" B/ D: p7 l- d$ m俩种方法都涉及到一个函数,那就是SysTick 配置库函数 ,
8 S4 v  F: ~! L% S0 b
  1. __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks), @0 K# U+ G8 g# G
  2. {
    9 k6 _: y& ~  C$ [" @- q
  3. // 不可能的重装载值,超出范围
    % U; k) c& }6 W  T# @) y! N1 ?
  4. if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
      c3 }# k* a4 K
  5.   {/ _: H! t# p+ b: f* m' e/ n" v
  6.          return (1UL);
    , d$ \6 t) G! s5 r. _  X
  7. }
    ' R# p% `* z+ F! \& P9 I) h: k
  8. + _, E0 Z- f! H7 w# n9 n# t+ |; B
  9. // 设置重装载寄存器3 x2 ], G# i; s$ z1 w
  10. SysTick->LOAD = (uint32_t)(ticks - 1UL);( Z3 Q" E3 H2 M3 _$ c
  11. , A0 M8 c$ `3 q  H, Y( a
  12. // 设置中断优先级
    ; }9 G3 Q+ ]- H  H1 R
  13. NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);
    - q8 M; l: a/ A$ Q* J8 D
  14. 5 z5 K% u% y2 G+ ?; B! F; G
  15. // 设置当前数值寄存器0 H/ Z4 r  d/ q9 c
  16. SysTick->VAL = 0UL;4 @! y0 K" Y3 u1 R# b; d  y7 b* U$ Z
  17. 3 S: P) \. y& u. B& v
  18. // 设置系统定时器的时钟源为 AHBCLK=72M
    - p/ ~  K2 U+ U; n
  19. // 使能系统定时器中断
    8 d: J# Z( e9 a+ W9 b: s
  20. // 使能定时器
    5 M$ J+ Q7 w' K( k3 g% Z
  21. SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |" g  h* s' C1 x. p5 C( y
  22. SysTick_CTRL_TICKINT_Msk |
    2 u9 p3 g8 v4 `4 s  S$ `# k
  23. SysTick_CTRL_ENABLE_Msk;
    + L, Z" E, k  m1 f; o
  24. return (0UL);
    6 [& I4 A! `$ E% ~8 M7 ?
  25. }
    # l; @# g5 N6 o% s$ ?
复制代码

. p. K& G( _4 q其主要任务是装填计时器初始值、设置时钟源、设置中断源优先级。初始值不能超过2^24,时钟源一般为72M。
# u6 Q, \9 N! s/ \7 k" K
! Y' r3 \/ q4 g. M( ]
20190726212429892.png 9 R5 b9 C1 _' q, [# B

( g% A1 c: _1 ^1.单纯递减延时$ j. s% N0 r8 s- G$ W9 P* q  K
毫秒级延时
4 T6 |: M: ^4 y
  1. void SysTick_Delay_ms(uint32_t ms)2 T: K, J0 g+ }, n; j
  2. {2 p% w! f! [9 ?$ E2 l) K- R
  3.         uint32_t  i;
    & m5 M9 W* S6 r8 u5 x- p# q
  4.         SysTick_Config(72000);  /* 设置初始值为72000 */* A6 `! u$ O7 E) X
  5.         for(i=0;i<ms;i++)" |5 ?7 g, E5 f. ^- c4 C( I% h; y
  6.         {& C: q) |/ `9 H5 J) V. {1 ]
  7.                 while(!((SysTick->CTRL) & (1<<16))) ;       /* 检测一次计时完成 */
    ' O$ X0 K  P, Q  U
  8.         }               
    0 j1 N- G) e; L( Q" m; V
  9.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  /* 操作寄存器 */4 @( z  o0 d" o+ d" h' W( M6 {, }
  10. }& N% e, L) A0 `8 Y' ]4 t

  11. 6 g" o7 P$ e$ L( ^) S# v' ?
复制代码

- j# j4 B$ }# n3 S% w/ P* `2.利用void SysTick_Handler(void) 中断函数延时2 Z$ S6 O# N- R. p- |5 @
毫秒级延时" }0 \& a+ u: ~
  1. volatile uint32_t isr_ms;
    ' a. S0 H) q6 m8 }
  2. void SysTick_Delay_ms_INT(uint32_t ms): z, K! E) S& F( k7 v3 b
  3. {        
    # _6 U3 U! W: H1 o0 J+ H
  4.         isr_ms = ms;
    ' h* b! h( R/ _" h! a. \
  5.         SysTick_Config(72000);7 d& ]% I$ S: }( ~
  6.         
    + E9 C; D2 Y4 @4 f
  7.   while(isr_ms);  /* 在中断里递减 */
    ' j( h+ L- H  {* Q: W+ `+ l
  8.         
    0 g1 k$ X3 x# E! Q
  9.         /* 失能systick */1 q, x. G, b% Y) G  {0 H
  10.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;$ X3 G. C+ p* U9 t/ {0 p, Z) `0 N
  11. }' E6 `7 B; |  A' v, `) W3 u2 Q
复制代码

0 c1 ~# S: s' H. d% `* y在stm32f10x_it.c中的代码如下:6 M  y: T' P  e6 ?
  1. extern volatile uint32_t isr_ms;   /* 这个变量在bsp_systick.c里面定义 */
    ; F3 m0 q6 ^$ X
  2. void SysTick_Handler(void)
    % ?) O) o5 U, _0 h$ H( z/ j( {
  3. {! K, R) q, {6 q$ F3 Q
  4.         isr_ms--;8 f: G% T' o# M6 u7 x
  5. }& C0 e7 q1 d3 O5 R" u- Q& M3 @
复制代码
# w& _& B0 ]! o3 x! e  q
————————————————  k6 q- s* ]' o4 x2 q
版权声明:Aspirant-GQ8 a  B/ f% V) i8 X& ^
如有侵权请联系删除' J( c( q+ ]& H- P+ ]$ p
收藏 评论0 发布时间:2023-3-18 16:40

举报

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