电子产业一站式赋能平台

PCB联盟网

搜索
查看: 395|回复: 0
收起左侧

个人对STM32 SysTick的总结(寄存器操作)

[复制链接]

395

主题

395

帖子

2304

积分

三级会员

Rank: 3Rank: 3

积分
2304
发表于 2024-1-5 21:00:00 | 显示全部楼层 |阅读模式

jezc2zqhdam64087477451.png

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

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

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

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

s5mhciy0q0q64087477852.jpg
8 B! F. g# I; O; }, w% X4 h- U

- ^( [9 R8 P( |) ?' h5 `- [- L3 \: k, N" j* L

ac1lhydkktk64087477952.jpg

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

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

    eymisw3qge164087478152.png

    ) }# S" i# P9 H5 M& q& W$ n

    5w5ocrgvdwr64087478252.png

    5w5ocrgvdwr64087478252.png
    . G4 T+ q7 I' q  j, G1 t: V

    ihwehrw1e3d64087478352.png

    ihwehrw1e3d64087478352.png
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表