SysTick定时器
SysTick定时器,是一个简单的定时器,对于CM3、CM4内核的芯片都有SysTick定时器。SysTick 是一个 24 位的倒计数定时器,当计数到 0 时,将从RELOAD 寄存器中自动重装载定时初值,开始新一轮计数。只要不把它在 SysTick 控制及状态寄存器中的使能位清除(不把Systick定时器关掉),就永不停息。SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。

作用:

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

Systick寄存器:

  • CLRL寄存器:Systick控制和状态寄存器
  • LOAD寄存器:Systick自动重装载寄存器
  • VAL寄存器:Systick当前值寄存器
  • CALIB寄存器:Systick校准值寄存器

Systick控制和状态寄存器-CTRL
对于STM32,外部时钟源是HCLK(AHB总线时钟的1/8)内核时钟是HCLK时钟。
配置函数:Systick_CLKSourceConfig();

Systick重装载数值寄存器-LOAD(24位)

Systick当前值定时器-VAL

Systick校准寄存器-CAL

固件库中的Systick相关函数:
SysTick_CLCSourConfig()//Systick时钟源选择,在misc.c文件中。
SysTick_config(uint32_t ticks)//初始化systick时钟为HCLK,并开启中断,在core_cm3/core_cm4文件中。

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,SysTick_Config()这个函数是设置两次中断之间的时间。{while (1);}while(1){ Delay(200);//200ms… }
}

SysTick_Config函数:

SysTick_Config的参数,其实就是一个时钟次数,叫systick重装定时器的值。意思就是我要多少个1/fosc 时间后中断一下。根据学过的物理中的时间与频率的公式:fosc=1/T T=1/fosc ,fosc为Systick的频率。如果STSystick时钟频率为:72MHz,每次的时间为:T=1/72MHz。1秒钟为:1/(每次的时间)=1/(1/72MHz)=72 000 000次。1MHz是:1000 000。反过来讲。SysTick_Config(72000)代表:72000*(1/72MHz)=1/1000=1(ms)。即定时为1ms。如果需要1S则可以通一设置一个全局变量,然后定初值得为1000,这样每个systick中断一次,这个全局变量减1,减到0,即systick中断1000次,时间为:1ms1000=1S。从而实现1S的定时。 因为SysTick定时器是:24位的,最大定时时间为:2的24次方(1/72MHz)的时间,这里Systick频率为:72MHz的情况下。

delay_init()函数:

static u8  fac_us=0;//us延时倍乘数
static u16 fac_ms=0;//ms延时倍乘数,在ucos下,代表每个节拍的ms数
void delay_init()
{#if SYSTEM_SUPPORT_OS                           //如果需要支持OS.u32 reload;
#endifSysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//选择外部时钟  HCLK/8fac_us=SystemCoreClock/8000000;//为系统时钟的1/8  相当于72000000/8000000等于九//一次是1/systick的时钟频率就是1/9 us,fac_us相当于1us,这里的将9赋值给他是给寄存器LOAD计数用的,从9到1就是1us
#if SYSTEM_SUPPORT_OS  //如果需要支持OS.reload=SystemCoreClock/8000000;//每秒钟的计数次数 单位为M  reload*=1000000/delay_ostickspersec;//根据delay_ostickspersec设定溢出时间//reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右   fac_ms=1000/delay_ostickspersec;//代表OS可以延时的最少单位       SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//开启SYSTICK中断SysTick->LOAD=reload; //每1/delay_ostickspersec秒中断一次 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK    #elsefac_ms=(u16)fac_us*1000;//非OS下,代表每个ms需要的systick时钟数
#endif
}

void delay_us()函数:

void delay_us(u32 nus)
{       u32 temp;            SysTick->LOAD=nus*fac_us;                  //时间加载           SysTick->VAL=0x00;                         //清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数    do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16)));     //等待时间到达   SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器SysTick->VAL =0X00;                           //清空计数器
}

void delay_ms()函数:

void delay_ms(u16 nms)
{                 u32 temp;        SysTick->LOAD=(u32)nms*fac_ms;               //时间加载(SysTick->LOAD为24bit)SysTick->VAL =0x00;                           //清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数  do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16)));       //等待时间到达   SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器SysTick->VAL =0X00;                          //清空计数器
}
  • T=1/1KHZ=1ms=1微秒=1/1000秒
  • T=1/1MHZ=1us=1微秒=1/1000000秒
  • 10MHz=1/10us=0.1us
  • 20MHz=1/20us=0.05us
  • 50MHz=1/50us=0.02us
  • 1GHz=1ns=1纳秒=1/1000000000秒
  • 1MHZ=1000KHZ=1000000HZ
  • 1GHZ=1000MHZ

