STM32_HAL_系统定时器(SysTick)_实现计时

1介绍

系统定时器(SysTick)是ARM Cortex-M处理器系列中的一个特殊定时器,它不属于STM32F1系列微控制器的外设,而是处理器内部的一个组件。SysTick定时器的作用是为操作系统或其他需要精确时钟计数和中断服务的应用提供基础的时间参考。

关键特点:

  1. 24位计数器:SysTick计数器是一个24位的寄存器,可以计数的范围是从0到16777215(即2^24 - 1)。

  2. 可配置的时钟源:SysTick可以使用不同的时钟源,包括处理器的主时钟(Cortex-M3/M4/M7等处理器的主时钟)。时钟源的选择会影响SysTick的计数频率。

  3. 中断功能:SysTick可以产生中断请求,当计数器的值达到预设的值时。这个中断可以用来实现操作系统的时间间隔计时器或用于其他需要精确时间计数的应用。

  4. 触发DMA请求:SysTick还可以配置为在计数器达到预设值时触发DMA请求,这可以用于与DMA控制器协同工作,实现数据传输的定时控制。

  5. 初始化与配置:SysTick的配置和初始化通常在系统初始化时完成,通过设置SysTick控制和状态寄存器(SysTick_CSR)的值来配置时钟源、预分频器、中断使能等参数。

 用途

  • 操作系统时间基准:在嵌入式系统中,SysTick定时器可以作为操作系统的时钟基准,用于时间管理和任务调度。
  • 定时中断服务:在不需要精确时间控制的应用中,SysTick可以用于生成固定时间间隔的中断,用于定时服务或执行某些周期性任务。
  • DMA请求触发:在一些应用中,SysTick可以作为DMA控制器的外部触发源,用于控制数据传输的定时。

 配置SysTick定时器的步骤

  1. 使能SysTick时钟: 在系统时钟配置(SystemClock_Config)函数中,你需要使能SysTick时钟。这通常通过设置RCC时钟控制寄存器(RCC_APB2ENR)的SYSCKEN位来实现。

  2. 配置SysTick时钟源: SysTick可以使用多种时钟源,包括处理器的主时钟(HCLK)、系统时钟(SystemCoreClock)或者一个较低的时钟源。你需要在SysTick控制和状态寄存器(SysTick_CSR)中设置时钟源选择位(CLKSOURCE)。

  3. 设置SysTick分频器: 你可以通过设置SysTick分频器寄存器(SysTick_CLKSource)来配置SysTick时钟源的分频值。这会影响SysTick的计数频率。

  4. 配置SysTick计数器: 在SysTick计数器寄存器(SysTick_VAL)中,你需要设置计数器的初始值。这决定了SysTick定时器的周期。

  5. 配置中断和DMA请求(需要时在配置): 你可以通过设置SysTick控制和状态寄存器(SysTick_CSR)的位来使能中断请求(TICKINT)和DMA请求(DMAINT)。

  6. 初始化SysTick: 在系统初始化代码中,你需要调用SysTick_Config函数,并传递一个周期值,这个值决定了SysTick定时器的周期。

  7. 使用SysTick定时器: 一旦SysTick定时器配置完成,它将按照配置的周期产生中断请求。你可以在中断服务例程中处理SysTick定时器的中断请求。

用于配置、初始化和操作SysTick定时器:

  1. HAL_SYSTICK_Config: 这个函数用于配置SysTick定时器的时钟源、分频器和重载值。它返回一个布尔值,指示配置是否成功。

  2. HAL_SYSTICK_CLKSourceConfig: 这个函数用于配置SysTick定时器的时钟源。它可以设置为HCLK(主时钟)或者HCLK的8分频。

  3. HAL_SYSTICK_CLKSourceSwitchCmd: 这个函数用于在不同的时钟源之间切换SysTick定时器的时钟源。

  4. HAL_SYSTICK_IRQHandler: 这个函数是SysTick定时器的中断服务例程。当SysTick定时器溢出时,它会自动调用这个函数。

  5. HAL_IncTick: 这个函数用于递增SysTick定时器的计数器。它通常在SysTick定时器的中断服务例程中调用,以提供精确的系统时钟。

  6. HAL_GetTick: 这个函数用于获取当前的SysTick定时器计数值。它返回的是自系统启动以来经过的SysTick定时器计数器的值。

  7. HAL_SYSTICK_GetCurrentState: 这个函数用于获取SysTick定时器当前的状态。

  8. HAL_SYSTICK_GetCounter: 这个函数用于获取SysTick定时器的当前计数值。

  9. HAL_SYSTICK_GetReloadValue: 这个函数用于获取SysTick定时器的自动重装载值。

  10. HAL_SYSTICK_SetReload 这个函数用于设置SysTick定时器的自动重装载值。

  11. HAL_SYSTICK_Cmd: 这个函数用于启用或禁用SysTick定时器。

