STM32F103 systick 是做什么用呢

发布者:BoldDreamer最新更新时间:2016-01-14 来源: eefocus关键字:STM32F103  systick 手机看文章 扫描二维码
随时随地手机看文章
提到systick 不得不抱怨以下STM32 的用户手册,既然提供了systick 的功

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


以下部分参考互联网的一篇文章,网址为:
https://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();函数进行延迟了。延迟函数的实现中,要注
意的是,全局变量TimingDelay 必须使用volatile,否则可能会被编译器优化。

Q:什么是SYSTick定时器?
SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中
自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清
除,就永不停息。
Q:为什么要设置SysTick定时器?
(1)产生操作系统的时钟节拍
SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。
在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作
为整个系统的时基。因此,需要一个定时器来产生周期性的中断,而且最好还让
用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。
(2)便于不同处理器之间程序移植。
Cortex‐M3 处理器内部包含了一个简单的定时器。因为所有的CM3 芯片都带
有这个定时器,软件在不同CM3 器件间的移植工作得以化简。该定时器的时钟
源可以是内部时钟(FCLK,CM3 上的自由运行时钟),或者是外部时钟( C
M3 处理器上的STCLK 信号)。
不过,STCLK 的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率
可能会大不相同,你需要检视芯片的器件手册来决定选择什么作为时钟源。Sys
Tick 定时器能产生中断,CM3 为它专门开出一个异常类型,并且在向量表中有
它的一席之地。它使操作系统和其它系统软件在CM3 器件间的移植变得简单多
了,因为在所有CM3 产品间对其处理都是相同的。
(3)作为一个闹铃测量时间。
SysTick 定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹
铃,用于测量时间等。要注意的是,当处理器在调试期间被喊停(halt)时,则
SysTick 定时器亦将暂停运作。
Q:Systick如何运行?
首先设置计数器时钟源,CTRL->CLKSOURCE(控制寄存器)。设置重载值(R
ELOAD 寄存器),清空计数寄存器VAL(就是下图的CURRENT)。置CTRL
->ENABLE 位开始计时。
如果是中断则允许Systick 中断,在中断例程中处理。如采用查询模式则不断读
取控制寄存器的COUNTFLAG 标志位,判断是否计时至零。或者采取下列一种
方法
当SysTick 定时器从1 计到0 时,它将把COUNTFLAG 位置位;而下述方法
可以清零之:
1. 读取SysTick 控制及状态寄存器(STCSR)
2. 往SysTick 当前值寄存器(STCVR)中写任何数据
只有当VAL 值为0 时,计数器自动重载RELOAD。
SysTick 的最大使命,就是定期地产生异常请求,作为系统的时基。OS 都需要
这种“滴答”来推动任务和时间的管理。如欲使能SysTick 异常,则把STCSR.TI
CKINT 置位。另外,如果向量表被重定位到SRAM 中,还需要为SysTick 异
常建立向量,提供其服务例程的入口地址。

中断方式参考:

void RCC_Configuration(void)

 

   

    RCC_DeInit();

   

    RCC_HSEConfig(RCC_HSE_ON);

   

    HSEStartUpStatus = RCC_WaitForHSEStartUp();

    if(HSEStartUpStatus == SUCCESS)

     

       FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); 

       FLASH_SetLatency(FLASH_Latency_2);  

       RCC_HCLKConfig(RCC_SYSCLK_Div1);

       RCC_PCLK2Config(RCC_HCLK_Div1);

       RCC_PCLK1Config(RCC_HCLK_Div2);

       RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

       RCC_PLLCmd(ENABLE);

       while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

       {

 

       }

      

       RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

       while(RCC_GetSYSCLKSource() != 0x08)

       {

       }

    }

}

配置具体的systick()

void InitSysTick(void)

{

    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//系统时钟72MH,除以8后systick时钟为9MH。

   

    SysTick_SetReload(9000); //t = 9000/9000000 = 1ms

   

    SysTick_CounterCmd(SysTick_Counter_Enable);

   

    SysTick_ITConfig(ENABLE);

}

中断的入口就在:SysTickHandler()

 

void SysTickHandler(void)

{

    Fuction();/./所需功能函数

}

关键字:STM32F103  systick 引用地址:STM32F103 systick 是做什么用呢

上一篇:传感器智能采集传输控制系统的研究与设计
下一篇:于ARM里面的上拉寄存器的理解

推荐阅读最新更新时间:2024-03-16 14:43

