2.STM32 SysTick定时器

这篇具有很好参考价值的文章主要介绍了2.STM32 SysTick定时器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、SysTick定时器概念

SysTick定时器是一种在嵌入式系统中常用的定时器,它是由ARM Cortex-M处理器核内置的定时器。SysTick定时器具有精简、低功耗和易用的特点,可以用来实现各种定时、延时和时间基准等功能。

二、SysTick定时器的主要特性

  1. 单调递增计数器:SysTick定时器内置一个递增的32位计数器,在每个时钟周期中自动递增。

  2. 可编程计数器值:可以使用32位计数器的值设置定时器的计数周期。

  3. 中断触发:可以配置SysTick中断,当计数器达到设定值时,会触发中断请求。

  4. 低功耗:SysTick定时器可以在低功耗的模式下运行,以节省能源。

  5. 优先级:可以设置SysTick定时器中断的优先级,用于控制中断处理的优先顺序。

三、SysTick定时器时钟源--时钟树

stm32中systick定时器,STM32F40x ,stm32,单片机,嵌入式硬件

四、4个寄存器控制SysTick定时器

        1. 状态控制寄存器:系统滴答是一个递减计数器--从大减到0,选择SysTick->CTRL

相关内容如下图:

stm32中systick定时器,STM32F40x ,stm32,单片机,嵌入式硬件

SysTick控制及状态寄存器(地址:0xE000_E010)图

解释图中的内容如下:

1)位0--系统滴答定时器的使能位-----把这个位写1,就是开始计数

注:先配置好时间,再开始计数,计数时间到,要关闭

(2)位2--时钟源选择       0--外部时钟---稳定---25M产生高速时钟

                                          1--内部时钟---不稳定的,有误差

3)位16--计数时间到状态位,硬件置1当读取状态后,自动变0

      2. 重装载寄存器:当计数寄存器到0时,不会自动更新计数值,需要从重装载中获得新的计数值24位有效值 2^24次方个数==16,777,215最大个数。选择SysTick->LOAD

相关内容如图所示:

stm32中systick定时器,STM32F40x ,stm32,单片机,嵌入式硬件

SysTick重装载数值寄存器(地址:0xE000_E014)图

      3. SysTick当前数值寄存器(计数寄存器):递减计数器--会从最大值递减到零,产生中断使控制状态寄存器位16置1,24位有效值 2^24次方个数==16,777,215最大个数,选择SysTick->VAL

相关内容如图所示:

stm32中systick定时器,STM32F40x ,stm32,单片机,嵌入式硬件

SysTick当前数值寄存器(地址:0xE000_E018)图

     4. SysTick校准数值寄存器:用于提供一个校准值,以确保 SysTick 计时器满足特定的时间准确性要求,选择SysTick_CALIB

    相关内容如图所示:

stm32中systick定时器,STM32F40x ,stm32,单片机,嵌入式硬件

SysTick当前数值寄存器(地址:0xE000_E01C)图

   解释图中的内容如下:

          TENMS([23:0]):表示每个计数器时钟周期对应的时间,以毫秒(ms)为单位。这个值可以用来校准 SysTick 的中断间隔时间,从而实现精确的定时。

         SKEW([30]):表示 SysTick 计数器的斜率。如果为 1,则表示计数器的斜率是非线性的,需要校准计数器以提高准确性。

          NOREF([31]):表示处理器是否提供外部时钟源来驱动 SysTick 计时器。如果为 1,表示外部时钟源不可用,需要使用处理器的时钟源来驱动 SysTick 计时器。

五、SysTick定时器作用

          SysTick定时器在嵌入式系统中提供了一个简单、灵活和易用的定时功能,可以满足系统各种时间相关的需求,如节拍、延时、定时中断和时间基准等。同时,SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。

六、SysTick定时器的使用步骤通常包括以下几个步骤

        1. 初始化:配置SysTick定时器的计数周期和中断优先级等参数。

        2. 启动定时器:启动SysTick定时器以开始计数。

       3. 中断处理:当计数器达到设定值时,系统会触发SysTick中断,可以在中断处理函数中执行相应的操作。

       4. 停止定时器:根据需要,可以在适当的时候停止SysTick定时器的计数。

