|
STM32学习笔记04—SysTick时钟 * ?3 m& e, d, U0 a7 H) W 4.1 SysTick概述 Cortex-M3内核的处理器,内部包含了一个SysTick定时器,SysTick是一个24位的倒计数定时器,当计数到0时,将从ReLoad寄存器中自动重装载定时初值,开始新一轮计数。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。 SysTick定时器能产生中断,CM3为它专门开出一个异常类型,并且在向量表中有它的一席之地。它使操作系统和其它系统软件在CM3器件间的移植变得简单多了,因为在所有CM3产品间对其处理都是相同的。7 s9 f6 f/ I2 @( ~. ]4 h : n" B) X% G) `2 d, l; a 0 B, b( e9 S y, f 我们在程序中使用SysTick时钟来作为延时函数,这样就不会占用定时器资源,SysTick时钟是一个直接挂载在AHB总线上的一个定时器,输入的时钟频率直接就是AHB总线上的时钟频率,使用SysTick定时器进行延时,可以精确的设置延时时间,与之前51单片机的for循环累加的精度是完全不一样的。 * O: J: ^; Y9 I 4.2 相关寄存器 4.2.1 控制及状态寄存器CTRL: e# c R5 b% _4 K
Bit 16:计数状态(只读)8 i( b: Z8 C9 V( Z$ I3 h- } 0:该位数据已经被读走 1:上次读取到该位的数据后,计数值达到了0 Bit 2:时钟源选择4 v5 E6 [$ G+ w, H4 q/ v& Q2 d* P 0:外部时钟源 1:内核时钟! h5 w- T! f4 A+ \, S: ? Bit 1:中断标志位 0:计数到0不产生中断 1:计数到0产生SysTick中断 Bit 0:定时器使能位6 l+ M: c% b" V+ c# a8 t9 o+ z 0:关闭定时器 1:开启定时器! v% u" y- k, B% _ ( f! X9 I5 H, c3 k3 {6 @/ L7 H& z 4.2.2 重装载数值寄存器LOAD+ A# p8 r, I8 A) m% N. Z
ReLoad[23:0]:当计数到0后,该寄存器的数据自动更新到VAL中。8 V6 v; l; o0 k( v( \. |: k 4 p0 a; y; C4 c3 t: l ( h8 Y }4 b9 P: e8 t0 H 4.2.3 当前数值寄存器VAL
VAL[23:0]:读取时返回当前倒计数的值,写它:清零,同时还会清除在SysTick控制及状态寄存器中的flag标志。" W9 g! i3 r7 x 9 U* f3 f3 [. Y1 q- [ 4.2.4 校准值寄存器CALIB: e+ q+ Z# T4 G/ }# k( g Bit 31:外部参考时钟可用标志 0:外部参考时钟可用 1:外部参考时钟不可用 . W/ A$ B0 j$ z9 d0 B8 v- N Bit 30:校准值10ms标志 0:校准是准确的10ms* Q, o: L3 r! |. i$ o) s8 V3 v3 p 1:校准不是准确的10ms Bit 23~Bit 0:10ms的时间内倒计数的格数。若该值读回零,则表示无法使用校准功能" l" D5 o6 y% f+ c' |! }8 _4 ] 7 o& r+ e4 L! c( i2 N# K0 q$ g 9 X; s8 u' u0 v% [7 s: B 4.3 SysTick驱动函数 4.3.1 创建目录 (1)在SYSTEM目录下创建delay文件夹,并创建delay.c和delay.h文件。如下图所示。
(2)将delay.c添加进工程,delay.h添加进程序。
(3)在delay.h文件中输入如下内容。
(4)底层寄存器文件添加寄存器组9 a+ Q2 w v$ j- v H$ p
(5)底层寄存器文件添加基础地址
4.3.2 初始化9 L4 f) E/ v# c$ z8 Y, N3 N 这里首先选择外部时钟源,由于系统时钟72MHz,并且SYSTICK时钟固定位系统时钟的1/8,所以1us的计数脉冲实际是72/8,也就是9个脉冲才是1us,这个1us的脉冲数就是基础时钟。3 b% H; Q8 h2 | 1 _0 b7 T6 ~& s 4.3.3 us级别延时函数; N' k8 S! v+ f* B. l/ g1 Q
7 Y% H, l- C; h* [ 4.3.4 ms级别延时函数
上一篇:3 B& @" x, Y3 ]( `7 Q3 _' R0 O STM32学习笔记03—中断架构1 v! n" j$ Y. M+ F2 D% g 1 i' s0 ?/ C P# |1 Q8 H$ b" z |
微信公众号
手机版