15.6、 SysTick系统滴答实验
基于stm32的精确延时利用系统滴答systick
基于stm32的精确延时利用系统滴答systick
利用系统滴答定时器来实现精确延时,需要以下五步:1、设置滴答定时
器的时钟,通过设置其控制寄存器,选择外部时钟,即为系统时钟的八分之一,若系统时钟为72M,则滴答定时器时钟为9M。
即定时一秒需要9M 个时钟周期。
2、设置滴答定时器的重装载寄存器的数值,即需要延时的时钟周期数。
如:若需要延时20 微秒,则重装载值为20*9.若要延时20 毫秒,则设置重装载值为20*9000.
3、清空滴答定时器当前值寄存器的值,使之为零,以便使能计数时能够从
设定值开始倒数计时。
4、设置滴答定时器的控制寄存器,开始倒计数。
5、查询滴答定时器的状态位,定时时间到,关闭定时器,清空定时器当前值。
void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=0xfffffffb;//控制寄存器,选择外部时钟即系统时钟的八分
之一(HCLK/8;72M/8=9M)
fac_us=SYSCLK/8;//定义全局变量,即延时一微秒所需的的时钟周期数(72/8=9,单位为微妙)
fac_ms=(u16)fac_us*1000; //一毫秒所需的时钟周期数(9000)
}
void Delay_us(u32 nus)
{。
SysTick定时器介绍,SysTick定时器寄存器
SysTick定时器介绍,SysTick定时器寄存器
SysTick定时器介绍
SysTick定时器也叫SysTick滴答定时器,它是Cortex-M3内核的一个外设,被嵌入在NVIC 中。
它是一个24 位向下递减的定时器,每计数一次所需时间为1/SYSTICK,SYSTICK 是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟8 分频后获取,本套程序中我们采用后者,即每计数一次所需时间为1/(72/8)us,换句话说在1us 的时间内会计数9 次。
当定时器计数到0 时,将从LOAD 寄存器中自动重装定时器初值,重新向下递减计数,如此循环往复。
如果开启SysTick 中断的话,当定时器计数到0,将产生一个中断信号。
因此只要知道计数的次数就可以准确得到它的延时时间。
SysTick 定时器通常应用在操作系统中,为其提供时钟周期。
SysTick定时器操作
在STM32F1 库函数中,并没有提供相应的SysTick 定时器配置函数,。
Systick精确延时实验
代码分析 2: SysTick_Config()函数详解
这个函数配置 24 位的倒计数 Systick 定时器,当计到 0 时引起中断,并从 STK_LOAD 寄存器中自动重装载定时初值。只要不把它在 SysTick 控制及状态寄存器中的使能位清除, 就永不停息。输入的参数 ticks 经过处理送 STK_LOAD 寄存器,为两个中断之间的脉冲数(定 时初值),即相隔 ticks 个时钟周期会引起一次中断;配置 SysTick 成功时返回 0,出错进 返回 1。
第二行代码“SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1” 稍稍处 理一下把 ticks-1 赋值给 STK_LOAD 寄存器,要注意的是减 1,若 STK_VAL 从 ticks-1 向下 计数至 0,实际上就经过了 ticks 个脉冲。
最后一行代码设置了 Systick 的 CTRL 寄存器,配置 SysTick 定时器时钟频率为 AHB (72MHz)。同时使能 Systick 定时器和 Systick 定时器中断。
代码分析 3:中断服务函数详解 void SysTick_Handler(void) {
TimingDelay_Decrement(); } 调用 TimingDelay_Decrement()函数 void TimingDelay_Decrement(void) {
第三行代码 “NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1)”配 置中断向量及重置 STK_VAL 寄存器。配置了 SysTick 中断,这就是为什么我们在外部没有再 使用 NVIC 配置 SysTick 中断的原因。
stm32中滴答定时器的工作原理
stm32中滴答定时器的工作原理滴答定时器(SysTick)是STM32微控制器中的一种基本定时器,用于实现系统级的定时和延时功能。
它通常用于硬件抽象层的操作系统内核的实现以及其他需要高精度定时的应用场景。
滴答定时器的工作原理如下:1.时钟源选择:滴答定时器使用CPU时钟作为输入时钟,因此在使用之前需要首先设置CPU的主频。
CPU时钟可以是外部晶振,也可以是内部RC振荡器,由系统初始化代码进行设置。
2.模式选择和初始化:滴答定时器有两种工作模式,分别是中断模式和定时器模式。
中断模式下,定时器溢出时会产生中断请求,用于实时操作系统的任务调度;在定时器模式下,定时器溢出后会自动清零,用于延时等功能。
通过设置控制寄存器(STK_CTRL)可以选择工作模式和初始化定时器的值。
3.计数器递减:滴答定时器的计数值从初始化值开始递减,直到计数值为零时溢出。
每个CPU时钟周期,计数值会减去一个单位。
CPU的主频越高,滴答定时器的计数速度就越快。
4.滴答定时器中断:当计数值减少到零时,滴答定时器会产生一个溢出中断。
在中断处理函数中,可以执行一些任务,如系统时钟更新、任务调度和延时等。
5. 重载和连续计数:滴答定时器的计数值可以自动加载初始化值,并在溢出后继续计数。
通过设置控制寄存器的使能位(enable)可以实现此功能。
当使能位为1时,计数器溢出后会自动重新加载初始化值并继续计数。
7.滴答定时器的应用:滴答定时器可用于实现微秒级的延时函数,用于生成固定时间间隔的任务调度,或者用于计算程序执行的时间等。
总之,滴答定时器是STM32微控制器中的一种基本定时器,可以用于实现系统级的定时和延时功能。
它通过使用CPU时钟作为输入时钟源,不断递减计数器的值,当计数器溢出时产生中断并执行相应的任务。
通过设置工作模式、初始化值和使能位等参数,可以配置滴答定时器的功能和精度。
它在实时操作系统的任务调度、时钟更新和延时等方面起着重要的作用。
STM32的SYSTICK定时器(系统滴答定时器)
STM32的SYSTICK定时器(系统滴答定时器)什么是SysTick?这是⼀个24位的系统节拍定时器system tick timer,SysTick,具有⾃动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得⼀定的时间间隔。
SysTick作⽤在单任务引⽤程序中,因为其架构就决定了它执⾏任务的串⾏性,这就引出⼀个问题:当某个任务出现问题时,就会牵连到后续的任务,进⽽导致整个系统崩溃。
要解决这个问题,可以使⽤实时操作系统(RTOS).因为RTOS以并⾏的架构处理任务,单⼀任务的崩溃并不会牵连到整个系统。
这样⽤户出于可靠性的考虑可能就会基于RTOS来设计⾃⼰的应⽤程序。
SYSTICK存在的意义就是提供必要的时钟节拍,为RTOS的任务调度提供⼀个有节奏的“⼼跳”。
微控制器的定时器资源⼀般⽐较丰富,⽐如STM32存在8个定时器,为啥还要再提供⼀个SYSTICK?原因就是所有基于ARM Cortex_M3内核的控制器都带有SysTick定时器,这样就⽅便了程序在不同的器件之间的移植。
⽽使⽤RTOS的第⼀项⼯作往往就是将其移植到开发⼈员的硬件平台上,由于SYSTICK的存在⽆疑降低了移植的难度。
SysTick定时器除了能服务于操作系统之外,还能⽤于其它⽬的:如作为⼀个闹铃,⽤于测量时间等。
要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。
SysTick时钟的选择SysTick寄存器说明在《Cortex-M3权威指南》(chap8.SysTick定时器章节)有说明⽤户可以在位于Cortex_M3处理器系统控制单元中的系统节拍定时器控制和状态寄存器(SysTick control and status register ,SCSR)选择systick 时钟源。
如将SCSR中的CLKSOURCE位置位,SysTick会在CPU频率下运⾏;⽽将CLKSOUCE位清除则SysTick会以CPU主频的1/8频率运⾏。
STM32单片机SysTick系统滴答功能解析
STM32 单片机SysTick 系统滴答功能解析
今天讲解“STM32F103SysTick 系统滴答”,“SysTIck系统滴答”是属于Cortex-M3 内核的一部分,主要是为运行的操作系统提供滴答时钟,如常见的操作系统:uCOS、RTOS 等。
不管M3 芯片属于哪一家公司,它都标配有SysTIck 这一部分。
因此,它属于芯片内核的一部分,主要是为了方便操作系统的移植。
其实,SysTIck 能实现的功能,都可以由TIM 来实现。
SysTick 无非就是定时中断的功能,它完全可以由TIM 定时器来完成。
之所以SysTick 独立出来就是因为它属于内核一部分,方便用户移植,而且简单方便。
学过uCOS 的人都知道,以前在51,或者430 上面是由定时器完成的时钟滴答,到后面ARM 公司就用到了一个好的办法,就是在内核中标配一个SysTick,这样下来移植系统不用那幺麻烦了。
SysTick 除了在操作系统中起到作用,其实在裸机程序中也起到很大作用,比如:定期处理一段程序、超时定时、串口接收超时等,今天就以“定期处理一段程序”为例来说一下。
内容讲解。
SysTick系统定时器(功能框图和优先级配置)
SysTick系统定时器(功能框图和优先级配置)SysTick—系统定时器是属于 CM3 内核中的⼀个外设,内嵌在 NVIC 中。
系统定时器是⼀个 24bit (2^24)的向下递减的计数器,计数器每计数⼀次的时间为 1/SYSCLK,⼀般我们设置系统时钟 SYSCLK 等于 72M。
当重装载数值寄存器的值递减到 0 的时候,系统定时器就产⽣⼀次中断,以此循环往复。
因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单⽚机都具有这个系统定时器,使得软件在 CM3 单⽚机中可以很容易的移植。
系统定时器⼀般⽤于操作系统,⽤于产⽣时基,维持操作系统的⼼跳.SysTick的执⾏过程:counter在时钟的驱动下,从reload初值开始往下递减计数到0(在递减的过程中值可以在STK_VAL中查看到),产⽣中断和置位COUNTFLAG标志。
然后⼜从reload 值开始重新递减计数,如此循环。
SysTick相关寄存器SysTick—系统定时器有4 个寄存器(CTRL LOAD VAL CALIB),简要介绍如下。
在使⽤ SysTick 产⽣定时的时候,只需要配置前三个寄存器,最后⼀个校准寄存器不需要使⽤。
SysTick寄存器结构体SysTick寄存器(在固件库⽂件:core_cm3.h中定义)typedef struct{_IO uint32_t CTRL; /*控制及状态寄存器*/_IO uint32_t LOAD; /*重装载数值寄存器*/_IO uint32_t VAL; /*当前数值寄存器*/_IO uint32_t CALIB; /*校准寄存器*/}SysTick库函数SysTick配置库函数(在固件库⽂件:core_cm3.h中定义)__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks){// 不可能的重装载值,超出范围if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) {return (1UL);}// 设置重装载寄存器SysTick->LOAD = (uint32_t)(ticks - 1UL);// 设置中断优先级,默认优先级最低 __NVIC_PRIO_BITS 4(1111)系统定时器此时设置的优先级在内核外设中是最低的NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);// 设置当前数值寄存器SysTick->VAL = 0UL;// 设置系统定时器的时钟源为 AHBCLK=72M// 使能系统定时器中断// 使能定时器SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |21 SysTick_CTRL_TICKINT_Msk |22 SysTick_CTRL_ENABLE_Msk;23 return (0UL);24 }⽤固件库编程的时候我们只需要调⽤库函数 SysTick_Config()即可,形参ticks⽤来设置重装载寄存器的值,最⼤不能超过重装载寄存器的值 2^24,当重装载寄存器的值递减到 0的时候产⽣中断,然后重装载寄存器的值⼜重新装载往下递减计数,以此循环往复。
SysTick定时器介绍
@TOC
1.SysTick定时器介绍
SysTick定时器也叫SysTick滴答定时器,它是Cortex-M4内核的一个外设,被嵌入在 NVIC 中。
它是一个24 位向下递减的定时器,每计数一次所需时间为1/SYSTICK,SYSTICK是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟8分频后获取。
当定时器计数到0时,将从LOAD 寄存器中自动重装定时器初值,重新向下递减计数,如此循环往复。
如果开启SysTick中断的话,当定时器计数到0,将产生一个中断信号。
因此只要知道计数的次数就可以准确得到它的延时时间。
2.SysTick定时器寄存器
(1)CTRL寄存器
CTRL是SysTick定时器的控制及状态寄存器。
其相应位功能如下:
(2)LOAD寄存器
LOAD是SysTick定时器的重装载数值寄存器。
其相应位功能如下:
(3)VAL寄存器
VAL是SysTick定时器的当前数值寄存器。
其相应位功能如下:
(4)CALIB寄存器
CALIB是SysTick定时器的校准数值寄存器。
其相应位功能如下:3.SysTick定时器配置步骤
5.编程。
实验一:SysTick实验
*----------------------------------------------------------------------------*/
void LED_Off (void) {
LPC_GPIO1->DATA |= 1<<9;
LPC_SYSCON->SYSAHBCLKCTRL |= (1UL << 13); /* Enable clock to ADC block */
LPC_ADC->CR = ( 1UL << 0) | /* select AD0 pin */
(23UL << 8) | /* ADC clock is 24MHz/24 */
void LED_On (void) {
LPC_GPIO1->DATA &= ~(1<<9);
}
/*----------------------------------------------------------------------------
Function that outputs value to LEDs
LPC_IOCON->R_PIO0_11 = (2UL << 0); /* P0.11 is AD0 */
LPC_GPIO0->DIR &= ~(1UL << 11); /* configure GPIO as input */
/* configure ADC */
LPC_SYSCON->PDRUNCFG &= ~(1UL << 4); /* Enable power to ADC block */
滴答计时器
1. systick介绍Systick 就是一个定时器而已,只是它放在了NVIC 中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断)。
没有学过操作系统的同学,可能会很郁闷,啥叫滴答中断?这里来简单地解释一下。
操作系统进行运转的时候,也会有“心跳”。
它会根据“心跳”的节拍来工作,把整个时间段分成很多小小的时间片,每个任务每次只能运行一个“时间片”的时间长度就得退出给别的任务运行,这样可以确保任何一个任务都不会霸占整个系统不放。
这个心跳,可以通过定时器来周期性触发,而这个定时器就是systick。
很明显,这个“心跳”是不允许任何人来随意地访问和修改的。
只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。
它有四个寄存器:STK_CSR, 0xE000E010 -- 控制寄存器STK_LOAD, 0xE000E014 -- 重载寄存器STK_VAL, 0xE000E018 -- 当前值寄存器STK_CALRB, 0xE000E01C -- 校准值寄存器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。
零死角玩转stm32-初级篇6、Systick(操作系统的心脏)
0、友情提示《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。
M3的世界,与野火同行,乐意惬无边。
另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。
内容上会给你带来更多的惊喜。
是一本学习STM32必备的工具书。
敬请期待!6、Sysstick(系统滴答定时器)6.1 SysTick——操作系统的心跳SysTick定时器被捆绑在NVIC中,用于产生SysTick异常(异常号:15)。
在以前,操作系统和有所有使用了时基的系统,都必须要一个硬件定时器来产生需要的“滴答”中断,作为整个系统的时基。
滴答中断对操作系统尤其重要。
例如,操作系统可以为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。
因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。
Cortex-M3在内核部分包含了一个简单的定时器——SysTick timer。
因为所有的CM3芯片都带有这个定时器,软件在不同芯片生产厂商的 CM3器件间的移植工作就得以化简。
该定时器的时钟源可以是内部时钟(FCLK,CM3上的自由运行时钟),或者是外部时钟( CM3处理器上的STCLK信号)。
不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同。
因此,需要阅读芯片的使用手册来确定选择什么作为时钟源。
在STM32中SysTick 以 HCLK(AHB时钟)或HCLK/8 作为运行时钟。
STM32系统systick定时器与延迟时间计算
STM32系统systick定时器与延迟时间计算系统嘀嗒(SysTick)校准值寄存器1.(SysTick) 系统嘀嗒时钟是由HCLK 分频出来的。
HCLK=SYSCLK=72MHz/* Select HCLK/8 as SysTick clock source */SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);当系统嘀嗒时钟设定为9 兆赫或是:SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);当系统嘀嗒时钟设定为72 兆赫2.系统嘀嗒校准值固定到9000,当系统嘀嗒时钟设定为9 兆赫,产生1ms 时基。
/* SysTick interrupt each 9ms with counter clock equal to 1MHz */SysTick_SetReload(9000);该参数取值必须在1和0x00FFFFFF之间3.使能一下:/* Enable the SysTick Counter */SysTick_CounterCmd(SysTick_Counter_Enable);/* Enable the SysTick Interrupt */SysTick_ITConfig(ENABLE);这还有另外一种设置方法:经试验验证可行://NVIC_InitTypeDef NVIC_InitStructure;/* Configure HCLK clock as SysTick clock source */SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);/* Configure the SysTick handler priority */NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 2, 0);/* Configure one bit for preemption priority */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/* SysTick interrupt each 100 Hz with HCLK equal to 72MHz 每1ms发生一次SysTick中断*/SysTick_SetReload(72000);/* Enable the SysTick Interrupt */SysTick_ITConfig(ENABLE);/* Enable the SysTick Counter */SysTick_CounterCmd(SysTick_Counter_Enable);关键是:SysTick_CLKSourceConfig,和SysTick_SetReload。
HAL库与Cubemx系列Systick-系统滴答定时器详解
HAL库与Cubemx系列Systick-系统滴答定时器详解Systick是什么?关于Systick,在Context-M3权威指南中如此描述:SysTick定时器被捆绑在NVIC中,⽤于产⽣SYSTICK异常(异常号: 15)。
在以前,⼤多操作系统需要⼀个硬件定时器来产⽣操作系统需要的滴答中断,作为整个系统的时基。
例如,为多个任务许以不同数⽬的时间⽚,确保没有⼀个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。
因此,需要⼀个定时器来产⽣周期性的中断,⽽且最好还让⽤户程序不能随意访问它的寄存器,以维持操作系统“⼼跳”的节律。
SysTick定时器能产⽣中断, CM3为它专门开出⼀个异常类型,并且在向量表中有它的⼀席之地。
它使操作系统和其它系统软件在CM3器件间的移植变得简单多了,因为在所有CM3产品间对其处理都是相同的。
SysTick 是⼀个 24 位的倒计数定时器,当计到 0 时,将从 RELOAD 寄存器中⾃动重装载定时初值。
只要不把它在 SysTick 控制及状态寄存器中的使能位清除,就永不停息,图 13.1 中⼩结了 SysTick的相关寄存器。
这是定义在core_cm3.h中的结构体:SysTick 的最⼤使命,就是定期地产⽣异常请求,作为系统的时基。
OS 都需要这种“滴答” 来推动任务和时间的管理。
如欲使能 SysTick 异常,则把 STCSR.TICKINT 置位。
另外,如果向量表被重定位到 SRAM 中,还需要为 SysTick 异常建⽴向量,提供其服务例程的⼊⼝地址。
Systick如何使⽤?前⾯说了那么多,Systick到底是什么,⼩伙伴们是不是已经明⽩了呢?其实,简单⼀句话,就是“⼼跳”,CPU以⼼跳为依据分配要做的事情,嘀哒...嘀哒...嘀哒...cubemx配置Systick来来来,实践是检验真理的唯⼀标准,没有实践的理论就是耍流氓~~Systick是系统的“⼼跳”,为系统提供着时基来源,cubemx中是已经为我们勾选了的,默认的时基是来源于Systick当然了,条条⼤路通罗马,Systick可以作为时基,但却不是唯⼀的,不信你看,实际上有这么多的定时器都可以⽤来作为时基来源的,移植过操作系统的⼩伙伴⼀定不陌⽣,本次,我们只介绍关于Systick的功能~时钟配置关于时钟配置的详细讲解,请参看:CubeMX的正确打开⽅式⼀⽂串⼝配置关于串⼝配置的详细解释,请参看:CubeMX的正确打开⽅式⼀⽂Systick中断可以看到,Systick的中断是默认已经开启了的,直接使⽤即可Systick代码详细解析结合⽣成的⼯程,来看看Systick的时钟配置以及⼯作流程,systick⾸先在HAL_Init()函数中被提到,被cue来⼲嘛呢,接下来跟进去看看从英⽂解释中(别说看不懂哈),Systick被配置为系统时基,并且被配置为了1ms,做技术,要有刨根问底的精神,奥利给,继续跟进去看看这段英⽂解释很重要,外设中断进程调⽤HAL_Delay的时候,要特别注意中断的优先级问题,如果systick的中断优先级低于外设中断优先级,会导致⼀直在外设中断中阻塞,如果外设中调⽤了HAL_Delay(),⼀定要保证Systick的中断优先级⾼于外设中断优先级,但是,⼩飞哥是极其不建议在中断中调⽤HAL_Delay()函数的明明是在说Systick的事情,怎么牵扯到HAL_Delay()函数了呢,那就再来看看,HAL_Delay()是如何实现的呢?打开HAL_Delay(),可以看到,实际上是通过uWTick这个全局变量不断增加,⽐较来实现的延时,那么uWTick是在哪⾥增加的呢?好家伙,转了⼗万⼋千⾥,最终还是在Systick中断中进⾏增加的,默认配置的是Systick 1ms中断,这下知道了我们调⽤的HAL_Delay(),为什么是1ms了吧,绕了那么⼀⼤圈,是不是有点想打⼈呢~默认配置的是1ms中断周期,那我们HAL_Delay()的最⼩单位是1ms,如果想获得1us的中断周期,该如何调整呢?且往下看,这是我们⾃定义的systick周期配置函数,⼀步⼀步来看先来看systick的时钟来源,时钟来源为HCLK或者是HCLK的8分频,⼩飞哥实验选择的是HCLK,72MHZ,确定了systick的时钟源,接下来配置systick的中断周期HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);再来看这个函数,分析之前,我们先来看看systick的中断周期时间是怎么计算的,T=ReloadValue10001/72000000ms这是默认的配置1ms,主频是72MHZ,uwTickFreq默认是1KHZ,根据上⾯的分析计算,算下来T =(72MHZ/1000)1/72MHZ=1000/72MHZ(1/72MHZ)=1/1000s=1ms,你看懂了吗?HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)根据上⾯的分析,我们想要1us、10ms、100ms....的中断周期怎么办,那就根据上⾯的计算公式算吧,那这么修改后,HAL_Delay不就可以实现us延时了嘛,实现当然是能实现,但中断是不是过于频繁了呢,1us⼀个中断诶,那怎么实现呢,请查看,关于HAL库us延时的3种实现⽅式HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000); //1ms到此,关于systick的⼯作流程就算是介绍差不多了,还有最后⼀步,Systick中断回调函数需要添加到中断回调句柄中可以看到systick中断回调函数依然是_weak修饰符,意思就是我们⾃⼰⼀个⼀样名字的函数,不会报错我们⾃⼰重新定义回调函数,处理中断事务,好的编程习惯,中断置标志,所有的逻辑处理放在中断外处理,建议这样做while中不断查询标志测试结果间隔100ms,打印systick test,测试OK,over关于Embeded-party欢迎加⼊群聊Embeded-party,这⾥有⼀群可爱的⼈⼉,很多有意思的设计,等着你的加⼊哦资料获取公众号后台回复,systick,即可获得源码哦~。
实验3-3systick定时器
实验3-3systick定时器实验三-3 systick定时器【实验目的】1、学习LPC1768处理器timer定时器(中断方式)的功能原理;2、掌握定时器功能设置及使用方法。
【实验要求】1、了解LPC1768处理器timer定时器(中断方式)的功能原理。
【实验原理】一、LPC系列处理器定时器的原理参见课本中有关sysytick定时器的章节,重点要掌握定时器工作原理、定时器寄存器设置和定时器的工作方法等。
二、实验板上的定时器SysTick的工作机制与外部设备中的Timer定时器类似,它的本质是一个计数器,通过对系统的时钟频率(即每一个“tick”)进行计数,当计数值达到设定的数值时即完成计时的工作。
不同的是,即使外部的timer定时器由于节电等原因关闭了,SysTick仍然能够正常工作。
SysTick采用中断机制工作,正确的配置应该是10ms产生一次SysTick中断。
三、程序说明1.SysTick_Config(uint32_t ticks):SysTick定时器初始化,函数参数是定时器计数的tick数,通过计算可得到准确的定时时间。
2. SysTick_Handler (void):SysTick中断服务程序,SysTick定时器采用中断方式工作,计数值每达到一次预设的tick 数便产生一次中断。
本实验中,在该中断服务子函数中对计数值TimeTick加1。
【实验内容与步骤】一、阅读例程阅读整个工程文件的框架和之前列出的主要函数,了解定时器的用法。
二、运行、调试:观察程序运行结果是否正确。
三、编程:修改程序相关部分,改变定时器定时周期,从而改变LED灯闪烁频率。
【实验习题】1.Systick定时器的定时间隔10ms在程序中如何计算得到。
SysTick定时器详解
SysTick定时器详解SysTick定时器详解关于SysTick定时器,如果想从STM32官⽅⼿册去寻找该定时器,会发现并没有该定时器的相关介绍,仅有库函数介绍。
由此可以看出SysTick并不是意法半导体公司设定的。
从Cortex-M3权威指南可以找到该定时器的详细介绍,由此可以知道SysTick定时器是在ARM芯⽚当中设定的。
这⾥有⼀个疑问,为什么M3有这么多定时器还要弄⼀个SysTick定时器呢?这要从它的概念⼊⼿,系统滴答定时器是⼀个⾮常基本的倒计时定时器,⽤于在每隔⼀定时间产⽣⼀个中断,即使是系统在睡眠模式下也能⼯作。
它使得OS在各CM3器件之间的移植中不必修改系统定时器的代码,移植⼯作⼀下⼦容易多了。
SysTick定时器也是作为NVIC的⼀部分实现的。
如果有外设就⼀定会存在⼀堆⽤来配置该外设的寄存器,SysTick定时器也不例外。
⽤来控制该定时器的寄存器有四个,下⾯详细介绍这四个寄存器。
SysTick控制及状态寄存器(地址:0xE000_E010)位段名称类型复位值描述16COUNTFLAG R0如果在上次读取本寄存器后, SysTick 已经数到了 0,则该位为 1。
如果读取该位,该位将⾃动清零2CLKSOURCE R/W00=外部时钟源(STCLK) 1=内核时钟(FCLK)1TICKINT R/W01=SysTick 倒数到 0 时产⽣ SysTick 异常请求 0=数到 0 时⽆动作0ENABLE R/W0SysTick 定时器的使能位四个位都挺简单,对两个稍难的解释⼀下:TICKINT 该位置为1时,SysTick定时器倒数到零会产⽣中断COUNTFLAG 已经有了TICKINT为什么还要该位呢,原因是当TICKINT位置为0时,如果没有该位,就⽆法得知定时器是否已经倒数到0,因为倒数到0不会有任何动作。
SysTick重装载数值寄存器(地址:0xE000_E014)位段名称类型复位值描述23:0RELOAD R/W0当倒数⾄零时,将被重装载的值该寄存器24位,最⼤可装载值为FF FFFFSysTick当前数值寄存器(地址:0xE000_E018)位段名称类型复位值描述23:0CURRENT R/Wc0读取时返回当前倒计数的值,写它则使之清零,同时还会清除在 SysTick 控制及状态寄存器中的 COUNTFLAG 标志该寄存器被读取后,会清零,重装载寄存器就会将它⾥⾯的重装载值传递到该寄存器。
系统滴答定时器的应用 微控制器STM32原理与应用实验指导
系统滴答定时器的应用1 实验目的(1) 理解滴答定时器SysTick定时器的工作原理;(2) 学会使用中断函数。
2 实验任务(1) 编写SysTick定时器初始化程序;(2) 编写SysTick定时器的中断服务函数。
3 实验说明(1) SysTick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有SysTick定时器。
SysTick定时器就是系统滴答定时器,一个24位的倒计数定时器,计到0时,将从RELOAD寄存器中自动重新装载定时初值。
只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。
SysTick定时器常用来做延时,或者实时系统的心跳时钟。
这样可以节省MCU资源,不用浪费一个定时器。
比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用SysTick做UCOS心跳时钟。
(2) SysTick_CLKSourceConfig()// SysTick时钟源选择misc.c文件中SysTick_Config(uint32_t ticks)//初始化SysTick,时钟为HCLK,并开启中断。
以上就是滴答定时器常用的库函数了,第一个函数为滴答器选择时钟源。
时钟源的选择有以下两种:内部时钟源SysTick_CLKSource_HCLK和以及外部时钟源SysTick_CLKSource_HCLK_Div8,后者为前者的八分之一。
假如SysTick_CLKSource_HCLK为72MHz,那么SysTick_CLKSource_HCLK _Div8为9MHz。
前面提到滴答定时器其实是一个24位递减的定时器。
第二个函数用来初始化滴答定时器,也就是为其设置初值。
图3.1 时钟树4 预习要求(1) 了解STM32中的5个时钟源及时钟的分配;(2) 了解滴答定时器中寄存器的功能。
5 实验步骤(1) 打开工程文件;(2) 编写程序代码;(3) 编译无误后进行仿真;(4) 用J-Link将程序下载到实训平台上,观察实验现象。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SysTick系统滴答实验SysTick实际就是系统滴答定时器,主要是为了操作系统提供一个专用的硬件上的定时中断。
神舟系列的本例程通过SysTick定时器,产生的中断进行点灯控制。
我们按照以下的几个部分对SysTick实验进行学习。
z意义与作用SysTick定时器:系统滴答定时器是一个非常基本的倒计时定时器,用于在每隔一定的时间产生一个中断,即使是系统在睡眠模式下也能工作。
它使得OS 在各CM3器件之间的移植中不必修改系统定时器的代码,移植工作一下子容易多了。
如下图两个任务间通过SysTick 轮转调度的简单模式所示。
图表 1 两个任务间通过SysTick 轮转调度的简单模式SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。
在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。
例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。
因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。
Cortex‐M3处理器内部包含了一个简单的定时器。
因为所有的CM3芯片都带有这个定时器,软件在不同CM3器件间的移植工作得以化简。
该定时器的时钟源可以是内部时钟(FCLK,CM3上的自由运行时钟),或者是外部时钟( CM3处理器上的STCLK信号)。
不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视芯片的器件手册来决定选择什么作为时钟源。
SysTick定时器能产生中断,CM3为它专门开出一个异常类型,并且在向量表中有它的一席之地。
它使操作系统和其它系统软件在CM3器件间的移植变得简单多了,因为在所有CM3产品间对其处理都是相同的。
SysTick定时器是作为NVIC(嵌套向量中断控制器)的一部分实现的。
前面提到的,可以为系统提供一个“时基”(用于切换任务),同时,Systick的精准计时,也可以用来作为延迟。
对于时间要求严格的场合,SysTick的意义是相当重大的。
z实验原理SysTick其实就是一个24位的倒计数定时器,当计到0时,将从STK_LOAD寄存器中自动重装载定时初值。
只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。
下面先了解跟SysTick相关的几个寄存器。
SysTick_CSR 0xE000E010 -- 控制寄存器SysTick_LOAD 0xE000E014 -- 重载寄存器SysTick_VAL 0xE000E018 -- 当前值寄存器SysTick_CALRB 0xE000E01C -- 校准值寄存器由于SysTick是CortexM3的标准组件,关于技术细节详细请参见《Cortex-M3 技术参考手册》文档73页。
SysTick_CSR SysTick控制与状态装台寄存器复位状态为:0x00000000SysTick_CSR寄存器的位分配如下所示:以上各位的描述,如下表所示:SysTick_LOAD 重装值寄存器SysTick一个递减的计数器,当计数器递减到“0”时,重装寄存器中的值就会被重装。
SysTick_LOAD重装值寄存器是一个24位宽的寄存器,如下图所示:SysTick_VAL 当前值寄存器使用SysTick当前值寄存器来查找寄存器中的当前值。
具体寄存器的位分配如下所示:SysTick_CALRB 校准寄存器使用校准寄存器通过乘法或是除法运算可以将寄存器调节成任意所需的时钟速率,如下所示:z硬件设计SysTick为内部组件,这部分不需要硬件电路,这里仅在中断产生时,进行点灯操作。
z软件设计神舟IV号SysTick系统滴答实验位于神舟IV号开发板光盘的\源码\ STM32F10x_StdPeriph_Lib_V3.3.0.rar\ \Project\6、SysTick系统滴答(神舟IV号)目录。
进入6、SysTick系统滴答(神舟IV号)\EWARMv5 目录后,双击Project.eww可以打开IAR 工程,以下为工程文件中主要代码的解释与说明。
说明:本实例需要用到使用GPIO管脚控制LED的相关知识,关于LED的其它函数请查看“LED跑马灯实验”,此处不再介绍。
本历程中主要是针对SysTick示例中新增添的代码进行说明。
本次为SysTick系统滴答中断实验,所以需要配置SysTick系统滴答参数,使用SysTick_Configuration函数实现。
由其中的SysTick_Config(SystemCoreClock/ 100)函数可以看出,每秒中产生100次系统滴答中断。
SystemCoreClock代表系统的频率,就是说系统每秒钟会有SystemCoreClock个系统时钟,(SystemCoreClock/100)就是百分之一时钟数,所以百分之一的SystemCoreClock个时钟数产生一次中断,那么一秒钟就会有100次中断。
(注:SystemCoreClock表示系统主时钟频率,在STM32F10x_StdPeriph_Lib_V3.3.0的早期库中该参数为SystemFrequency)。
NVIC_SetPriority函数配置中断优选级。
以下的“InterruptConfig()”函数告诉处理器中断向量表存放的起始地址,STM32支持中断向量表起始地址动态设置,这个特性在SRAM调试和DFU固件升级时很有用,以为这些情况下中断向量表起始地址已经不是0x0000处。
此处将中断向量表起始地址设置为内部Flash 的起始地址0x08000000处。
本实例中该函数不是必须,可以不调用,只是为了大家以后修改程序方便而给出。
我们看一下主程序main的相关操作。
主要是LED的初始化和SysTick的中断配置。
如下:从上面的main函数可以看出,main函数中只是做了LED的初始化和SysTick的中断配置,如果没有中断产生则程序一直处于while死循环中。
LED灯的亮灭是在SysTick中断服务程序中控制。
下面,我们介绍了关于SysTick中断程序的实现。
本次SysTick系统滴答中断实验需要在该文件的void SysTick_Handler(void){}中断接口函数中调用我们的中断处理函数。
例如我们可以实现让一个LED指示灯每秒点亮熄灭一次。
我们在“stm32f10x_it.c”中的SysTick中断接口函数中调用LED_Spark函数控制LED灯闪烁。
声明一个外部LED_Spark函数,以使该函数在“stm32f10x_it.c”中可以被调用。
下面我们来看一下LED_Spark函数的具体实现:由上述分析可知每产生一次SysTick中断,进入SysTick中断服务程序,都调用了LED_Spark函数,而我们配置的是每秒中100次SysTick中断,那么LED_Spark函数每秒中会被调用100次,所以我们使用一个静态本地变量TimingDelayLocal来存放该函数被调用的次数。
该函数每一次被调用静态本地变量TimingDelayLocal便会减一,当减为0时重新赋值为100。
当静态本地变量TimingDelayLocal小于50时熄灭LED指示灯,大于等于50时(小于100)点亮LED指示灯,这样周而复始便可以使LED指示灯每秒闪烁一次。
为什么使用静态变量TimingDelayLocal?目的是每次进入LED_Spark函数数静态变量TimingDelayLocal保持上次退出时的值,这样才能达到计数的目的。
否则,如果去掉static关键字则每次每次进入LED_Spark函数时TimingDelayLocal为0,执行else后其值为100,退出函数,就达不到控制指示灯的目的。
至此神舟系列SysTick中断相关软件程序介绍完毕!z下载与验证神舟IV号光盘\源码\目录包含本实验的工程源码,在神舟IV号光盘\源码\06、SysTick系统滴答.rar\Project\6、SysTick系统滴答\EWARMv5\STM32F107VC-ARMJISHU\Exe目录下的ARMJISHU_SysTick系统滴答.hex文件即为前面我们分析的SysTick系统滴答实验编译好的固件,我们可以直接将固件下载到神舟IV号开发板中,观察运行效果。
如果使用JLINK下载固件,请按错误!未找到引用源。
错误!未找到引用源。
下载固件到神舟IV号开发板小节进行操作。
如果使用USB下载固件,请按错误!未找到引用源。
错误!未找到引用源。
小节进行操作。
如果使用串口下载固件,请按错误!未找到引用源。
错误!未找到引用源。
小节进行操作。
如果在IAR开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。
错误!未找到引用源。
小节进行操作。
如果在MDK开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。
错误!未找到引用源。
小节进行操作。
z实验现象将固件下载在神舟IV号STM32开发板后,可以看到神舟IV号开发板的四个LED灯(LED1~4)按一定的频率亮灭。
4个LED的具体位置如下图中红色区域所示。