jezc2zqhdam64087477451.png
1 f( L7 h# @8 v9 }
一、概述:8 p: f, b! Y) c) v% F" ?
SysTick是一个简单的递减24位计数器。如果你不需要再应用程序中嵌入操作系统,SysTick可以作为简单的延时和产生周期性的中断。8 y* u2 y$ n8 _; M( v% z6 I; o
状态控制寄存器的第0位可以使能计数器,当前值寄存器随着时钟一直递减,当他减到0的时候,重装载寄存器就会重新装载这只的值,计数器继续从这个值递减。
+ W$ g' }! J; Q7 Y3 i, z8 I! r) `4 E! G0 a/ c; t
二、相关寄存器:- f. \ g+ ~8 C! E, {" {1 y( D; {* i8 f
2.1 SysTick->CTRL 状态和控制寄存器6 `1 Z- R- U3 O$ o* g' C$ x
x2qizm24dlf64087477551.jpg
s: C* L7 ^/ O( b# v5 O ~* q位16:当前值寄存器递减到0,位16置1! h! ^1 h! u; A
位2:时钟源选择位,0:使用外部参考时钟;1:使用内核时钟2 R- j5 w" s! w0 J
位1:使能SysTick中断,当前值寄存器递减到0时产生中断
`5 @# }, h8 \$ r位0:SysTick时钟使能: E i* C6 q2 D/ Q- t& \% f
/ V. `2 p" @" ^) L% |2.2 SysTick->LOAD 重装载值寄存器! ]# }# X$ Z+ i" ~1 o
grm4u0leh2i64087477651.jpg
; V8 ^0 U$ D4 b当前值寄存器为0时,自动将重装载值重装到当前值计数器,重装载值的大小需要自己设置。
6 b4 ^( A5 D% x9 f! F$ M; T0 T, U# f/ l4 p/ R' S5 Y1 r
2.3 SysTick->VAL当前值寄存器5 c6 d! K4 H i0 \1 a7 s% i7 @7 g
dny1cmupsod64087477751.jpg
; I: e5 P6 W; l/ [: c2 {9 n可读可写,当计数器使能时,这个寄存器的值开始递减,使用前后注意清零。
7 m+ l6 k7 H0 o/ ^) c三、SysTick逻辑图
; q! O; p% p& p! K. g- |1 Y0 A
s5mhciy0q0q64087477852.jpg
8 B! F. g# I; O; }, w% X4 h- U
- ^( [9 R8 P( |) ?' h5 `- [- L3 \: k, N" j* L
ac1lhydkktk64087477952.jpg
, y h) o. B- U( c) N6 F( c5 Z8 i6 i; j; [
四、时钟频率与延时' i7 |) Q2 H" s# w; }) m
4.1时钟选择采用参考8分频的参考时钟比较准,所以此处SysTick计数器选择21M的时钟。
: c! B' X C8 V. K/ ?
ey4fcd0ove064087478052.jpg
8 X0 M" B4 W" S0 N& C% U" \
4 B+ w4 n; I# ]4 Q. a4 E+ ~. G5 @
4.2 如何延时1us时钟频率为21M,也就是1s的时间技术21M次。由此可知计数一次用了 (1/21000000)s ,用了(1/21000)ms, 用了(1/21) us,所以,1us计数21次。
. m5 p: V. i) K: F' C$ _9 @4.3 如何延时1ms因为1ms = 1000us,所以综上所述,1ms计数1000*21次计数,1ms也就是21000次计数
/ A, {0 p4 }0 ^3 y8 s) ]# E4.4最大延时24位计数器能保存的最大值 : 16777215。最大延时时间=16777215 /21=798915us=798.915ms
) L* C' ?. \' h2 D* B# a5 n# w9 ~, g: ?: E
五、示例代码( t( J! e/ m; x& \
#include "delay.h" w3 @; V. X% ?
#define Value_us 21#define Value_ms 21000
5 y D& `* q& b5 g' t4 zvoid delay_init(void){ SysTick->CTRL &= (1 2); //控制寄存器位2置0,选择8分频时钟 SysTick->CTRL &= ~(1 0); //关闭计数器}void delay_us(u32 num){ SysTick->LOAD = num * Value_us; SysTick->VAL = 0; SysTick->CTRL |= (1 0); //使能计数器 while (!(SysTick->CTRL & 116)); //判断是否计数完毕 SysTick->VAL = 0; SysTick->CTRL &= ~(1 0); //关闭计数器 }void delay_ms(u32 num){ SysTick->LOAD = num * Value_ms; SysTick->VAL = 0; SysTick->CTRL |= (1 0); //使能计数器 while (!(SysTick->CTRL & 116)); SysTick->VAL = 0; SysTick->CTRL &= ~(1 0); //关闭计数器 }' I9 j' M& ]6 g* m
==========
+ N: e$ z! g; y! R9 G% x6 q c7 H* d往期回顾:解决printf无法打印输出的问题
& Q# R! p0 o2 y7 r) _0 H, ]SHT3x-DIS驱动及应用详解
$ ]4 G% x( u8 i两步判断一款U盘读写性能
' {$ [. b3 G) b" o( X示波器最重要的三个参数4 p, r+ `0 t% H& U
全攻略自制esp8266 WIFI智能排插教程
$ o0 u! e! p8 p1 z( B7 G==========原文:点击阅读原文
: k$ r/ h8 f9 t9 }7 R8 a* I作者:UID:170498平台:51黑电子网1 s3 H" ~) N1 d
eymisw3qge164087478152.png
) }# S" i# P9 H5 M& q& W$ n
5w5ocrgvdwr64087478252.png
. G4 T+ q7 I' q j, G1 t: V
ihwehrw1e3d64087478352.png
|