Systick定时器详解

Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器。

Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。

Systick定时器就是系统滴答定时器,一个24位的倒计数定时器,计到0时,将从RELOAD寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。

SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。

4个Systick寄存器:

CTRL            SysTick 控制和状态寄存器

LOAD           SysTick 自动重装载除值寄存器

VAL    SysTick 当前值寄存器

CALIB          SysTick 校准值寄存器

SysTick 控制和状态寄存器- CTRL

主要只用到上面四位

对于STM32,外部时钟源是 HCLK(AHB总线时钟)的1/8,内核时钟是 HCLK时钟,根据配置函数SysTick_CLKSourceConfig()的入口参数来确定使用的是哪个时钟源

SysTick 重装载数值寄存器- LOAD

SysTick 当前值寄存器- VAL

固件库中的Systick相关函数:

SysTick_CLKSourceConfig() //Systick时钟源选择 misc.c文件中

SysTick_Config(uint32_t ticks) //初始化systick,时钟为HCLK,并开启中断,在core_cm3.h/core_cm4.h文件中;入口参数ticks确定了一秒钟中断多少次

SysTick中断服务函数:void SysTick_Handler(void);

用中断的方式实现delay:

static __IO uint32_t TimingDelay;
void Delay(__IO uint32_t nTime)
{
   TimingDelay = nTime;
   while(TimingDelay != 0);
}
void SysTick_Handler(void)
{
    if (TimingDelay != 0x00)
     {
       TimingDelay--;
     }
}
 int main(void)
 {  …
    if (SysTick_Config(SystemCoreClock / 1000)) //systick时钟为HCLK,中断时间间隔1ms,(SystemCoreClock / 1000)这个算的是次数,假设SystemCoreClock为72MHz,那么(SystemCoreClock / 1000)的值为72000次,也就是要执行72000次,频率为72000000,所以每1ms执行一次
  { while (1); } while(1) { Delay(200);//2ms  … } }

原文地址:https://www.cnblogs.com/roscangjie/p/11785227.html

时间: 2024-11-05 22:39:28

Systick定时器详解的相关文章

STM32F103的11个定时器详解(转)

源:STM32F103的11个定时器详解 STM32F103系列的单片机一共有11个定时器,其中:2个高级定时器4个普通定时器2个基本定时器2个看门狗定时器1个系统嘀嗒定时器 出去看门狗定时器和系统滴答定时器的八个定时器列表; 8个定时器分成3个组:TIM1和TIM8是高级定时器TIM2-TIM5是通用定时器TIM6和TIM7是基本的定时器这8个定时器都是16位的,它们的计数器的类型除了基本定时器TIM6和TIM7都支持向上,向下,向上/向下这3种计数模式 计数器三种计数模式向上计数模式:从0开

Node中的定时器详解

在大多数的业务中,我们都会有一些需求,例如几秒钟实现网页的跳转,几分钟对于后台数据进行清理,node与javascript都具有将代码延迟一段时间的能力.在node中可以使用三种方式实现定时功能:超时时间,时间间隔和即时定时器.虽然有这三种定时器功能但是在平常的业务中使用还是有差别的,下来我们就一起讨论一下这三种定时器. 1.用超时时间来延迟工作 超时定时器用于将工作延迟一个特定的时间数量,当时间到了,回调函数执行,而定时器会消失.(建议:对于只执行一次的工作,使用超时时间). 1秒之后执行my

linux 内核定时器详解

原文摘自:http://www.linux-cn.com/html/linux/kernel/20070412/1886.shtml Linux内核2.4版中去掉了老版本内核中的静态定时器机制,而只留下动态定时器.相应地在timer_bh()函数中也不再通过run_old_timers()函数来运行老式的静态定时器.动态定时器与静态定时器这二个概念是相对于Linux内核定时器机制的可扩展功能而言的,动态定时器是指内核的定时器队列是可以动态变化的,然而就定时器本身而言,二者并无本质的区别.考虑到静

STM32 通用T2、T3、T4、T5定时器详解

定时器初始化配置 1 void TIM3_Configuration(void)//1MS 2 { 3 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 4 5 TIM_DeInit(TIM3);//开一下时钟再关闭 6 /* 设置TIM2CLK 为 72MHZ */ 7 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE); 8 9 10 /* 自动重装载寄存器周期的值(计数值) */ 11 TIM

Android初级教程启动定时器详解

本案例知识是:后台执行定时任务. Alarm机制: 一.创建LongRunningService类 package com.example.servicebestpractice; import java.util.Date; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.Service; import android.content.Intent; import and

Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解

原创整理不易,转载请注明出处:Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解 代码下载地址:http://www.zuidaima.com/share/1772648445103104.htm 有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz. 1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 import java.util.TimerTask; p

单机架设传奇服务器第47课:定时器OnTimer功能详解

传奇定时器OnTimer功能详解(泡点.时间触发.任务活动) 定时器功能,是服务端中非常常见的一种功能,常见如:泡点脚本.赌博脚本,任务活动指定时间刷怪,时间触发一些都需要用到OnTimer功能,定时器总共有19个定时器可以开启.我们在添加新的定时器的时候我们先确定定时器有没有重复.直接在文本中搜索 @OnTimer 就可以了..后面跟的数字就是说明开启的是第几个定时器 我们首先就确定定时器是在服务器的位置.路径:mirserver\Mir200\Envir\MapQuest_def\QMana

第14章 启动文件详解—零死角玩转STM32-F429系列

第14章     启动文件详解 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章参考资料<STM32F4xx 中文参考手册>第十章-中断和事件:表 46. STM32F42xxx 和 STM32F43xxx 的向量表:MDK中的帮助手册—ARM Development Tools:用来查询ARM的汇编指令和编译器相关的指令. 14.1 启动文件简介 启动文件由汇编编写,是

第14章 启动文件详解

第14章     启动文件详解 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章参考资料<STM32F4xx 中文参考手册>第十章-中断和事件:表 46. STM32F42xxx 和 STM32F43xxx 的向量表:MDK中的帮助手册-ARM Development Tools:用来查询ARM的汇编指令和编译器相关的指令. 14.1 启动文件简介 启动文件由汇编编写,是