注意 

重写SysTick配置会影响HAL_Delay()函数。HAL_Delay()函数依赖于SysTick定时器的配置来提供延迟功能。如果你重写了SysTick的配置,你将改变SysTick定时器的操作方式,这可能会导致HAL_Delay()函数的行为与预期不符。

在STM32HAL库中,HAL_Delay()函数内部使用了SysTick定时器来计算延迟时间。当HAL_Delay()函数被调用时,它会设置SysTick定时器的自动重装载值,以实现指定的延迟时间。SysTick定时器的配置决定了延迟的精度和分辨率。

如果你重写了SysTick的配置,你可能会改变SysTick定时器的时钟源、分频器、自动重装载值等参数。这可能会导致HAL_Delay()函数无法正确计算延迟时间,或者在延迟时间到达时无法正确清除中断标志。

因此,如果你重写了SysTick的配置,你应该确保你的配置与HAL_Delay()函数的期望行为兼容。如果可能的话,最好不要重写SysTick的配置,除非你有充分的理由和充分的测试来确保你的配置不会破坏HAL_Delay()函数的性能和准确性。

 Systick的频率与时间之间的转换公式

 SysTick定时器的时钟源分频器通常在初始化时被设置为固定值,因此在实际应用中,你通常不需要手动计算这些值。HAL库已经封装了这些底层硬件的复杂性,并提供了一个简单的API来使用

如果STM32F1系列微控制器的HCLK(主时钟)频率是72 MHz,并且SysTick定时器的分频器值设置为8(这是默认值),那么SysTick定时器的时钟频率将是:

                     

时钟频率=72 MHz/8=9 MHz

这意味着SysTick定时器的时钟频率是9 MHz。SysTick定时器的自动重装载值(reload value)决定了计数器的计数周期。SysTick定时器的计数周期可以通过以下公式计算:

               

周期= 1/时钟频率​

因此,如果SysTick定时器的自动重装载值为1000,那么计数器将在9微秒后重新开始计数。

如果你想知道SysTick定时器的计数器增加多少次才能达到1毫秒,你可以使用以下公式:

计数次数= 1毫秒/周期​​

将周期值代入公式:

计数次数= 9 微秒/1 毫秒= 9 微秒/1000 微秒≈111.11 次

这意味着SysTick定时器的计数器需要增加大约111次才能达到1毫秒。由于计数器是16位的,它可以从0增加到65535(即2^16 - 1),所以你可以使用以下公式来计算SysTick定时器能够提供多少毫秒的延迟:

最大延迟时间= 65535/9 微秒
​

将周期值代入公式:

最大延迟时间= 65535/9 微秒≈727.07 毫秒
​

因此,使用SysTick定时器,你可以实现大约727毫秒的延迟。如果需要更长的延迟时间,你可能需要使用其他定时器或外部时钟源。

实例思路

1设置时钟源(画圈的选/8)

 2代码设置(寄存器设计思路)

实现系统的us延时(参数)
{1.选择时钟 建议选择经过8分频后的外部时钟。2.写入重装载值,设为预期值-1。3.禁止中断。4.清空计数器。5.使能计数器。6.等待时间到达,等待标志位置1。7.关闭计数器。8.清空计数器。
}

2代码设置(修改HAL库的滴答计时器影响HAL_Delay()调节延时时间(会影响中断频率))

1.1找到计时器的配置文件(函数)

 1.2修改此函数

HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq))
解释

