微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32F103 systick 是做什么用呢

STM32F103 systick 是做什么用呢

时间:11-23 来源:互联网 点击:
提到systick 不得不抱怨以下STM32 的用户手册,既然提供了systick 的功

能,为啥手册里却只提了一下?后来笔者上网搜的时候,才发现,抱怨的不仅仅
是我一个人。整个DATASHEET上面就只有一句话提到了关于systick的具体用法,糊里糊涂的我蒙了半天,问老大,结果被人家鄙视了,我很是不爽就在网上看了看,结果还是没有资料,后来终于看了信达工作室里整合了一篇关于systick的文章,觉得不错就和大家分享下,希望对大家有帮助,由于时间紧张文章中可能会有写的不具体和逻辑不清楚的地方,请大家多包涵。
1. systick介绍
Systick 就是一个定时器而已,只是它放在了NVIC 中,主要的目的是为了
给操作系统提供一个硬件上的中断(号称滴答中断)。没有学过操作系统的同学,
可能会很郁闷,啥叫滴答中断?这里来简单地解释一下。操作系统进行运转的时
候,也会有“心跳”。它会根据“心跳”的节拍来工作,把整个时间段分成很多
小小的时间片,每个任务每次只能运行一个“时间片”的时间长度就得退出给别
的任务运行,这样可以确保任何一个任务都不会霸占整个系统不放。这个心跳,
可以通过定时器来周期性触发,而这个定时器就是systick。很明显,这个“心跳”
是不允许任何人来随意地访问和修改的。只要不把它在SysTick 控制及状态寄
存器中的使能位清除,就永不停息。它有四个寄存器,笔者把它列出来:
STK_CSR, 0xE000E010 -- 控制寄存器
STK_LOAD, 0xE000E014 -- 重载寄存器
STK_VAL, 0xE000E018 -- 当前值寄存器
STK_CALRB, 0xE000E01C -- 校准值寄存器

以下部分参考互联网的一篇文章,网址为:
http://home.eeworld.com.cn/my/space.php?uid=116357&do=blog&id=31714
感谢作者“416561760 的博客”提供如此详细的寄存器说明的文章。

1、STK_CSR控制寄存器:寄存器内有4 个位t 具有意义

第0 位:ENABLE,Systick 使能位(0:关闭Systick 功能;1:开启Systick
功能)
第1 位:TICKINT,Systick 中断使能位(0:关闭Systick 中断;1:开启
Systick 中断)
第2 位:CLKSOURCE,Systick 时钟源选择(0:使用HCLK/8 作为Systick
时钟;1:使用HCLK 作为Systick 时钟)
第3 位:COUNTFLAG,Systick 计数比较标志,如果在上次读取本寄存器后,
SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零。
2、STK_LOAD 重载寄存器:

Systick 是一个递减的定时器,当定时器递减至0 时,重载寄存器中的值就
会被重装载,继续开始递减。STK_LOAD 重载寄存器是个24 位的寄存器最大
计数0xFFFFFF。
3、STK_VAL当前值寄存器:

也是个24 位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同
时还会清除在SysTick 控制及状态寄存器中的COUNTFLAG 标志。
4、STK_CALRB 校准值寄存器:

位31 NOREF :1=没有外部参考时钟(STCLK 不可用)0=外部参考时钟可用
位30 SKEW:1=校准值不是准确的1ms 0=校准值是准确的1ms
位[23:0] :Calibration value
Indicates the calibration value when the SysTick counter runs on HCLK
max/8 as external clock. The value is product dependent, please refer to
the Product Reference Manual, SysTick Calibration Value section. When
HCLK is programmed at the maximum frequency, the SysTick period is 1ms.
If calibration information is not known, calculate the calibration value
required from the frequency of the processor clock or external clock.
2. systick编程
现在我们想通过Systick 定时器做一个精确的延迟函数,比如让LED 精确延
迟1 秒钟闪亮一次。
思路:利用systick 定时器为递减计数器,设定初值并使能它后,它会每个
系统时钟周期计数器减1,计数到0 时,SysTick 计数器自动重装初值并继续
计数,同时触发中断。
那么每次计数器减到0,时间经过了:系统时钟周期* 计数器初值。我们
使用72M 作为系统时钟,那么每次计数器减1 所用的时间是1/72M,计数器
的初值如果是72000,那么每次计数器减到0,时间经过(1/72M) * 72000 =
0.001,即1ms。但是我们一般使用的时候都不是直接用72M作为systick时钟的,而是间接地把AHB分频(8分频),此时systick时钟就为9M。1/9000000*9000=1ms,这次是STM32规格书上所说的配置systick定时器的具体方法。
现在我们做出来的Delay(1),就是1 毫秒延迟。Delay(1000)就是1 秒。
有了以上的思路后,systick 的编程非常简单。

接着开始配置systick,实际上配置systick 的严格过程如下:
使用ST 的函数库使用systick 的方法:
1、调用SysTick_CounterCmd() – 使能SysTick 计数器
2、调用SysTick_ITConfig () -- 使能SysTick 中断
3、调用SysTick_CLKSourceConfig() -- 设置SysTick 时钟源。
4、调用SysTick_SetReload() -- 设置SysTick 重装载值。
5、调用SysTick_ITConfig () -- 使能SysTick 中断
6、调用SysTick_CounterCmd() -- 开启SysTick 计数器
这里大家一定要注意,必须使得当前寄存器的值VAL 等于0!
SysTick->VAL = (0x00);
只有当VAL 值为0 时,计数器自动重载RELOAD。
接下来就可以直接调用Delay();函数进行延迟了。延迟函数的实现中,要注
意的是,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top