Systick滴答定时器寄存器、delay()延时函数、SysTick_Config函数相关推荐

  1. [学习笔记]STM32F1 SYSTICK 滴答定时器(寄存器、标准库、HAL库)

    目录 0. 博主理解: 1. 实验内容及步骤: 2. 硬件说明 3. 寄存器说明 3.1 SysTick的时钟和使能: 3.2 SysTick重装载数值寄存器: 3.3 SysTick的中断优先级: ...

  2. STM32 SysTick 滴答定时器原理及应用

    SysTick滴答定时器 一.功能 SysTick定时器是一个简单的定时器,CM3\CM4内核芯片都具备此定时器.SysTick定时器常用来做延时,采用实时系统时则用来做系统时钟. 无论用作延时还是用 ...

  3. Systick滴答定时器解析

    Systick滴答定时器 Systick定时器是什么 Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器. Systick定时器常用来做延时,或者时系统的心 ...

  4. STM32F4无人机Systick滴答定时器

    更多交流欢迎关注作者抖音号:81849645041 目标 了解 ARM Cortex-M 系列芯片的内部时钟及定时器使用,通过配置 STM32F407 芯片的内部定时器,实现流水灯效果. 原理 Sys ...

  5. 滴答定时器的计数模式_Cortex-M4 Systick滴答定时器

    Tickclock可以实现精确延时,在K60的datasheet中没有详细将,现在我把我找到资料分享一下,关于systick在Cortex-M4中有讲到我们大家平常在单片机开发中经常会使用到延时函数, ...

  6. NXP JN5169使用滴答定时器进行精准延时

    NXP JN5169使用滴答定时器进行精准延时(us.ms) 一.滴答定时器介绍 二.滴答定时器系统图 1.系统图介绍 2.单次触发模式 3.可重启模式 4.连续运行模式 三.系统时钟 1.系统时钟域 ...

  7. Systick滴答定时器讲解

    Systick定时器基础知识讲解: Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有- Systick定时器. Systick定时器常用来做延时,或者实时系统的心跳时钟.这样 ...

  8. 一图弄清滴答定时器寄存器 SysTick Registers

  9. STM32F103五分钟入门系列(八)SysTick滴答定时器+SysTick中断实现跑马灯

    学习板:STM32F103ZET6 往期博客: STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结 STM32F103五分钟入门系列(二)GPIO的七大寄存器+G ...

最新文章

  1. ef mysql 时间_关于c#:EF6和MySQL时区支持
  2. 一车abs线路怎么量_神木沥青拌合站烧火油怎么购买更划算
  3. python_基础知识回顾总结
  4. Chrome网页性能分析工具
  5. thinkphp下nginx重写index.php
  6. Oracle Clusterware工具3
  7. python 根据关键字 切割pdf_用python拆分pdf
  8. 计算机图形学--全局光照RSM
  9. linux设置双屏拼接_Linux 与Windows(A卡、N卡)下折腾双屏、3屏拼接
  10. Internet网络行为学
  11. ICP算法原理及优缺点(简洁明了)
  12. linux(三剑客之sed) sed字符串替换命令详解
  13. 获取当天零点/最晚时间戳
  14. GAMMA初学笔记一
  15. Go语言核心之美 3.4-Struct结构体
  16. 深度解析B端设计规范如何落地?
  17. android 平板桌面,RUI平板桌面
  18. 计算机如何连接网络扫描仪,如何添加局域网网络扫描仪
  19. Authorization
  20. PPP中的pap和chap认证

热门文章

  1. 驻定相位原理(POSP)的简单应用
  2. centos7静默搭建oracle11g,Linux静默安装Oracle方法(centos7+oracle11g)
  3. 双网卡oracle rac,Linux+Oracle 10g RAC双网卡绑定和解除绑定的实现(2)
  4. combox 增加请选择_本命佛怎么请?
  5. postgresql数据库去重方法
  6. C++轮子队-第三周(需求改进原型设计)
  7. Fast Matrix Operations
  8. [转] C#异步操作
  9. ARM(IMX6U)裸机按键输入实验(BSP+SDK、GPIO输入与输出、按键消抖)
  10. 协方差公式性质证明过程_论文推荐 | 刘志平:等价条件平差模型的方差-协方差分量最小二乘估计方法...