具体来说:

  1. SystemCoreClock:这是系统的核心时钟频率,即CPU的主频。

  2. 1000U:这里的U表示这个数字是一个无符号整数(unsigned int),1000U就是1000。

  3. uwTickFreq:这是一个变量,表示每秒钟SysTick定时器中断的次数。如果uwTickFreq是1,那么每个SysTick中断周期是1秒;如果uwTickFreq是1000,那么每个SysTick中断周期是1毫秒(ms),以此类推。

  4. 1000U / uwTickFreq:这个表达式计算每秒钟SysTick定时器应该中断多少次。这个值是用来将核心时钟频率(Hz)转换为每次SysTick中断所需的时钟周期数。

  5. SystemCoreClock / (1000U / uwTickFreq):这个表达式计算SysTick定时器的重装载数值,即每次SysTick中断所需的时钟周期数。这样配置后,SysTick定时器就会以uwTickFreq指定的频率产生中断。

  6. HAL_SYSTICK_Config():这个函数用于配置SysTick定时器的重装载数值寄存器。

通过这种方式,我们可以灵活地配置SysTick定时器以不同的频率产生中断,而不必硬编码特定的频率值。这在需要根据不同应用场景调整定时器中断频率时非常有用。

1.3修改此值uwTickFreq

将 uwTickFreq 设置为 1 意味着 uwTick 变量将以秒为单位增加

uwTickFreq 设置为1000  HAL_Delay(1)=1ms(默认)

uwTickFreq 设置为 1000000(1百万)意味着 uwTick 变量将以微秒(μs)为单位增加

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

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

相关文章

山姆·奥特曼接受All-in Podcast采访

前言 在“All-in Podcast”播客中,OpenAI的CEO山姆奥特曼广泛讨论了人工智能的多个关键议题。他涉及了推理计算、开源模型的发展、GPT-5语言模型的进展,并对AI监管、全民基本收入(UBI)政策、智能体如何改变应用交互,以…

基于SpringBoot的全国风景区WebGIS按省展示实践

目录 前言 一、全国风景区信息介绍 1、全国范围内数据分布 2、全国风景区分布 3、PostGIS空间关联查询 二、后台查询的设计与实现 1、Model和Mapper层 2、业务层和控制层设计 三、WebGIS可视化 1、省份范围可视化 2、省级风景区可视化展示 3、成果展示 总结 前…

未来互联网:Web3的技术革新之路

引言 随着技术的不断发展和社会的日益数字化,互联网作为信息交流和社交媒介的重要平台已经成为我们生活中不可或缺的一部分。然而,传统的互联网架构在数据安全、隐私保护和去中心化等方面存在着诸多挑战。为了解决这些问题,Web3技术应运而生…

Ubuntu22.04怎么安装cuda11.3

环境: WSL2 Ubuntu22.04 问题描述: Ubuntu22.04怎么安装cuda11.3 之前是11.5 解决方案: 在Ubuntu 22.04上安装CUDA 11.3需要一些步骤,因为CUDA 11.3不是为Ubuntu 22.04官方支持的版本。但是,您仍然可以通过以下步…

python内置函数exec()和eval()区别

在Python中,eval() 和 exec() 都是内置函数,用于执行存储在字符串或对象中的Python代码,但它们之间也有一些区别。 eval() 语法:eval(expression, globalsNone, localsNone) expression:需要求值的字符串表达式。可…

面试题:调整数字顺序,使奇数位于偶数前面

题目: 输入一个整数数组,实现一个函数,来调整该数组中数字的顺序 使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分 算法1: 利用快速排序的一次划分思想,从2端往中间遍历 时间复杂度&#x…

【class2】人工智能初步(自然语言处理)

要实现从评价中提取高频关键词,并判别其正负面性,其实是通过人工智能领域中的一个分支:自然语言处理。 在了解自然语言处理之前,我们先来说说,什么是自然语言(Natural Language)?自…

快速入门:利用Go语言下载Amazon商品信息的步骤详解

概述 在这篇文章中,我们将深入探讨如何利用Go语言这一强大的工具,结合代理IP技术和多线程技术,实现高效下载Amazon的商品信息。首先,让我们来看看为什么选择Go语言作为开发网络爬虫的首选语言。 Go语言在网络开发中的特点 简洁…

springboot学习整理

视频:基础篇-01_springboot概述_哔哩哔哩_bilibili 介绍 spring boot 是spring提供的一个子项目,用于快速构建spring应用程序 spring构建: 1 导入依赖繁琐 ; 2 项目配置繁琐 spring Framework: 核心 spring Boot :快速构建spring…

gitee 简易使用 上传文件

