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

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

[复制链接]
STMCU小助手 发布时间:2022-5-3 22:39
一、SysTick使用详解' ~2 P* C* d. @5 l4 E
1. SysTick简介

0 j( y1 F) c7 ^* h: a) lSysTick是一个24bit的倒计数定时器,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都有一个SysTick定时器,从而获得一定的时间间隔。2 x: e5 |( Z5 h- P8 r; O9 H

! D( P/ Y9 e* @) _7 ]' ?- k2. SysTick相关寄存器
0 U5 e( [% K, }$ m" d状态寄存器-CTRL
  y/ O5 `- t: X# m% M3 kSTCLK外部时钟源:AHB总线时钟的 1/8
" x% N9 v9 c. V- [" N% P2 h# W; o, oFCLK 内部时钟:AHB总线时钟——STM32F103是72MHz% S; z: }7 }: q
( T/ N$ v% [0 p; P
W9~K}MPHQQJSLVFBDPWT3Q8.png
4 p( A3 g1 i' `" ^3 g7 e% Q
# O$ p. q, d5 h/ Y* ]重装载数值寄存器-LOAD
7 ]' y2 M* z2 m9 W3 m. ?. Z
; F5 L# w, [. g6 i1 Z! x/ Q
012NMW26[2_~_U1[O%($X[C.png
* d; D% e) k  x* l0 Z. J- u# F0 ?5 l5 u1 p; k# a1 N/ `! S# {0 N) u
当前值寄存器-VAL
% m# J, ]- g8 @4 @0 Z
5 o  r* o+ T$ O! W  T
]2C4LF`W9K[Z`O~I$_)3IOK.png : Y: A6 ~# U: a/ X' W- a+ a

( N4 Q( R- k* M/ m6 U" n# |8 c校准寄存器-CALIB
/ q" k7 P& P. S; _

0 l% Z8 G7 O% R 2CYM~SK%CO7WZQ814Q0O(HN.png
/ c3 u+ c% u1 D+ s* \: S* Z
+ G2 Y- `; x& f二、编写精准延时——delay

1 M2 k0 ?0 C3 s$ w) o' Y% Gdelay.h

$ n+ ^& ~% p7 T
  1. #ifndef __DELAY_H& d$ j/ @4 G4 w& [9 _; `
  2. #define __DELAY_H                            - Q. X; s& |/ L
  3. #include "stm32f10x.h"
    # o1 K8 ^8 e) F: o0 v

  4. : A: F4 ~, w5 Q# s5 ^2 R
  5. void delay_us(u16 us);, g$ V, x1 [4 s* E& h) _
  6. void delay_ms(u16 ms);1 o% z' ]4 \  U
  7. void delay_s(u16 s);) n" l3 ?' [0 K9 A9 T! ^
  8. 2 T1 L8 {6 g9 D8 u
  9. #endif
复制代码
1 W3 K( d4 M1 l$ V
delay.c
6 N0 |$ Y5 L2 G6 J
  1. #include "delay.h"9 K# x; R* I5 s3 y3 g! F2 f

  2. & `  g0 _$ \4 I  Q: w
  3. #define AHB_INPUT  72  //请按RCC中设置的AHB时钟频率填写到这里(单位MHz)9 ^0 }. r' o6 U. ]
  4. % G. {# t8 K, R; Y  b& j
  5. 2 q, A+ r. a  w6 ?5 @
  6. void delay_us(u16 us)        //uS微秒级延时程序(参考值即是延时数,72MHz时最大值233015)        * k( k9 W' A  O  ~: A6 O
  7. { + e; I8 c* H* P0 Y* }
  8.         u32 temp;8 F# D- V# x: e5 Z4 ]. P+ x
  9.         SysTick->LOAD=AHB_INPUT*us;              //重装计数初值(当主频是72MHz,72次为1微秒); [9 \' Z& {9 U7 W0 B) Z
  10.         SysTick->VAL=0x00;                                //清空定时器的计数器# V* [4 E, S; m1 ~# y3 v
  11.         SysTick->CTRL=0x00000005;                        //时钟源HCLK,打开定时器
    ' B* Y8 e7 ^; x9 H4 f5 `" }
  12.         do' Z& x: K; t! ]! ]
  13.         {
    - X$ j/ j8 a8 y1 W
  14.                 temp=SysTick->CTRL;
    2 W, L: x& s6 z8 A* E0 A
  15.         }: O1 Y* Q. ~* u* ?
  16.         while(temp&0x01&&!(temp&(1<<16)));                //等待时间到达  ( E7 u* Q6 _' w* d( w
  17.         SysTick->CTRL=0x00000004;                                //关闭定时器
    . G4 `4 w& Y+ j$ Z  e; V
  18.         SysTick->VAL=0x00;                                        //清空定时器的计数器! }4 Z- }" k, K5 O
  19. }
    2 G1 w/ l6 x/ |# M7 G
  20. , c$ l1 ~/ E: o% n  x! n
  21. void delay_ms(u16 ms)        //mS毫秒级延时程序(参考值即是延时数,最大值65535)
    ( O0 o& X8 P* f
  22. {                                      " `) {; I- {% w- l
  23.         while( ms-- != 0)$ u0 a$ t# B8 n$ _. R4 s' a: Q6 [5 X
  24.         {% C" q% z1 s. M0 ~$ L4 B
  25.                 delay_us(1000);        //调用1000微秒的延时
    & v5 q* Z  E% e
  26.         }5 @# U. m/ Z# e" X. j1 c, m
  27. }9 x- i& Z; ~# g" r$ a9 b* d- m

  28. - @2 y: h+ o9 Z( N1 T& d& s0 k! t
  29. void delay_s(u16 s)        //S秒级延时程序(参考值即是延时数,最大值65535)
    % _; l' {" Y0 l9 ]0 [9 W
  30. {                                      
    5 P, [5 @& H$ r6 g  K1 S; g1 g' Q
  31.         while( s-- != 0)
    ) y, B# G7 Y9 v
  32.         {
    6 Y# p5 t$ R+ t/ r: f4 w8 W2 z
  33.                 delay_ms(1000);        //调用1000毫秒的延时
    6 S* O. E0 y  ]' m3 v+ G
  34.         }0 i/ M# r5 d, L/ A
  35. }
复制代码

1 F0 ^: V3 p# b7 T# ?8 h! k' R) e7 i5 o8 W. F1 m
1 {" }( |$ G, w" K
赞 收藏 评论0 发布时间:2022-5-3 22:39

举报

0个回答

所属标签

相似技术帖

官网相关资源

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