一、SysTick—系统定时器简介

SysTick—系统定时器是属于CM3内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit的向下递减的计数器, 计数器每计数一次的时间为1/SYSCLK,一般我们设置系统时钟SYSCLK等于72M。当重装载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,以此循环往复。

因为SysTick是属于CM3内核的外设,所以所有基于CM3内核的单片机都具有这个系统定时器,使得软件在CM3单片机中可以很容易的移植。 系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。

二、SysTick寄存器介绍

SysTick—系统定时器有4个寄存器,简要介绍如下。在使用SysTick产生定时的时候,只需要配置前三个寄存器,最后一个校准寄存器不需要使用。


SysTick 属于内核的外设,有关的寄存器定义和库函数都在内核相关的库文件core_cm3.h中。

三、 SysTick定时实验

功能:利用SysTick产生1s的时基,LED以1s的频率闪烁。

编程要点

1、设置重装载寄存器的值

2、清除当前数值寄存器的值

3、配置控制与状态寄存器

SysTick_Config()库函数主要配置了SysTick中的三个寄存器:LOAD、VAL和CTRL。
用固件库编程的时候我们只需要调用库函数SysTick_Config()即可,形参ticks用来设置重装载寄存器的值, 最大不能超过重装载寄存器的值224,当重装载寄存器的值递减到0的时候产生中断,然后重装载寄存器的值又重新装载往下递减计数, 以此循环往复。紧随其后设置好中断优先级,最后配置系统定时器的时钟等于AHBCLK=72M,使能定时器和定时器中断,这样系统定时器就配置好了,一个库函数搞定。

//SysTick配置库函数
__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_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);// 设置当前数值寄存器SysTick->VAL   = 0UL;// 设置系统定时器的时钟源为AHBCLK=72M// 使能系统定时器中断// 使能定时器SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |SysTick_CTRL_TICKINT_Msk   |SysTick_CTRL_ENABLE_Msk;return (0UL);
}

SysTick 初始化函数

 /**
* @brief 启动系统滴答定时器 SysTick
* @param 无
* @retval 无
*/
void SysTick_Init(void)
{/* SystemFrequency / 1000 1ms 中断一次
* SystemFrequency / 100000 10us 中断一次
* SystemFrequency / 1000000 1us 中断一次
*/
if (SysTick_Config(SystemCoreClock / 100000)) {/* Capture error */
while (1);
}
}

SysTick 定时时间的计算
当设置好中断时间 T INT 后,我们可以设置一个变量 t,用来记录进入中断的次数,那
么变量 t 乘以中断的时间 TINT 就可以计算出需要定时的时间。

SysTick 定时函数
现在我们定义一个微秒级别的延时函数,形参为 nTime,当用这个形参乘以中断时间
TINT 就得出我们需要的延时时间,其中 TINT 我们已经设置好为 10us。关于这个函数的具体
调用看注释即可。

/*
us 延时程序,10us 为一个单位
Delay_us( 1 ) 则实现的延时为 1 * 10us = 10us
*/
void Delay_us(__IO u32 nTime)
{TimingDelay = nTime;while (TimingDelay != 0);
}

函数 Delay_us()中我们等待 TimingDelay 为 0,当 TimingDelay 为 0 的时候表示延时时
间到。变量 TimingDelay 在中断函数中递减,即 SysTick 每进一次中断即 10us 的时间
TimingDelay 递减一次。

//SysTick 中断服务函数
void SysTick_Handler(void){TimingDelay_Decrement();
}

中断复位函数调用了另外一个函数 TimingDelay_Decrement(),原型如下:

/*
获取节拍程序
在 SysTick 中断函数 SysTick_Handler()调用
*/
void TimingDelay_Decrement(void)
{if (TimingDelay != 0x00) {TimingDelay--;
}
}

TimingDelay 的值等于延时函数中传进去的 nTime 的值,比如 nTime=100000,则延时
的时间等于 100000*10us=1s。

主函数

int main(void)
{/* LED 端口初始化 */
LED_GPIO_Config();/* 配置 SysTick 为 10us 中断一次,时间到后触发定时中断,
*进入 stm32fxx_it.c 文件的 SysTick_Handler 处理,通过数中断次数计时
*/
SysTick_Init();while (1) {LED_ON;
Delay_us(100000); // 10000 * 10us = 1000msLED2_ON;
Delay_us(100000); // 10000 * 10us = 1000msLED3_ON;
Delay_us(100000); // 10000 * 10us = 1000ms
}
}