Wiki - Gitee.com 官方教程 1.gitee 注册帐号 (直接选择初始化选项即可,无需下载git) 2.下载git 安装 http://git-scm.com/downloads 3. 桌面 鼠标右键 或是开始菜单 open git bash here 输入(复制 ,粘贴) 运行…

移动端自动化测试工具 Appium 之自定义报告

文章目录 一、背景二、具体实现1、保存结果实体2、工具类3、自定义报告监听类代码4、模板代码4.1、report.vm4.2、执行xml 三、总结 一、背景 自动化测试用例跑完后报告展示是体现咱们价值的一个地方咱们先看原始报告。 上面报告虽然麻雀虽小但五脏俱全,但是如果用…

【错误的集合】力扣python

最初想法 def findErrorNums(nums):n len(nums)duplicate -1missing -1for num in nums:if nums[abs(num) - 1] < 0:duplicate abs(num)else:nums[abs(num) - 1] * -1for i in range(n):if nums[i] > 0:missing i 1breakreturn [duplicate, missing] 遇到力扣大佬…

RedisTemplate操作Redis详解之连接Redis及自定义序列化

连接到Redis 使用Redis和Spring时的首要任务之一是通过IoC容器连接到Redis。为此&#xff0c;需要java连接器&#xff08;或绑定&#xff09;。无论选择哪种库&#xff0c;你都只需要使用一组Spring Data Redis API&#xff08;在所有连接器中行为一致&#xff09;&#xff1a;…

【STM32 |程序实例】按键控制、光敏传感器控制蜂鸣器

目录 前言 按键控制LED 光敏传感器控制蜂鸣器 前言 上拉输入&#xff1a;若GPIO引脚配置为上拉输入模式&#xff0c;在默认情况下&#xff08;GPIO引脚无输入&#xff09;&#xff0c;读取的GPIO引脚数据为1&#xff0c;即高电平。 下拉输入&#xff1a;若GPIO引脚配置为下…

如何将pdf文件换成3d模型?---模大狮模型网

PDF文件是一种广泛用于文档传输和共享的格式&#xff0c;但在某些情况下&#xff0c;我们可能希望将其中的内容转换为更具交互性和视觉效果的3D模型。本文将介绍如何将PDF文件转换为3D模型&#xff0c;为您展示实现这一想象的步骤。 选择合适的PDF文件&#xff1a; 首先&#…

CentOs搭建Kubernetes集群

kubeadm minikube 还是太“迷你”了&#xff0c;方便的同时也隐藏了很多细节&#xff0c;离真正生产环境里的计算集群有一些差距&#xff0c;毕竟许多需求、任务只有在多节点的大集群里才能够遇到&#xff0c;相比起来&#xff0c;minikube 真的只能算是一个“玩具”。 Kuber…

如何开通微软必应bing国内竞价广告账户?

微软必应Bing作为全球第二大搜索引擎&#xff0c;凭借其特有的用户群和市场定位&#xff0c;为中国广告主开辟了一片潜力无限的蓝海市场。云衔科技通过专业实力&#xff0c;为广告主提供全方位支持&#xff0c;从开户到代运营&#xff0c;助力企业扬帆起航。 一、微软必应bing…

远程监控供水设备运行状态

随着城市化进程的加快&#xff0c;供水设备的安全稳定运行对于保障居民日常生活和工业生产至关重要。然而&#xff0c;传统的供水设备管理方式往往受限于人力、物力和时间的限制&#xff0c;难以实现对供水设备运行状态的全面监控和实时管理。在这一背景下&#xff0c;HiWoo Cl…

海洋环境保护论文阅读记录

海洋环境保护 论文1&#xff1a;Critical role of wave–seabed interactions in the extensive erosion of Yellow River estuarine sediments 波浪-海床相互作用在黄河河口广泛侵中的关键作用 estuatine 河口的&#xff0c;港湾的 erodibility侵蚀度 sediment erodibility …

GEVernova推出GEV新能源平台,引领新能源未来

近日&#xff0c;全球领先的能源设备制造和服务公司 GE Vernova 宣布推出 GEV 新能源平台&#xff0c;这是一个将金融、科技和产业深度融合的全新投资平台。GEV 新能源平台旨在为用户提供一站式可持续新能源投资解决方案&#xff0c;助力全球新能源转型和可持续发展。 新能源已…