Systick滴答定时器寄存器、delay()延时函数、SysTick_Config函数
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函数相关推荐
- [学习笔记]STM32F1 SYSTICK 滴答定时器(寄存器、标准库、HAL库)
目录 0. 博主理解: 1. 实验内容及步骤: 2. 硬件说明 3. 寄存器说明 3.1 SysTick的时钟和使能: 3.2 SysTick重装载数值寄存器: 3.3 SysTick的中断优先级: ...
- STM32 SysTick 滴答定时器原理及应用
SysTick滴答定时器 一.功能 SysTick定时器是一个简单的定时器,CM3\CM4内核芯片都具备此定时器.SysTick定时器常用来做延时,采用实时系统时则用来做系统时钟. 无论用作延时还是用 ...
- Systick滴答定时器解析
Systick滴答定时器 Systick定时器是什么 Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器. Systick定时器常用来做延时,或者时系统的心 ...
- STM32F4无人机Systick滴答定时器
更多交流欢迎关注作者抖音号:81849645041 目标 了解 ARM Cortex-M 系列芯片的内部时钟及定时器使用,通过配置 STM32F407 芯片的内部定时器,实现流水灯效果. 原理 Sys ...
- 滴答定时器的计数模式_Cortex-M4 Systick滴答定时器
Tickclock可以实现精确延时,在K60的datasheet中没有详细将,现在我把我找到资料分享一下,关于systick在Cortex-M4中有讲到我们大家平常在单片机开发中经常会使用到延时函数, ...
- NXP JN5169使用滴答定时器进行精准延时
NXP JN5169使用滴答定时器进行精准延时(us.ms) 一.滴答定时器介绍 二.滴答定时器系统图 1.系统图介绍 2.单次触发模式 3.可重启模式 4.连续运行模式 三.系统时钟 1.系统时钟域 ...
- Systick滴答定时器讲解
Systick定时器基础知识讲解: Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有- Systick定时器. Systick定时器常用来做延时,或者实时系统的心跳时钟.这样 ...
- 一图弄清滴答定时器寄存器 SysTick Registers
- STM32F103五分钟入门系列(八)SysTick滴答定时器+SysTick中断实现跑马灯
学习板:STM32F103ZET6 往期博客: STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结 STM32F103五分钟入门系列(二)GPIO的七大寄存器+G ...
最新文章
- ef mysql 时间_关于c#:EF6和MySQL时区支持
- 一车abs线路怎么量_神木沥青拌合站烧火油怎么购买更划算
- python_基础知识回顾总结
- Chrome网页性能分析工具
- thinkphp下nginx重写index.php
- Oracle Clusterware工具3
- python 根据关键字 切割pdf_用python拆分pdf
- 计算机图形学--全局光照RSM
- linux设置双屏拼接_Linux 与Windows(A卡、N卡)下折腾双屏、3屏拼接
- Internet网络行为学
- ICP算法原理及优缺点(简洁明了)
- linux(三剑客之sed) sed字符串替换命令详解
- 获取当天零点/最晚时间戳
- GAMMA初学笔记一
- Go语言核心之美 3.4-Struct结构体
- 深度解析B端设计规范如何落地?
- android 平板桌面,RUI平板桌面
- 计算机如何连接网络扫描仪,如何添加局域网网络扫描仪
- Authorization
- PPP中的pap和chap认证
热门文章
- 驻定相位原理(POSP)的简单应用
- centos7静默搭建oracle11g,Linux静默安装Oracle方法(centos7+oracle11g)
- 双网卡oracle rac,Linux+Oracle 10g RAC双网卡绑定和解除绑定的实现(2)
- combox 增加请选择_本命佛怎么请?
- postgresql数据库去重方法
- C++轮子队-第三周(需求改进原型设计)
- Fast Matrix Operations
- [转] C#异步操作
- ARM(IMX6U)裸机按键输入实验(BSP+SDK、GPIO输入与输出、按键消抖)
- 协方差公式性质证明过程_论文推荐 | 刘志平:等价条件平差模型的方差-协方差分量最小二乘估计方法...