主函数中初始化了 LED 和 SysTick,然后在一个 while 循环中以 1s的频率让 LED 闪烁。

STM32——SysTick 定时器讲解(代码)相关推荐

  1. stm32 systick定时器

    systick定时器是系统滴答定时器,一个24位的倒计时定时器,计到0时,将从RELOAD寄存器中自动装载定时初值,只要不把它在Systick控制及状态寄存器中的使能位清楚,就永不停息,即使在睡眠状态 ...

  2. 填坑-关于SysTick定时器

    目录 01.坑的由来 02.填坑 03.修改代码验证 04.总结 本文主要来填坑,更正之前文章的错误.也进一步加深了我对SysTick定时器的理解,希望对你有帮助. 01.坑的由来 在之前的推文中&l ...

  3. Systick滴答定时器讲解

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

  4. STM32延时函数的四种方法:普通延时(2种)、SysTick 定时器延时(2种)

    STM32延时函数的三种方法:普通延时.SysTick 定时器延时(1.中断方式:2.非中断方式) 单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ ...

  5. STM32系统定时器SysTick

    1. SysTick系统定时器概述 学习完STM32的中断,下来就要学习STM32的定时器.就像电话最基本的功能是与人通话一样,定时器最基本的功能就是定时(STM32有些定时器的功能强大得超乎想象,当 ...

  6. STM32的SysTick定时器记录一篇

    CSDN博客主页 ID : Eterlove 一笔一画,记录我的学习生活!站在巨人的肩上Standing on Shoulders of Giants! 该文章为原创,转载请注明出处和作者! 前言 我 ...

  7. STM32开发 -- Systick定时器

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/81630311 一.Systick定时器介绍 参看:STM32菜鸟成长记录-系 ...

  8. 【STM32】SysTick定时器

    00. 目录 文章目录 00. 目录 01. SysTick定时器概述 02. SysTick定时器寄存器描述 03. 相关函数实现 04. 延时函数实现 05. 应用示例 06. 附录 07. 声明 ...

  9. STM32系统定时器SysTick(只能向下递减)延时闪烁灯

    参考:stm32 系统定时器 SysTick 作者:点灯小哥 发布时间: 2021-03-10 13:46:00 网址:https://blog.csdn.net/weixin_46016743/ar ...

最新文章

  1. machine learning (5)---learning rate
  2. Android Lint 去除重复资源 之 idea探究
  3. 软件概要设计与详细设计的区别
  4. LeetCode题 - 1 两数之和
  5. spring定时,cronExpression表达式解释
  6. python人工智能小程序_推荐几款“真”人工智能技术小程序
  7. 乐优商城项目实战系列2
  8. Mysql函数group_concat、find_in_set进行数据库字段值翻译
  9. 点到线的距离计算公式
  10. CAML语法- Query写法
  11. MMORPG网络游戏开发之网络通信
  12. 想进国企央企,一定要保存好所有工作履历证明材料,包括劳动合同、离职证明、社保记录等!...
  13. 什么是搜索引擎留痕?
  14. bash管道符开启子进程
  15. linux系统下如何修改开机图片,Ubuntu Kylin下修改登录背景,用户头像,开机动画及自动更换壁纸...
  16. react native fect network request failed
  17. 如何查看电脑是否支持CUDA及支持的CUDA版本
  18. 200行代码,10大知识点,3天做游戏!让你“爽爽爽”的学习利器!
  19. Non-negative Matrix Factorization 非负矩阵分解
  20. NIS(网络信息服务)的功能及使用

热门文章

  1. fit函数 model_tensorflow中model.fit()用法
  2. 艰难的起步---微信小程序访问MSSQL数据库实例
  3. char* strlen()学习
  4. 关于 Android okhttp 使用 HTTPS 的学习记录
  5. 学习PLC的重要知识点,你知道哪些?
  6. 喜马拉雅忙着上市,蜻蜓FM忙着融资
  7. synchronized同步机制——如果你愿意一层一层剥开我的心
  8. 带你看数据挖掘与机器学习-厦大EDP上课出勤预测
  9. 2021校园PHP表白墙程序源码
  10. ffmpeg开发 av_init_packet()和av_new_packet()