stm32滴答计时器_第三讲 STM32 SysTick---系统滴答定时器
一、Systick简介
Systick也叫系统滴答定时器,滴答定时器就是一个非常基本的倒计时定时器。它存在的意义是为系统提供一个时基,能够给操作系统提供一个硬件上的中断。使用Systick能够精准延时,对于时间要求严格的场所,意义十分重大,我将写一个流水灯改进版----精确延时(可调控)的流水灯。
二、Systick timer
Systick是一个24位的定时器,一次最多可以计数2^24个时钟脉冲,这个脉冲计数值保存在当前计数值寄存器STK_VAL(Systick current value register)中,只能向下计数,每接收到一个时钟脉冲,STK_VAL的值就会向下减1,当减到0时,硬件会自动把重装载寄存器STK_LOAD(Systick reload value register)中保存的数据加载到STK_VAL,重新开始向下计数。如果STK_VAL的值被减至0时,会触发异常产生中断。
三、相关寄存器介绍
除了上面说的STK_VAL,下面带大家了解相关的寄存器和寄存器位。
1. SysTick_CSR 控制状态寄存器
Bit0: ENABLE
SysTick timer的使能位,1使能Systick timer,0关闭Systick timer
Bit1: TICKINT
异常触发使能位,TICKINT=1,STK_VAL计数到0触发异常;TICKINT=0,不触发异常
Bit2: CLKSOURCE
Systick时钟选择位,SysTick = 1,时钟为AHB时钟;0时钟位AHB/8
Bit16:COUNTFLAG
计数为0标志位, 当STK_VAL计数到0,此标志位会被置1
2. SysTick_LOAD 重装载寄存器
0-23 24位的重装值,这也是为什么只能计数到2^24
3. SysTick_VAL 当前值寄存器
4. SysTick_CALRB 校准寄存器
由于我们要写精确延时的LED流水灯,所以我们需要使用Systick进行精确延时,理论上它的最小计时单位为AHB的时钟周期,1/72000000秒,72分之一微秒。
我们在昨天流水灯的基础上,新建两个文件,SysTick.c和SysTick.h
具体代码如下
SysTick.h
#ifndef __SYSTICK_H__
#define __SYSTICK_H__
#include "stm32f10x.h"
void SysTick_Init(void);
void Delay_us(__IO u32 nTime);
#endif
SysTick.c
#include "SysTick.h"
#include "stm32f10x.h"
static __IO u32 TimingDelay;
void SysTick_Init(void)
{
if(SysTick_Config(SystemCoreClock/100000))
{
while(1);
}
//关闭滴答定时器
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
void TimingDelay_Decrement(void)
{
if(TimingDelay != 0x00)
{
TimingDelay--;
}
}
void Delay_us(__IO u32 nTime)
{
TimingDelay = nTime;
//使能滴答定时器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
while(TimingDelay != 0);
}
中断函数,在stm32f10xit.c
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
修改main.c如下
#include "stm32f10x.h"
#include "led.h"
#include "SysTick.h"
int main(void)
{
//LED端初始化
LED_GPIO_Config();
//配置SysTick为10us中断一次
SysTick_Init();
while(1)
{
LED1(0);
Delay_us(50000);
LED1(1);
LED2(0);
Delay_us(50000);
LED2(1);
LED3(0);
Delay_us(50000);
LED3(1);
LED4(0);
Delay_us(50000);
LED4(1);
}
}
这里面只有两个函数,SysTick_Init()和Delay_us(),一个是配置SysTick定时器,一个是进行精确延时
中断函数也只是运行了一个自定义函数,看看不难理解
SysTick_Config(SystemCoreClock/100000);
SystemCoreClock是系统时钟的宏,SystemCoreClock = 72000000
我们的计时总时间 T = tick * (1/f),tick为SysTick_Config()的输入参数
1/f为SysTick timer使用的时钟源的时钟周期,f为该时钟源的时钟频率。
上面的语句中:tick = SystemCoreClock/100000=720,表示720个时钟周期中断一次,1/f是时钟周期的时间,1/f = 1/72us,所以T = 720*(1/72) = 10us
SysTick_CTRL_ENABLE_Msk,这是一个宏,用来指示寄存器的特定位置或进行位屏蔽用的,那么他是如何定义的呢?
其中的寄存器位指示宏:SysTick_xxx_Pos, 宏展开后为xxx在相应寄存器中的位置,如控制SysTick时钟源的SysTick_CTRL_CLKSOURCE_Pos,宏展开后为2,正好是SysTick_CSR中的Bit2
寄存器的位屏蔽宏:SysTick_xxx_Msk,宏展开是xxx的位全部置1后,左移SysTick_xxx_Pos位,1ul使之无符号长整型,上图中SysTick_CTRL_CLKSOURCE_Msk,宏展开为1ul<
stm32滴答计时器_第三讲 STM32 SysTick---系统滴答定时器相关推荐
- SysTick系统滴答定时器
工作原理 SysTick系统滴答定时器是一个24位递减计数器计数器,向下计数,最大计数值为() SysTick系统滴答定时器,每个时钟周期-1,减到0后申请中断,并且会自动重装初值. 注意: 定时器的 ...
- SysTick系统滴答定时器(STM32F4xx系列)
定时器概念 1.1 定时器的含义 1.2片上外设的定时器 1.3定时/延时原理 系统滴答定时器 2.1 为什么需要系统滴答定时器 2.2 系统滴答定时器概述 2.3 系统滴答定时器框架 2.4 系统滴 ...
- stm32滴答计时器_stm32笔记:Systick系统滴答定时器
Systick :系统心跳定时器,提供系统节拍 裸机程序中可作为独立的延时定时器 用途: 1.产生操作系统的时钟节拍 2.便于不同处理器之间程序移植 SysTick定时器被捆绑在NVIC中,异常号15 ...
- 科大奥锐密立根油滴实验数据_大学物理实验--密立根油滴实验报告
实验报告模板 实验题目: 密里根油滴实验 学 号 姓名 实验日期 实 验 目 的 1. 学习密立根油滴实验的设计思想: 2. 通过对带电油滴在重力场和静电场中运动的测量,验证电荷的不连续性,并测定基本 ...
- unity 计时器_如何用unity 物理系统 实现Stickfight中火柴人的布娃娃效果(二)
上一期中,我们完成了角色在没有任何输入的情况下实现了站立平衡,这期,我们就来聊一下角色的运动吧. 玄夜smile:如何用unity 物理系统 实现Stickfight中火柴人的布娃娃效果(一) ,还没 ...
- 【STM32F407 开发板】实验六 :SysTick 系统滴答实验
前言: 这是第六个实验,实验五的博客我没有写,不是因为太简单了,而是因为太难了,当初给我直接干蒙圈了,其实实验五的代码很简单,就是深入底层配置寄存器原理,我就直接跪了,想要把实验五的博客写出来,至少又 ...
- STM32系统滴答_及不可不知的延时技巧
我想每个单片机爱好者及工程开发设计人员都有过点灯的经历.流水灯是个好东西,尤其是在调试资源有限的环境中,有时会帮上大忙. 然在最初入门时,如何让这些小灯们按照我们的想法欢快地跑起来呢,绝大多数小朋友的 ...
- STM32系统滴答_及不可不知的延时技巧 - (上)
文章转载自https://my.oschina.net/czzhu/blog/228596:作者:小汉憨憨 摘要: 尤应强调注意的是SysTick 中断优先级. 我想每个单片机爱好者及工程开发设计人员 ...
- stm32滴答计时器_STM32之系统滴答定时器
一.SysTick(系统滴答定时器)概述 操作系统需要一个滴答定时器周期性产生中断,以产生系统运行的节拍.在中断服务程序里,基于优先级调度的操作系统会根据进程优先级切换任务,基于时间片轮转系统会根据时 ...
最新文章
- 语雀图片与七牛云之间的迁移同步
- 小白的AFNetWorking之路
- JDBC连接数据库格式
- 修改内核配置解决busybox的mdev -s启动速度慢的问题
- 六、张正友标定法小结
- sql server 数据库忘记sa账户密码/ 无管理员账户解决办法
- 华为服务器双系统教程,服务器上安装双系统
- JetBrains IDEA实用快捷键
- 如何使用Deckset配置编辑命令
- golang 腾讯云直播开发日记(一)
- 智能信息处理专业是干嘛的?
- UI——PS色彩搭配
- 一生受用的8个国外电子书免费下载网站(值得收藏
- 【STM32】WS2812B灯珠的PWM+DMA控制(库函数)
- 三维实时云渲染平台解决方案
- NOIP2015普及组复赛T4——推销员
- Thingworx 调用外部接口
- 【RISC-V】SiFive Unmatched开发板开发手记
- eclipse源码中文注释乱码问题解决方法
- 理解webpack中的devTool的配置项
热门文章
- [公告]本博客已迁移到 tpu01yzx.me
- centos 编译libevent_CentOS7.6 源码安装 libevent-2.1.8-stable
- CHOOSE()函数与RANDBETWEEN()函数的共用
- Animation Rigging创建模板动画(三)
- 【VLAN技术原理详解与实战】图文并茂,让你看一遍就理解VLAN
- 【成功解决】‘nvidia‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件
- Spring:多配制信息整合
- regionprops函数使用
- MyBatis自定义类型处理器(typeHandler)
- ACCP 8.0 jQuery 第八章 上机练习