七、六个SysTick函数说明

  1. 设置SysTick时钟源函数

 void SysTick_CLKSourceConfig(u32 SysTick_CLKSource);

       其中,SysTick_CLKSource 是一个参数,用于指定 SysTick 定时器的时钟源。该参数可以根据自己的需求,选择以下值的任意一个即可:

     SysTick_CLKSource_HCLK_Div8: 使用 HCLK/8 作为 SysTick 定时器的时钟源。

     SysTick_CLKSource_HCLK: 使用 HCLK(处理器时钟)作为 SysTick 定时器的时钟源。

      下面是关于使用该函数的一个简单例子:

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);

2. 设置SysTick重装载值函数

void SysTick_SetReload(u32 Reload);

       其中,Reload为重装载值,该参数取值必须在1和0x00FFFFFF之间。

      下面是关于使用该函数的一个简单例子:

SysTick_SetReload(0xFFFF);

3. 使能或者失能SysTick计数器函数

void SysTick_CounterCmd(u32 SysTick_Counter);

      其中,SysTick_Counter为SysTick计数器新状态。

      下面是关于使用该函数的一个简单例子:

SysTick_CounterCmd(SysTick_Counter_Enable);

4. 使能或者失能SysTick中断函数

void SysTick_ITConfig(FunctionalState NewState);

      其中,NewState为SysTick中断的新状态,该参数可以取:ENABLE或者DISABLE。

      下面是关于使用该函数的一个简单例子:

SysTick_ITConfig(ENABLE);

5. 获取SysTick计数器的值函数

u32 SysTick_GetCounter(void);

下面是关于使用该函数的一个简单例子:

u32 SysTickCurrentCounterValue;
SysTickCurrentCounterValue = SysTick_GetCounter();

6. 检查指定的SysTick标志位设置与否函数

FlagStatus SysTick_GetFlagStatus(u8 SysTick_FLAG);

                                                                                                                                             

      其中,SysTick_FLAG为待检查的SysTic标志位,SysTick_FLAG标志列表如下图所示:

stm32中systick定时器,STM32F40x ,stm32,单片机,嵌入式硬件

     下面是关于使用该函数的一个简单例子:文章来源地址https://www.toymoban.com/news/detail-835268.html

FlagStatus Status;
Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT);

if(Status == RESET){

   //加入自己写的代码
}
else{

   //加入自己写的代码
}

八、完整代码

1. systick.c
#include <stdbool.h>
#include "stm32f4xx.h" // 假设使用的是 STM32F4 系列的微控制器

// 初始化 SysTick 定时器
void SysTick_Init(void) {

  SysTick_Config(SystemCoreClock / 1000); // 设置计数周期为 1ms
}

// 启用 SysTick 定时器
void SysTick_Start(void) {

  SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
}

// 停止 SysTick 定时器
void SysTick_Stop(void) {

  SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}

// 获取 SysTick 计数器的当前值
uint32_t SysTick_GetCurrentValue(void) {

  return SysTick->VAL;
}

// 检查 SysTick 计数器是否溢出
bool SysTick_CheckOverflow(void) {

  return (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) != 0;
}

