您的位置 首页 发布

STM32 Systick 编程及使用

提到systick不得不抱怨以下STM32的用户手册,既然提供了systick的功能,为啥手册里却只提了一下?后来笔者上网搜的时候,才发现,抱…

说到systick 不得不诉苦以下STM32 的用户手册,已然供给了systick 的功用,为啥手册里却只提了一下?后来笔者上网搜的时分,才发现,诉苦的不仅仅是我一个人。闲话不说,下面将笔者收集的材料进行总结。

一、 systick介绍

Systick 便是一个守时器罢了,仅仅它放在了NVIC 中,首要的意图是为了给操作体系供给一个硬件上的中止(声称滴答中止)。没有学过操作体系的同学, 或许会很抑郁,啥叫滴答中止?这儿来简略地解释一下:操作体系进行作业的时分,也会有”心跳”。它会依据”心跳”的节拍来作业,把整个时刻段分红许多小小的时刻片,每个使命每次只能运转一个”时刻片”的时刻长度就得退出给其他使命运转,这样能够保证任何一个使命都不会强占整个体系不放。这个心跳,能够通过守时器来周期性触发,而这个守时器便是systick。很明显,这个”心跳” 是不答应任何人来随意地拜访和修正的。只需不把它在SysTick 操控及状况寄存器中的使能位铲除,就永不暂停。

知道systick 在体系中的方位后,咱们来了解systick 的完结。留意,本期教程并没有叙述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 个位具有含义

第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.

二、systick编程

现在咱们想通过Systick 守时器做一个准确的推迟函数,比方让LED 准确推迟1 秒钟闪亮一次。

思路:运用systick 守时器为递减计数器,设定初值并使能它后,它会每个体系时钟周期计数器减1,计数到0 时,SysTick 计数器主动重装初值并持续计数,一起触发中止。

那么每次计数器减到0,时刻通过了:体系时钟周期* 计数器初值。咱们运用72M 作为体系时钟,那么每次计数器减1 所用的时刻是1/72M,计数器的初值假如是72000,那么每次计数器减到0,时刻通过(1/72M) * 72000 = 0.001m,即1ms。

现在咱们做出来的Delay(1),便是 1 毫秒推迟。Delay(1000)便是1 秒。

有了以上的思路后,systick 的编程十分简略。

首要,咱们需求有一个72M 的systick 体系时钟,那么,运用下面这个时钟就OK!

SystemInit();

这个函数能够让主频运转到72M。能够把它作为systick 的时钟源。为了合作演示,能够运用LED 显现来做,所以咱们设置了GPIO_Config(); 初始化函数,初始化了芯达STM32 开发板上的LED4 灯。接着开端装备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();函数进行推迟了。推迟函数的完结中,要留意的是,全局变量TimingDelay 有必要运用volatile,不然或许会被编译器优化。

以下是一篇systick的问答篇总结,摘录于网络,期望对您的了解有协助。
文章网址:http://blog.ednchina.com/jielove2003/768642/message.aspx

Q:什么是SYSTick守时器?

SysTick 是一个24 位的倒计数守时器,当计到0 时,将从RELOAD 寄存器中主动重装载守时初值。只需不把它在SysTick 操控及状况寄存器中的使能位铲除,就永不暂停。

Q:为什么要设置SysTick守时器?

(1)产生操作体系的时钟节拍

SysTick守时器被捆绑在NVIC中,用于产生SYSTICK反常(反常号:15)。在曾经,大多操作体系需求一个硬件守时器来产生操作体系需求的滴答中止,作为整个体系的时基。因而,需求一个守时器来产生周期性的中止,并且最好还让用户程序不能随意拜访它的寄存器,以保持操作体系”心跳”的节律。

(2)便于不同处理器之间程序移植。

