STM32学习笔记04—SysTick时钟 0 Q3 K6 ?3 c* `% c, E1 g 4.1 SysTick概述& B; X# P4 b( n' H$ p Cortex-M3内核的处理器,内部包含了一个SysTick定时器,SysTick是一个24位的倒计数定时器,当计数到0时,将从ReLoad寄存器中自动重装载定时初值,开始新一轮计数。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。3 n4 J' t. m, J5 m% P; @ SysTick定时器能产生中断,CM3为它专门开出一个异常类型,并且在向量表中有它的一席之地。它使操作系统和其它系统软件在CM3器件间的移植变得简单多了,因为在所有CM3产品间对其处理都是相同的。 我们在程序中使用SysTick时钟来作为延时函数,这样就不会占用定时器资源,SysTick时钟是一个直接挂载在AHB总线上的一个定时器,输入的时钟频率直接就是AHB总线上的时钟频率,使用SysTick定时器进行延时,可以精确的设置延时时间,与之前51单片机的for循环累加的精度是完全不一样的。 5 L' w, y& n6 N( q- e/ Z9 F1 A' y 7 I7 V& ^+ {- u! R* f. P2 o9 a. z 4.2 相关寄存器: P7 f6 ~+ u* u 4.2.1 控制及状态寄存器CTRL7 g+ ^! G" E# j0 l K J Bit 16:计数状态(只读): L r5 [( @' w6 k% z2 R* d 0:该位数据已经被读走: z7 W* @% I8 r; x7 `1 a 1:上次读取到该位的数据后,计数值达到了05 n9 m2 [% k3 t0 c# ~* N* F, z3 c+ { t Bit 2:时钟源选择 0:外部时钟源 1:内核时钟- q2 x3 `0 c6 D# G3 C Bit 1:中断标志位 0:计数到0不产生中断 1:计数到0产生SysTick中断* V. O/ b& H: ]/ M Bit 0:定时器使能位- S6 [. V0 m' e 0:关闭定时器 1:开启定时器: U. c$ }* v/ s" x g- C 3 y+ A9 ^0 T$ `3 [1 ?9 { 4.2.2 重装载数值寄存器LOAD ReLoad[23:0]:当计数到0后,该寄存器的数据自动更新到VAL中。. [! B( V/ {) ? - I7 j- k- j+ K' K9 k! g 4.2.3 当前数值寄存器VAL VAL[23:0]:读取时返回当前倒计数的值,写它:清零,同时还会清除在SysTick控制及状态寄存器中的flag标志。1 c' n) e% i& v5 K+ x 4.2.4 校准值寄存器CALIB Bit 31:外部参考时钟可用标志: O3 Y, ]7 t% u" N) v 0:外部参考时钟可用 1:外部参考时钟不可用4 S' A0 K$ B3 { + d5 ]* l) l) ]& s Bit 30:校准值10ms标志 0:校准是准确的10ms 1:校准不是准确的10ms# S% ^( U$ l2 u+ R6 C- H ) ?6 e. M3 H6 _( b( ~ Bit 23~Bit 0:10ms的时间内倒计数的格数。若该值读回零,则表示无法使用校准功能 & v9 I/ M% T; D8 ~. \2 a2 C4 p . l" l4 P+ M4 J6 l3 A, N+ e5 F 4.3 SysTick驱动函数 4.3.1 创建目录 (1)在SYSTEM目录下创建delay文件夹,并创建delay.c和delay.h文件。如下图所示。 (2)将delay.c添加进工程,delay.h添加进程序。1 o' l, f) D2 h (3)在delay.h文件中输入如下内容。 (4)底层寄存器文件添加寄存器组 (5)底层寄存器文件添加基础地址 4.3.2 初始化; x6 x: g L5 ?: X4 B4 m7 F! o; L/ u+ z 这里首先选择外部时钟源,由于系统时钟72MHz,并且SYSTICK时钟固定位系统时钟的1/8,所以1us的计数脉冲实际是72/8,也就是9个脉冲才是1us,这个1us的脉冲数就是基础时钟。% s! l' z3 U2 N0 Q6 m. i! v 4.3.3 us级别延时函数) T2 C4 U2 X7 ^& ?. f B( `8 m $ p. Y- R% F0 E, e- x 4.3.4 ms级别延时函数 上一篇:- J c+ @7 i7 U5 m m9 W STM32学习笔记03—中断架构 $ E1 r' j/ t4 q" y |