// 延迟指定的毫秒数
void SysTick_Delay(uint32_t ms) {

  uint32_t startTick = SysTick_GetCurrentValue();
  uint32_t targetTick = startTick + ms;

  // 处理 SysTick 计数器溢出的情况
  if (targetTick < startTick) {

    while (SysTick_GetCurrentValue() > startTick) {}

  }
2.systick.h
#ifndef SYSTICK_H
#define SYSTICK_H
#include <stdint.h>
#include <stdbool.h>

void SysTick_Init(void); // 初始化 SysTick 定时器
void SysTick_Start(void); // 启用 SysTick 定时器
void SysTick_Stop(void);  // 停止 SysTick 定时器
uint32_t SysTick_GetCurrentValue(void);  // 获取 SysTick 计数器的当前值
bool SysTick_CheckOverflow(void);  // 检查 SysTick 计数器是否溢出
void SysTick_Delay(uint32_t ms); // 延迟指定的毫秒数

#endif 

到了这里,关于2.STM32 SysTick定时器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【HAL库】STM32CubeMX开发----非阻塞延时实验----SysTick(滴答定时器)中断

    STM32CubeMX 下载和安装 详细教程 【HAL库】STM32CubeMX开发----STM32F103/F207/F407----目录 HAL库 有自带的 ms级 延时函数: HAL_Delay(); 缺点: 这是 阻塞延时 方式,就是延时期间,什么都不能干,这样很浪费资源。 这篇文章主要介绍,利用 SysTick(滴答定时器)中断 实现 非阻塞延时 的实验

    2024年02月16日
    浏览(42)
  • HAL STM32基于系统滴答定时器(SysTick)实现多任务时间片轮询

    📑RTOS(实时操作系统)和定时器时间片轮询是两种不同的任务调度和执行方式的差异简介 🔖 以下部分内容,由AI给出的解答: 🔖RTOS(实时操作系统): 🌿RTOS是一种专门设计用于实时系统的操作系统,它可以有效地管理多个任务,提供任务调度、同步和通信等功能。 🌿

    2024年02月21日
    浏览(38)
  • 【STM32笔记】低功耗模式、WFI命令等进入不了休眠的可能原因(系统定时器SysTick一直产生中断)

    【STM32】低功耗模式、WFI命令等进入不了休眠的可能原因(系统定时器SysTick一直产生中断) 【STM32笔记】低功耗模式配置及避坑汇总 前文: blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录解决方案) __WFI

    2024年02月10日
    浏览(39)
  • 如何开关Systick定时器的中断使能?

    我们知道,STM32芯片里的ARM处理器都集成了1个24位向下计数的具备自动重装功能的SYSTICK定时器,功能比较单纯,就是计数定时。它常用来作为OS的滴答时钟,或者作为基本的计数时基。比方在各个RTOS系统里往往把SYSTICK作为滴答时钟,对于OS来讲,用它做时基可以提高代码移植

    2024年02月13日
    浏览(30)
  • 【单片机】STM32单片机的各个定时器的定时中断程序,标准库,STM32F103

    高级定时器和普通定时器的区别(https://zhuanlan.zhihu.com/p/557896041): TIM1是高级定时器,使用的时钟总线是RCC_APB2Periph_TIM1,和普通定时器不一样。 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用

    2024年02月07日
    浏览(49)
  • STM32单片机(六)TIM定时器 -> 第二节:TIM定时中断练习(定时器定时中断和定时器外部时钟)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月09日
    浏览(34)
  • ARM Cortex-M处理器中的SysTick定时器简介

    ARM Cortex-M处理器中的SysTick是一个内部的系统定时器,它提供了一种简单而有效的方式来生成定时的中断请求。SysTick定时器是一个24位的下计数定时器,它可以配置为周期性地产生中断,这些中断可以用于操作系统的任务调度、性能测量、时间延迟等。 SysTick定时器的主要特点

    2024年04月28日
    浏览(30)
  • 【单片机】STM32单片机的各个定时器的定时中断程序,标准库

    高级定时器和普通定时器的区别(https://zhuanlan.zhihu.com/p/557896041): TIM1是高级定时器,使用的时钟总线是RCC_APB2Periph_TIM1,和普通定时器不一样。 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用

    2024年02月11日
    浏览(41)
  • STM32单片机入门学习笔记——定时器TIM第二部分

    笔记整理自B站UP主 江科大自化协 教程 《STM32入门教程-2023持续更新中》 ,所用单片机也为教程推荐单片机。 第一部分:定时器基本定时的功能,定时器每隔这个时间产生一个中断,来实现每隔一个固定时间执行一段程序的目的,比如要做一个时钟、秒表或者使用一些程序算

    2024年02月08日
    浏览(41)
  • 【单片机】STM32单片机,定时器的输入捕获,基于捕获的频率计,STM32F103

    下面的定时器都具有输入捕获能力: 查看另一篇文章:https://qq742971636.blog.csdn.net/article/details/131471539 外部计数频率计的缺点:需要两个定时器配合,最高能测量的频率是否有限制我没具体尝试。 基于捕获的频率计的缺点:最高能测量的频率有限制。 TIM3_CH1 PWM PA6 10KHZ。 输入

    2024年02月14日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包