Cortex‐M3 处理器内部包含了一个简略的守时器。由于一切的CM3 芯片都带有这个守时器,软件在不同CM3 器材间的移植作业得以化简。该守时器的时钟源能够是内部时钟(FCLK,CM3 上的自在运转时钟),或许是外部时钟( CM3 处理器上的STCLK 信号)。

不过,STCLK 的详细来历则由芯片设计者决议,因而不同产品之间的时钟频率或许会大不相同,你需求检视芯片的器材手册来决议挑选什么作为时钟源。SysTick 守时器能产生中止,CM3 为它专门开出一个反常类型,并且在向量表中有它的一席之地。它使操作体系和其它体系软件在CM3 器材间的移植变得简略多了,由于在一切CM3 产品间对其处理都是相同的。

(3)作为一个闹铃丈量时刻。

SysTick 守时器除了能服务于操作体系之外,还能用于其它意图:如作为一个闹铃,用于丈量时刻等。要留意的是,当处理器在调试期间被喊停(halt)时,则SysTick 守时器亦将暂停运作。

Q:Systick怎么运转?

首要设置计数器时钟源,CTRL->CLKSOURCE(操控寄存器)。设置重载值(RELOAD 寄存器),清空计数寄存器VAL(便是下图的CURRENT)。置CTRL->ENABLE 位开端计时。

假如是中止则答应Systick 中止,在中止例程中处理。如选用查询形式则不断读取操控寄存器的COUNTFLAG 标志位,判别是否计时至零。或许采纳下列一种办法

当SysTick 守时器从1 计到0 时,它将把COUNTFLAG 方位位;而下述办法能够清零之:

1. 读取SysTick 操控及状况寄存器(STCSR)
2. 往SysTick 当时值寄存器(STCVR)中写任何数据

只有当VAL 值为0 时,计数器主动重载RELOAD。

Q:怎么运用SysTicks作为体系时钟?

SysTick 的最大使命,便是定时地产生反常恳求,作为体系的时基。OS 都需求这种”滴答”来推进使命和时刻的办理。如欲使能SysTick 反常,则把STCSR.TICKINT 置位。别的,假如向量表被重定位到SRAM 中,还需求为SysTick 反常树立向量,供给其服务例程的进口地址。

Q:怎么运用SysTick完结一段延时?

查询方法参阅:http://blog.ednchina.com/atom6037/188271/message.aspx

中止方法参阅:

初始化函数SysTick_Configuration(void)放在while()循环外,履行一次:

view plaincopy to clipboardprint?

1. void SysTick_Configuration(void)
2. {
3. /* Select AHB clock(HCLK) as SysTick clock source 设置AHB 时钟为SysTick 时钟*/
4. SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
5.
6. /* Set SysTick Priority to 3 设置SysTicks 中止抢占优先级3, 从优先级0*/
7. NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 3, 0);
8.
9. /* SysTick interrupt each 1ms with HCLK equal to 72MHz 每1ms 产生一次SysTick 中止*/
10. SysTick_SetReload(72000);
11.
12. /* Enable the SysTick Interrupt */
13. SysTick_ITConfig(ENABLE);
14. }

延时函数,需求延时处调用:

view plaincopy to clipboardprint?

1. void Delay(u32 nTime)
2. {
3. /* Enable the SysTick Counter 答应SysTick 计数器*/
4. SysTick_CounterCmd(SysTick_Counter_Enable);
5.
6. TimingDelay = nTime;
7.
8. while(TimingDelay != 0)
9. ; //等候计数至0
10.
11. /* Disable the SysTick Counter 制止SysTick 计数器*/
12. SysTick_CounterCmd(SysTick_Counter_Disable);
13. /* Clear the SysTick Counter 清零SysTick 计数器*/
14. SysTick_CounterCmd(SysTick_Counter_Clear);
15. }

中止函数,守时器减至零时调用,放在stm32f10x_it.c 文件中

view plaincopy to clipboardprint?

1. void SysTickHandler(void)
2. {
3. TimingDelay–;
4. }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/273143.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部