STM32学习007_Systick使用(二)
在 嵌入式学习006_Systick使用(一) 中,详细介绍了Systick中寄存器的使用方法,用到了很多函数,实际上到了3.5版本的标准固件库中,移除了相关驱动函数,用户必须调用CMSIS.h中定义的函数,其中CMSIS只提供了一个Systick设置的函数,替代了STM32原来有的所有的驱动函数,这样做的目的,可能是简化Systick 的设置,可是降低了用户对SysTick的可控性。 在CMSIS中提供的函数是 SysTick_Config(uint32_t ticks); 该函数设置了自动重载入计数器(LOAD)的值,SysTick IRQ的优先级,复位了计数器(VAL)的值,开始计数并打开SysTick IRQ中断。SysT
[单片机]
STM32-systick系统定时器
systick系统定时器 系统定时器存在内核中,是24位的定时器,只能向下递减,嵌套在NVIC中 counter 在时钟的驱动下 在reload的初值开始向下递减计时到0,产生中断置位标志然后又从reload值开始重新递减计数,循环 定时时间计算 t=reload*(1/clk) clk=72M时,t=72*(1/72m)=1us clk=72M时,t=72000*(1/72m)=1ms clk=72M时,t=72000000*(1/72m)=1s 1s=1000MS =1000 000US=1000 000 000NS sysTick属于内核中的外设,他的中断优先级和外设的中断优先级相比,哪个
[单片机]
STM32-<font color='red'>systick</font>系统定时器
STM32F103频率和AD采集项目总结
刚刚做了我的第一个嵌入式项目----基于STM32F103的频率和AD采集系统。 是一个大系统的一个部分,没用操作系统,使用库函数编写,虽然东西很简单,但是对于我这个还没入门的菜鸟来说还是有点难度的。前后断断续续已经两周多了,到目前为止系统已经完成了接近90%,在这个过程中犯了很多错误,也走了很多的弯路,在这里记录下来,让自己以后不要再犯同样的错误,也给那些和我一样刚入门的朋友一点提示。 1、USART初始化问题: STM32F103启动文件默认有两个入口,一个是systemInit(),另一个是main(),其中systemInit默认是用户编写的软件初始化部分。 开始时我把时钟、GPIO、USART、定时器、EXTI、NV
[单片机]
STM32F103单片机RTC实时时钟的使用
  实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。   RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。   系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和RTC的访问: 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。   下面直接通过代码来演示如何操作RTC。
[单片机]
STM32F103释放Jtag接口用做普通io
stm32上有两个调试接口,一个是比较通用的Jtag,一个是SWD。SWD占用的IO口更少,因此,我们可以用SWD来调试MCU,这样,除去swd的两条线,Jtag接口的另外三个口则可以用来作普通IO口使用,配置很简单,分享给各位: GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); G
[单片机]
STM32F103做从机SPI通信SPI3中断异常
在做AM335D板子与STM32F103使用SPI通信时,需要用到STM32的从机模式,所以特别对于ST的从机模式进行了研究,由于硬件上使用的是STM32F103的SPI3,所以过程中遇到了一点麻烦,这里记录一下过程,以备查阅: 使用SPI3通信时,从机时钟产生不了中断,经过查阅资料,是因为spi3的nss口与JTAG有共用引脚,所以配置错误会导致SPI3无法使用。需要注意以下两点就可以了: 1.开启GPIO时钟的同时,开启AFIO时钟,如下: RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE ); 2.关闭JTA
[单片机]
stm32f103 adc采集 程序配置
这个例程是采集电压adc值 对于通道几是如何选择的: 这里在adc初始化函数中,设置通道几的采样率只是设置要使用的通道几,并不是选择用通道几,真正的选择用通道几是在Get_Adc()AD采样这个函数中,ADC1- SQR3|=ch;这里的配置,因为SQR3的0~4位 是设置在规则序列转换中要转换的通道,又因为只有一个通道需要转换,所以就用这里来设置。 对于选择IO口几对应的通道几具体要看原理图或者芯片手册: 例如 void Adc_Init(void) { //先初始化IO口 RCC- APB2ENR|=1 2; //使能PORTA口时钟 GPIOA- CRL&=0XFFF0FFFF;//PA4 anolo
[单片机]
<font color='red'>stm32f103</font> adc采集 程序配置
STM32 SysTick定时器讲解
STM32 SysTick定时器讲解 本文将介绍SysTick定时器、其工作原理与寄存器、及对应的应用实例 SysTick定时器简介 首先、我们先解释下定时器,“定时器”:能够定时、计数的器件 SysTick称为系统滴答定时器,它位于Cortex 内核中是一个定时器,可以对输入的时钟进行计数、若输入的时钟具有周期性的变化,则计数也相当于计时。 系统滴答定时器一般用于操作系统,为操作系统提供时基、维持操作系统的心跳; 系统滴答定时器每过一段时间会产生一个中断,根据这个特性、操作系统就可以实现时间片的任务调度。 工作原理分析 从上述两张图我们可以看出: 系统滴答定时器的时钟源是从SYSCLK处经过分频得到的,另外它处于内核中
[单片机]
STM32 <font color='red'>SysTick</font>定时器讲解
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved