STM32中的Systick的使用

SysTick,全称System Tick Timer,是Cortex-M microcontrollers内核中提供的一个简单而有效的系统定时器,设计用来给操作系统提供时间基准,或用于生成周期性的中断。STM32系列微控制器,作为基于ARM Cortex-M内核的设备,也内置了这一功能模块。

主要特点

24位递减计数器:SysTick是一个24位自动重载的递减计数器,达到0时,计数器会自动重新装载预设的值,并且可以产生一个可选的中断。

  1. 灵活的时钟源选择:SysTick定时器可以选择内核时钟(processor clock)或内核时钟的1/8作为其时钟源。这给了开发者根据实际需求选择时钟速度的灵活性。

  2. 简单易用:对于简单的延时生成、操作系统的节拍(timer tick) 或任何需要定时的任务,SysTick提供了一个简单而有效的解决方案,而不需要复杂的定时器配置。

  3. 固定的中断优先级:SysTick的中断优先级是在Cortex-M内核中固定的,这意味着开发者不能改变它。这为操作系统的设计提供了一定的便利,因为SysTick通常被用作系统的心跳或时间管理。

  4. 无需外部硬件:与其他外部或外围定时器不同,SysTick是内核内置功能,不需要其他外部硬件,可以保持系统的精简。

实现延时

开发者经常利用SysTick实现毫秒级的延时功能,这是通过配置SysTick的重载值(LOAD寄存器),并启用SysTick定时器和它的中断来实现的。每次SysTick定时器到达零,SysTick定时器会重新装载预设的值,并且可以触发中断(如果已经启用)。在中断服务程序(ISR)中可以执行相关的周期任务或标记一个周期的结束。

使用场景

  • 操作系统节拍:实时操作系统(RTOS)常用SysTick定时器作为系统的基础节拍源,用于任务调度、时间管理等。
  • 程序延时:在不需要精确时间管理的应用中,SysTick可以用来实现简易的延时功能,例如等待硬件准备好或实现非阻塞延迟。
  • 时间测量:SysTick也可以用于程序执行时间的测量,从而帮助开发者优化代码。

总之,SysTick是Cortex-M系列微控制器中非常实用的功能,对于需要精确时间管理或操作系统支持的应用来说尤其重要。

如何初始化systick定时器

为了初始化SysTick定时器,通常需要设置定时器的重载值,选择时钟源,并可选地使能SysTick中断。以下步骤展示了如何在裸机编程中初始化SysTick定时器,不依赖特定的硬件抽象层(HAL)或类似库

步骤1: 选择SysTick时钟源

SysTick定时器可以选择使用核心时钟或核心时钟的1/8作为其时钟源。这个设置通过SysTick控制和状态寄存器(SysTick CTRL)中的CLKSOURCE位来控制。一般情况下,我们通常使用核心时钟为SysTick定时器提供时钟,以达到更高的时间精度。

SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;

步骤2: 设置重载值(Reload Value)

SysTick的重载值决定了定时器计数到0所需要的时钟周期数。这个值根据定时器所需的时间间隔来计算,并设置在SysTick重载值寄存器(SysTick LOAD)中。重载值计算公式如下,假设您要设置的定时时间是time_ms毫秒。

uint32_t reloadValue = (SystemCoreClock / 1000) * time_ms - 1;
SysTick->LOAD = reloadValue;

这里SystemCoreClock变量表示系统的核心时钟频率,它需要根据实际的系统核心时钟进行设

步骤3: 使能SysTick定时器和中断(可选)

使能SysTick定时器,选择是否使能中断。如果需要定时器到0时产生中断,还需要使能SysTick中断。

SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; // 使能SysTick中断
SysTick->VAL = 0; // 清空计数器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 启动SysTick定时器

步骤4: 实现SysTick_Handler中断服务例程(如果使能了中断)

如果你使能了SysTick中断,你需要实现SysTick_Handler()中断服务例程(ISR)来处理中断。这个函数在SysTick计数到0时被调用。

void SysTick_Handler(void) {// 处理中断。例如,更新定时器标志,执行定时任务等。
}

以上就是初始化SysTick定时器的基本步骤。这个过程允许你根据需要配置SysTick定时器,来实现周期性的任务调度或生成准确的延时。

如何计算SysTick定时器的重载值?

计算SysTick定时器的重载值需要知道你想要定时器溢出的时间间隔以及定时器的时钟频率。以下是计算过程:

  1. 确定时钟频率

    • 主时钟频率 (SystemCoreClock): 如果你选择的是处理器的核心时钟(通常情况下)。
    • 分频后的时钟频率: 如果你选择的是分频后的时钟频率,例如核心时钟频率的1/8。
  2. 计算时间间隔对应的时钟周期数
    根据定时器的时间间隔以及定时器的时钟频率,计算出所需的时钟周期数。如果定时器的时间间隔是T秒,定时器的时钟频率是f_clock赫兹,则对应的时钟周期数N可用以下公式计算:

       N = T * f_clock

    例如,如果你需要1毫秒的时间间隔,并且SysTick的时钟频率是SystemCoreClock,则

       N = 0.001 * SystemCoreClock
  3. 计算重载值
    SysTick是一个24位的递减到零计数器,计数从重载值开始,并每个时钟周期递减一直到0。因此,重载值应是计数周期数减1。如果重载值设为R
       R = N - 1

    这是因为从R递减到0正好是R + 1个计数周期。

  4. 考虑24位计数器的最大值
    由于SysTick是24位的,其最大计数值是0xFFFFFF(即16,777,215)。所以,要确保计算得出的R不要超出这个范围。

示例:

假设:

核心时钟频率 SystemCoreClock = 72 MHz

需要的定时器周期 T = 1 ms(0.001秒)

计算周期数 N 为

N = 0.001 * 72 MHz = 72,000

你可以将这个值写入SysTick加载值寄存器(LOAD)来设置定时器每1毫秒溢出一次。

代码实现将类似于:

SysTick->LOAD = (uint32_t)(N - 1);
SysTick->VAL = 0x0; // 清空计数器
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; // 使能定时器

确保你选择对的时钟源(核心时钟,或核心时钟的1/8),因为这将直接影响上面的计算。如果你决定使用分频后的时钟源,你需要在计算时将 SystemCoreClock 替换为 SystemCoreClock / 8

如何使用systick实现delay功能

要使用SysTick定时器实现延时(delay)功能,你需要设置SysTick以适当的速率递减,并在递减到零时进行等待或触发中断。下面是实现delay功能的基本步骤,不使用中断,而是使用轮询的方式。

轮询方式实现:

首先你需要正确配置SysTick定时器,包括选择时钟源,设置重载值等。

配置SysTick重载值:
计算并设置SysTick重载值,以匹配你需要的延时长度。例如,如果你的核心时钟是72MHz,你想要延时1毫秒:

uint32_t ticks = SystemCoreClock / 1000;
SysTick->LOAD = ticks - 1;
SysTick->VAL = 0; // 清除当前值及计数器
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; // 选择核心时钟并启动

实现delay函数:
编写一个延时函数,该函数重复地加载重载值并等待SysTick递减到零

void delay_ms(uint32_t ms) {// 计算重载值(假设已经减去1且 SysTick->LOAD 直接可以使用)uint32_t ticks = (SystemCoreClock / 1000) * ms;SysTick->LOAD = (uint32_t)(ticks - 1UL);SysTick->VAL = 0UL; // 清除计数器// 等待计时器倒数到0while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) {// 该位在倒数到0时会设置,此处空循环直到满足该条件}
}

使用以上delay_ms()函数可以实现毫秒延时。请注意,这里SysTick是设置了一次并等待它完成。如果延时时间长,你可以设置SysTick只延时1毫秒,然后在循环中多次调用该延时函数。

注意事项:

  • 使用该轮询方法实现delay将阻塞CPU执行直到延时完成;
  • 确保在使用前SysTick 定时器尚未被操作系统或其它库使用;
  • 在多任务或中断驱动的环境中,使用SysTick的方式可能会影响系统中断的响应性能;
  • 上述示例假设SystemCoreClock已定义并且与实际的系统核心时钟同步。在实际项目中SystemCoreClock往往是由系统初始化代码更新的全局变量,它通常在启动文件进行赋值。
  • 如果需要长时间延时,确保重载值乘以延时毫秒数不会超过SysTick定时器的最大值。

对于具有实时操作系统(RTOS)的系统,最好利用操作系统提供的延时函数,因为这些函数更加精准且不会影响操作系统的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/8572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tkinter组件:Checkbutton

Tkinter组件:Checkbutton Checkbutton(多选按钮)组件用于实现确定是否选择的按钮。Checkbutton 组件可以包含文本或图像,你可以将一个 Python 的函数或方法与之相关联,当按钮被按下时,对应的函数或方法将被…

游戏全自动打金搬砖,单号收益300+ 轻松日入1000+

详情介绍 游戏全自动打金搬砖,单号收益300左右,多开收益更多,轻松日入1000 可矩阵操作。 项目长期稳定,全自动挂机无需人工操作,小白,宝妈,想做副业的都可以。

elementui+vue通过下拉框多选字段进行搜索模糊匹配

从字典中选择的值为["01","03"],在最开始的时候进行的处理是类似于表单提交的时候将json对象转换成了String类型 nature:["01","03"] this.queryParams.nature JSON.stringify(this.queryParams.nature); mapper层 <if test&quo…

springboot+vue+mybatis图书推荐管理系统的设计与实现+PPT+论文+讲解+售后

随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;图书推荐管理系统展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;为解决…

亲测快捷高效的编写测试用例方法

前言 测试用例是任何测试周期的第一步&#xff0c;对任何项目都非常重要。如果在此步骤中出现任何问题&#xff0c;则在整个软件测试过程中都会扩大影响。如果测试人员在创建测试用例模板时使用正确的过程和准则&#xff0c;则可以避免这种情况。 在本篇文章中将分享一些简单而…

PostgreSQL备份恢复与复制

前言 随着国家战略层面对信息安全关注度越来越高&#xff0c;数据库是基础软件国产化自主可控的重要方面之一。PG是世界上最流行的开源关系型数据库之一&#xff0c;并且他是类BSD开源许可&#xff0c;开源协议非常友好&#xff0c;可以随意分发、闭源和开源&#xff0c;可以用…

Shell变成规范与变量

目录 1. Shell脚本 1.1 Shell脚本概述 1.2 Shell的作用 1.3 Shell脚本的构成 2. 重定向与管道操作 2.1 交互式硬件设备 ​ 2.2 重定向操作 3. shell变量 3.1 自定义变量 3.2 变量的作用范围​编辑 3.3 整数变量的运算 4. 环境变量 4.1 特殊的Shell变量 4.2 只读变…

鸿蒙开发接口Ability框架:【@ohos.application.formProvider (FormProvider)】

FormProvider FormProvider模块提供了卡片提供方相关接口的能力&#xff0c;包括更新卡片&#xff0c;设置卡片更新时间&#xff0c;获取卡片信息&#xff0c;请求发布卡片等。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上…

机器人系统可以支持对接人工系统吗?

​ 随着科技的飞速发展&#xff0c;机器人系统在各行各业都扮演着越来越重要的角色。它们可以高效地处理大量数据&#xff0c;执行繁琐的任务&#xff0c;甚至在某些领域超越了人类的能力。然而&#xff0c;机器人系统也有其局限性&#xff0c;特别是在处理复杂的人际交往…

【Qt 开发基础体系】Qt信号与槽机制

