学习目标:
- 掌握 STM32 基础知识
STM32单片机学习总结之------Sysstick(系统滴答定时器)
学习内容:
1、Cortex-M3 在内核部分 包含了一个简单的定时器——SysTick timer
STM32内核有一个定时器。
2、有定时器就需要有时钟源,时钟源可以是内部的还可以是外部的,需要阅读使用手册确定什么作为时钟源。
在STM32 中SysTick 以 HCLK(AHB 时钟)或HCLK/8 作为运行时钟
3、SysTick 是一个24 位的定时器,即一次最多可以计数2^24 个时钟脉冲,这
个脉冲计数值被保存到 当前计数值寄存器STK_VAL(SysTick current value register) 中,只能向下计数,每接收到一个时钟脉冲STK_VAL 的值就向下减1,直至0,当STK_VAL 的值被减至0 时,由硬件自动把重载寄存器STK_LOAD(SysTick reload value register)中保存的数据加载到STK_VAL,重新向下计数。当STK_VAL 的值被计数至0 时,触发异常,就可以在中断服务函数中处理定时事件了。
4、要使SysTick 进行工作必须要进行SysTick 进行配置。它的控制配置很简单,只有三个控制位和一个标志位,都位于寄存器STK_CTRL(SysTick control and status register )中,
Bit0: ENABLE
为SysTick timer 的使能位,此位为1 的时候使能SysTick timer,此位为0的时候关闭SysTick timer。
Bit1:TICKINT
为异常触发使能位,此位为1 的时候并且STK_VAL 计数至0 时会触发SysTick 异常,此位被配置为0 的时候不触发异常
Bit2:CLKSOURCE
为SysTick 的时钟选择位,此位为1 的时候SysTick 的时钟为AHB 时钟,此位为0 的时候SysTick 时钟为AHB/8(AHB 的八分频)。
Bit16:COUNTFLAG
为计数为0 标志位,若STK_VAL 计数至0,此标志位会被置1。与SysTick 控制相关的所有寄存器如图 0-2,其中上面没有介绍的STK_CALIB 寄存器是用于校准的,不常用。
5、需要精确延时时,就可以利用SysTick timer 实现,理论上它的最小计时单位为
AHB 的时钟周期,即1/72000000 秒,72 分之一的微秒,足以满足大部分极端
应用需求。
6、使用
函数作用:
SysTick_Init() :配置好SysTick 定时器,这个函数中包含对SysTick的配置,即调用了SysTick_Config()函数。
Delay_us() :进行精确延时。
到函数SysTick_Init(),在调用SysTick_Config()函数时,向它输入
的参数为:SystemCoreClock / 100000 ,SystemCoreClock 为定义了系统时钟
(SYSCLK)频率的宏,即等于AHB 的时钟频率,AHB 被配置为72MHz 的,也就是这个SystemCoreClock 宏展开为数值7200 0000。
7、时间的计算
下面为计算公式:
T=ticks*(1/f)
T 为要定时的总时间。
ticks 为SysTick_Config()的输入参数。
1/ f 即为SysTick timer 使用的时钟源的时钟周期,
f 为该时钟源的时钟频率,当时钟源确定后为常数。
例如:使用时钟源为AHB 时钟,其**频率被配置为72MHz。*调用函数时,把ticks 赋值为ticks=SystemFrequency / 10 000 =720,表示720 个时钟周期中断一次;(1/f)是时钟周期的时间,此时(1/f =1/72 us ),所以最终定时总时间T=720(1/72),为720 个时钟周期,正好是10us。
SysTick 定时器的定时时间(配置为触发中断,即为中断周期),由ticks 参数决定,最大定时周期不能超过2^24 个。
8、总延时时间的计算
总的延时时间T 延时= T 中断周期 * TimingDelay 。
第7点中计算的T,为一个中断周期
TimingDelay为函数Delay_us() 形参,50000为实参。
9、
调用了Delay_us() 函数,SysTick 定时器就被开启,按照设定好
的定时周期递减计数,SysTick 的计数寄存器里面的值减为0 时,就进入中断函
数,当中断函数执行完毕之后由重新计时,如此循环,除非它被关闭。
这里TimingDelay不等于0,就一直delay。
然后系统对TimingDelay进行下图运算。直至等于0
此次配置为 10us中断一次,每次中断把TimingDelay 减1。
所以TimingDelay的值就决定了中断几次,进而决定了中断时间。
学习总结:
可以利用SysTick 进行时间测量。
开启SysTick 定时器后,定时器开始工作,可以定义一个变量a来对中断次数进行记录,在定时器进入中断时,这个变量就a ++,当我们关闭定时器后,将变量的数值乘与定时器的中断周期 就等于测量时间。