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

【经验分享】STM32F103:精准延时delay——SysTick使用

[复制链接]
STMCU小助手 发布时间:2022-5-3 22:39
一、SysTick使用详解* p- j5 w; a0 G$ {. q& J6 u% z! j4 x
1. SysTick简介
) b, D9 ^! c" K) {8 u( S3 A2 }+ J
SysTick是一个24bit的倒计数定时器,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都有一个SysTick定时器,从而获得一定的时间间隔。5 D7 f* k/ H9 o: \5 Q' w- y3 v

% A: c& l" [: l+ z2. SysTick相关寄存器
5 W5 M) C0 J+ G, P7 I状态寄存器-CTRL+ G, t: g# I) i
STCLK外部时钟源:AHB总线时钟的 1/8
8 d3 a  _/ f' x) d2 C6 p: ZFCLK 内部时钟:AHB总线时钟——STM32F103是72MHz* J% \$ A! z2 T% I* }8 f7 G. z
0 [5 E* C' h+ U9 \  M3 l. G
W9~K}MPHQQJSLVFBDPWT3Q8.png
3 q) R/ B  X  ~; k0 D7 l+ M* y; ]) x; A. [0 V2 \5 U
重装载数值寄存器-LOAD
9 Z$ T0 P3 D2 O' D; v# W
- w# ^  ~7 [1 c6 X& {7 F( l' F
012NMW26[2_~_U1[O%($X[C.png . y+ F8 O' _# I

' P, r/ |3 K( ?" o  F! M当前值寄存器-VAL/ ~0 T5 [' `, X( h# ~* B

( D6 P4 R0 {9 P# B0 D  B
]2C4LF`W9K[Z`O~I$_)3IOK.png
3 C3 {9 m5 x2 L: A; p% r) h# L. J. ~' V
校准寄存器-CALIB

$ h! j3 @  m3 d+ g& A% L8 i# `6 h# b( C# x* h
2CYM~SK%CO7WZQ814Q0O(HN.png 5 m8 J, Q- Q" M3 q
. p! l; F& E7 q% T. c; w* G
二、编写精准延时——delay
; L7 Y9 q1 B8 Y! ^" q
delay.h

1 V/ j6 f% s; r( |- W# Q( K
  1. #ifndef __DELAY_H/ S. c' m1 i' }- k
  2. #define __DELAY_H                           
    - L+ s) o+ G' O2 w, @: B
  3. #include "stm32f10x.h"
    6 L& S- \0 K( e
  4. 2 C: c; i) E+ w
  5. void delay_us(u16 us);. \  [% s/ m5 b. y# A
  6. void delay_ms(u16 ms);( A. _1 ^1 o0 E1 f/ W( \9 d8 U
  7. void delay_s(u16 s);. O6 q% Y/ ~) K2 ^, h
  8. 1 K* |% M4 T) b( U9 {$ F
  9. #endif
复制代码

7 ~  ^. U" d' j, K7 M* Cdelay.c
$ N: j: D3 Y' X: N( G
  1. #include "delay.h"
    - }- G8 D1 q& c/ }. m$ D0 l  X

  2. & c1 k  W6 d8 K+ f7 C( a) o+ ]
  3. #define AHB_INPUT  72  //请按RCC中设置的AHB时钟频率填写到这里(单位MHz)
    6 ~9 y8 `% N9 e  G# z" m

  4. ) N3 v: Q0 C" B+ }4 `6 `" c
  5. ) q6 T% C+ j: B7 j4 a
  6. void delay_us(u16 us)        //uS微秒级延时程序(参考值即是延时数,72MHz时最大值233015)        
    . V$ r. [: x  R% I! x
  7. { 8 G" o+ m, x, M* H3 N3 q' N" w6 o3 q
  8.         u32 temp;
    . H) P. }1 x+ S( ?4 s- r
  9.         SysTick->LOAD=AHB_INPUT*us;              //重装计数初值(当主频是72MHz,72次为1微秒)
    ! ?+ y8 Y$ k/ s9 R
  10.         SysTick->VAL=0x00;                                //清空定时器的计数器
    ' E4 U5 H" U2 n, |- s
  11.         SysTick->CTRL=0x00000005;                        //时钟源HCLK,打开定时器
    ; ?7 ^. L' q( o8 w: t
  12.         do. T8 }- j% I6 [$ g5 M  ~
  13.         {% R6 c% x" \$ M
  14.                 temp=SysTick->CTRL;+ Y% Z4 W$ j: K
  15.         }
    ( U3 o! e, b8 c; I1 {9 Q
  16.         while(temp&0x01&&!(temp&(1<<16)));                //等待时间到达  
    / B- C1 @  ?! r- H7 u/ ]! B
  17.         SysTick->CTRL=0x00000004;                                //关闭定时器! \; v( D2 n) n6 D
  18.         SysTick->VAL=0x00;                                        //清空定时器的计数器9 B: _+ D, I  R( \
  19. }
    " s' [. d# x' |/ M; u& r, |2 P! D
  20. 6 l: k) c, ^/ y/ x+ p
  21. void delay_ms(u16 ms)        //mS毫秒级延时程序(参考值即是延时数,最大值65535)
    " X* E% T! ]6 V& d" s: p" K
  22. {                                      
    ) E2 @$ d, P* ]) \) W
  23.         while( ms-- != 0)
      m+ q: x5 j( N+ z8 @% a- A, L3 D  m2 p0 B
  24.         {6 Q' T3 j8 {! F8 n7 G, x$ g
  25.                 delay_us(1000);        //调用1000微秒的延时" ~' G. q# e( S( X
  26.         }
    6 m8 H5 n; b. T+ a! j: p; C# E
  27. }; g5 ^% ~0 w5 W: N/ |
  28. 9 Q5 O! b5 H$ t6 {
  29. void delay_s(u16 s)        //S秒级延时程序(参考值即是延时数,最大值65535): j8 g  R3 B1 e- R
  30. {                                      & U& _) j* b; h, H! i. Z# p
  31.         while( s-- != 0)% R' t: @* b* I0 ^- Z* A- {
  32.         {. @& T! G9 b/ n" U
  33.                 delay_ms(1000);        //调用1000毫秒的延时
    8 ^+ ~4 Z. y+ M! u5 ]
  34.         }
    0 X$ d  y( q" C' c& I/ L( G8 Y! M; w. t
  35. }
复制代码
' W* n+ s1 w) U

" o7 f8 b* o1 ^( N& v8 d8 {& R+ g$ B
收藏 评论0 发布时间:2022-5-3 22:39

举报

0个回答

所属标签

相似分享

官网相关资源

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