文章目录 1.Qt 信号与槽机制原理&#xff08;Signal & Slot&#xff09;2. QObject 类 connect 的介绍3. 信号与槽机制连接方式4. 信号和槽机制优势及其效率&#xff1a;3. 信号与槽机制应用 1.Qt 信号与槽机制原理&#xff08;Signal & Slot&#xff09; &#x1f42…

Kafka---总结篇

kafka架构 主要概念 broker: 存储消息的机器 控制器controller &#xff08;1&#xff09;使用zookeeper&#xff0c; 除了提供一般的broker功能之外&#xff0c;还负责选举分区首领。通过在zookeepr中创建一个名为 /controller的临时节点称为 controller。每个选出的contro…

linux修改目录和文件的权限,linux修改目录下所有文件的权限

查看权限 ls -l your-script.sh 为所有者添加读取和执行权限&#xff08;目录级别&#xff0c;当前目录下所有文件&#xff09; chmod urx * 为组用户添加读取权限&#xff08;目录级别&#xff0c;当前目录下所有文件&#xff09; chmod gr * 为其他用户添加读取和执行权限…

C# 和 Qt 相比的一些优势

C# 和 Qt 都是流行的软件开发工具&#xff0c;它们各自具有不同的优势&#xff0c;适用于不同的开发场景。以下是 C# 和 Qt 相比的一些优势。相比之下&#xff0c;Qt 也有其独特的优势&#xff0c;特别是在跨平台 GUI 应用程序开发方面。然而&#xff0c;C# 的这些优势使得它在…

Ubuntu22.04下安装kafka_2.11-0.10.1.0并运行简单实例

目录 一、版本信息 二、安装Kafka 1.将Kafka安装包移到下载目录中 2.下载Spark并确保hadoop用户对Spark目录有操作权限 三、启动Kafka并测试Kafka是否正常工作 1.启动Kafka 2.测试Kafka是否正常工作 一、版本信息 虚拟机产品&#xff1a;VMware Workstation 17 Pro 虚…

2024.5.4 —— LeetCode 高频题复盘

目录 14. 最长公共前缀128. 最长连续序列718. 最长重复子数组169. 多数元素662. 二叉树最大宽度179. 最大数122. 买卖股票的最佳时机 II62. 不同路径226. 翻转二叉树227. 基本计算器 II 14. 最长公共前缀 题目链接 Python 解法一 class Solution:def longestCommonPrefix(se…

uniapp——阻止冒泡

点击事件阻止冒泡 click.stop"onSubmit"其他类型&#xff0c;比如视频&#xff1a; 最后加了一个 click.stop <view class"videoBox" v-if"item.video_url"><video :src"i.image(item.video_url)" :controls"true&quo…

软件测试实战项目(含电商、银行、APP等)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 今天给大家带来几个软件测试项目的实战总结及经验&#xff0c;适…

初学python记录:力扣1652. 拆炸弹

题目&#xff1a; 你有一个炸弹需要拆除&#xff0c;时间紧迫&#xff01;你的情报员会给你一个长度为 n 的 循环 数组 code 以及一个密钥 k 。 为了获得正确的密码&#xff0c;你需要替换掉每一个数字。所有数字会 同时 被替换。 如果 k > 0 &#xff0c;将第 i 个数字用…

JUC下的ScheduledThreadPoolExecutor详解

ScheduledThreadPoolExecutor是Java并发编程框架中一个强大且灵活的线程池实现&#xff0c;专为定时与周期性任务而设计。作为ThreadPoolExecutor的子类&#xff0c;它不仅继承了线程池管理的高效与灵活性&#xff0c;还内置了基于优先级队列的延迟任务调度机制&#xff0c;支持…

将一层的json转成拼接的query字符串

方法: 封装方法手写利用第三方库 qs利用浏览器api- URLSearchParams 记录一下URLSearchParams const a new URLSearchParams({bar:foo,foo:20}) a.toString() // barfoo&foo20