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

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

[复制链接]
攻城狮Melo 发布时间:2023-3-18 16:40
SysTick是STM32中的系统定时器,利用SysTick可以实现精确的延时。
8 o: H% L5 J# ~( a' m  aSysTick—系统定时器
& I7 y! a) z/ e7 _9 O1 C属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。
; V- b3 \# }: U& g

+ `3 U5 k- P! n5 U延时模式:
/ e* z- F2 n; M  j* h7 uSysTick的延时可以有俩种模式:
1 a+ q  H" K0 I4 c/ u1.单纯递减延时( n- W5 n& ]( S+ P$ i
2.利用void SysTick_Handler(void) 中断函数延时
+ ?0 r5 q# k2 b; c; k0 X9 x: M: \
* y' l8 t. b) G  Z6 T0 p7 N: A6 `
俩种方法都涉及到一个函数,那就是SysTick 配置库函数 ,
# j2 G8 F- Z- n( I5 R
  1. __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
      }( b: x- k+ ?4 Y) ^- Z: i1 M
  2. {  a3 @' _: U. X/ b1 y
  3. // 不可能的重装载值,超出范围
    1 `1 g! ^/ B5 j$ g6 o, N' W
  4. if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)7 I$ Z! W2 F, w- v' G
  5.   {4 q+ ]9 L: E# W$ ?/ V
  6.          return (1UL);
    ! L2 n$ G" d/ o. U' ^* z; O
  7. }
    8 A% U( g6 v/ F3 T- |. h
  8. $ w4 C3 o3 j" C& V
  9. // 设置重装载寄存器& f/ C! c" R! U( ~" H; U
  10. SysTick->LOAD = (uint32_t)(ticks - 1UL);* m! n' i6 Y1 U+ Q

  11. - O8 |/ H9 x2 E
  12. // 设置中断优先级
    # t. I) `* w+ }  u
  13. NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);- h: \7 m( s$ M1 R. Y! y. q; F
  14. 6 F  Z! Y/ H0 B9 ?/ @9 s
  15. // 设置当前数值寄存器- N" v' \% B6 ]  v" y6 c
  16. SysTick->VAL = 0UL;: O- U& G; a$ S# l
  17. ' l; O" `# A8 O
  18. // 设置系统定时器的时钟源为 AHBCLK=72M
    9 X0 [" c! i. x2 u
  19. // 使能系统定时器中断
    7 i2 a8 V% N" ?) h' I2 P6 f
  20. // 使能定时器
    ; n/ t( P9 y* t- I) r" K
  21. SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |1 o3 K7 v- A4 X) z
  22. SysTick_CTRL_TICKINT_Msk |3 h+ p& |, S4 q: I' F1 E. {9 w
  23. SysTick_CTRL_ENABLE_Msk;
    8 l" q. c" C8 ?, H7 |$ T# a
  24. return (0UL);! o: D+ z4 a; j1 x8 T  M1 r
  25. }+ R5 ^; n! P# W3 R
复制代码
8 u4 M+ k( Y2 I7 h8 ]$ n. `. y4 I
其主要任务是装填计时器初始值、设置时钟源、设置中断源优先级。初始值不能超过2^24,时钟源一般为72M。
  K0 x, @1 H/ B! W  N) G4 p+ u& t* X/ O4 ]& w; v& \4 y* ~: c+ p; V$ v
20190726212429892.png ' ?; n+ S# A: O: t- Y: m, I) |' M( Z

7 V+ N  ~$ {6 }0 n1.单纯递减延时
% I) I9 y6 ^) u毫秒级延时
* T1 l4 K& d8 ?7 U- O+ O% `; ^
  1. void SysTick_Delay_ms(uint32_t ms)" I2 |. q2 q2 A4 G- h
  2. {( M$ }8 u+ j( D$ }7 l5 F  ^
  3.         uint32_t  i;8 p  I2 a9 f5 ^9 ]. T/ z
  4.         SysTick_Config(72000);  /* 设置初始值为72000 */
    : D: D, }& I& c, I
  5.         for(i=0;i<ms;i++)0 E+ k, p1 u( o! ^2 T
  6.         {' }7 G6 O* T+ v$ f6 d! l
  7.                 while(!((SysTick->CTRL) & (1<<16))) ;       /* 检测一次计时完成 */9 e1 S; j7 Q, {% Z0 u" n! f7 I
  8.         }                ; l  K5 k8 j  c1 I
  9.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  /* 操作寄存器 */
    9 [# Q' x3 Y& M. n7 j
  10. }
    9 ]$ F+ }) l9 T3 L# @

  11. 6 t& l; t  p+ S2 O( I
复制代码

. Q8 w/ R* h) n5 c# }2.利用void SysTick_Handler(void) 中断函数延时
0 {  A6 f1 t1 {2 x& J. H. s. R毫秒级延时
9 X8 l& Z% N- f$ ~( N6 A
  1. volatile uint32_t isr_ms;
    + ?* m2 F5 q3 [
  2. void SysTick_Delay_ms_INT(uint32_t ms)
    0 c: n9 O9 S; }6 G. L4 a3 K
  3. {        4 P2 K# P1 d# Z# L+ _
  4.         isr_ms = ms;
    : O' C" [2 t* W$ j
  5.         SysTick_Config(72000);
    2 J& a7 L8 v- `$ G& h
  6.         
    6 ^% w  u4 ]* O# L9 u2 `5 t/ {
  7.   while(isr_ms);  /* 在中断里递减 *// f$ f9 k5 G$ l5 P' ^/ E0 [
  8.         + a) c" z& r! b$ p9 e+ j" G8 W
  9.         /* 失能systick */' k6 N0 S# {' i! p+ \
  10.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;6 s5 K# W: A- G+ C2 R. N
  11. }7 O! E, N9 g  \+ p" n0 [: P
复制代码

6 l9 H0 O, v  X* E( ]3 X' {在stm32f10x_it.c中的代码如下:  D, |! C1 L' T3 ]/ \$ i: N3 S. i
  1. extern volatile uint32_t isr_ms;   /* 这个变量在bsp_systick.c里面定义 */
    ! d. S* k& f3 h) K2 [; M2 y
  2. void SysTick_Handler(void)
    ) ]; N. U( L$ B( C* H8 \: c0 U: i
  3. {( x! q9 d( z5 N+ q8 J- y
  4.         isr_ms--;9 _3 \, ?) ?( {, O& h
  5. }
    + [* N2 |& M" K; {8 h- J+ y
复制代码
8 I! P3 n! P* q# x7 x3 h
————————————————: `, j& w+ u% w* T/ e/ [* `% _& [
版权声明:Aspirant-GQ
$ p( H1 N" ^& ]/ y) w9 `如有侵权请联系删除, W+ v0 @. T0 e
收藏 评论0 发布时间:2023-3-18 16:40

举报

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