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.xdnf.cn/news/1421679.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】自动化构建工具make/Makefile和git介绍

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12625432.html 目录 前言 Linux项目自动化构建工具-make/Makefile 举例 .PHONY 常见符号 依赖关系…

05、 java 的三种注释及 javadoc 命令解析文档注释(即:java 特有注释方式)的过程

java的三种注释 1、单行注释:其一、代码展示:其二、特点: 2、多行注释:其一、代码展示:其二、特点: 3、文档注释(java特有):其一、代码展示:其二、注释文档的使用:其三、…

基础ArkTS组件:数据面板组件(图表),日期选择器组件(HarmonyOS学习第三课【3.5】)

tuoz数据面板组件 DataPanel 数据面板组件,用于将多个数据占比情况使用占比图进行展示。 说明 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 无 接口 DataPanel(options:{values: numbe…

开关电源功率测试方法:输入、输出功率测试步骤

在现代电子设备中,开关电源扮演着至关重要的角色,其效率和稳定性直接影响到整个系统的性能。因此,对开关电源进行功率测试成为了电源管理的重要环节。本文将详细介绍如何使用DC-DC电源模块测试系统对开关电源的输入输出功率进行准确测量&…

如何使用Docker安装并运行Nexus容器结合内网穿透实现远程管理本地仓库

前言 作者简介: 懒大王敲代码,计算机专业应届生 今天给大家聊聊如何使用Docker安装并运行Nexus容器结合内网穿透实现远程管理本地仓库,希望大家能觉得实用! 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!&#x1f496…

2024 银行从业资格证考试备考资料及备考群

2024 银行从业资格证考试备考资料 2024 年 06月1、2日 银行从业资格考试全国统一考试(统考) 有没有小伙伴在准备备考的,不知道大家都准备怎么学习呢,这里我整理了一些免费备考资料,含【三色笔记】,供大家…

Spring解决泛型擦除的思路不错,现在它是我的了。

你好呀,我是浮生。 Spring 的事件监听机制,不知道你有没有用过,实际开发过程中用来进行代码解耦简直不要太爽。 但是我最近碰到了一个涉及到泛型的场景,常规套路下,在这个场景中使用该机制看起来会很傻,但…

CoSeg: Cognitively Inspired Unsupervised Generic Event Segmentation

名词解释 1.特征重建 特征重建是一种机器学习中常用的技术,通常用于自监督学习或无监督学习任务。在特征重建中,模型被要求将输入数据经过编码器(encoder)转换成某种表示,然后再经过解码器(decoder&#x…

中学数学研究杂志中学数学研究杂志社中学数学研究编辑部2024年第4期目录

教学纵横 高中数学选择性必修课程函数主线分析 柳双;吴立宝; 1-4 贯彻新课程理念 促学习能力提升——以“三角函数诱导公式”教学为例 陆雨轩; 4-6《中学数学研究》投稿:cn7kantougao163.com 对高中数学新课标教材新增知识点的价值分析 钱伟风;刘瑞美; …

商务分析方法与工具(十):Python的趣味快捷-公司财务数据最炫酷可视化

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…

C# WinForm —— 18 NumericUpDown 介绍

1. 简介 数字显示框,通过向上、向下按钮来 增加/减小 显示的数值 2. 常用属性 属性解释(Name)控件ID,在代码里引用的时候会用到,一般以 numUD 开头Hexadecimal数值 up-down 控件的值是否应以十六进制显示Increment每单击一下按钮,增加或减…

c语言实现十进制(整数,小数)转N进制

文章目录 先来说一下整数转N进制小数转N进制栈和队列代码地址← 今天实现了c语言整数和小数转换为对应的N进制 先来说一下整数转N进制 我们只需要不断的取模然后判断num/N是否等于0就可以了,同时我们还要保存每一组的余数 这里我们的余数是从下往上输出的,是不是就相当于后算出…

纯血鸿蒙APP第三方库——MpChart运动健康场景实践案例

介绍 MpChart是一个包含各种类型图表的图表库,主要用于业务数据汇总,例如销售数据走势图,股价走势图等场景中使用,方便开发者快速实现图表UI,MpChart主要包括线形图、柱状图、饼状图、蜡烛图、气泡图、雷达图、瀑布图…

单链表经典算法OJ题---力扣21

1.链接:. - 力扣(LeetCode)【点击即可跳转】 思路:创建新的空链表,遍历原链表。将节点值小的节点拿到新链表中进行尾插操作 遍历的结果只有两种情况:n1为空 或 n2为空 注意:链表为空的情况 代…

C++干货--引用

前言: C的引用,是学习C的重点之一,它与指针的作用有重叠的部分,但是它绝不是完全取代指针(后面我们也会简单的分析)。 引用的概念: 引用 不是新定义一个变量 ,而 是给已存在变量取了一个别名 &#xf…

大数据在IT行业的应用与发展趋势及IT行业的现状与未来

大数据在IT行业中的应用、发展趋势及IT行业的现状与未来 一、引言 随着科技的飞速发展,大数据已经成为IT行业的重要驱动力。从数据收集、存储、处理到分析,大数据技术为各行各业带来了深远的影响。本文将详细探讨大数据在IT行业中的应用、发展趋势&#…

24年做抖音小店,你还停留在数据?别人都已经开始注重利润了

大家好,我是电商笨笨熊 一件事情持续做,一个项目持续深耕,意义到底是什么? 这句话我常常说,但很多人似乎走偏了实际意义; 尤其对于新手来说,做抖音小店总是向往某某老玩家多么牛的数据&#…

本地搭建各大直播平台录屏服务结合内网穿透工具实现远程管理录屏任务

文章目录 1. Bililive-go与套件下载1.1 获取ffmpeg1.2 获取Bililive-go1.3 配置套件 2. 本地运行测试3. 录屏设置演示4. 内网穿透工具下载安装5. 配置Bililive-go公网地址6. 配置固定公网地址 本文主要介绍如何在Windows系统电脑本地部署直播录屏利器Bililive-go,并…

SMB/RPC协议分析之-命名/匿名管道pipe

在前面的文章中,介绍了SMB协议共享相关的内容,详见我的专栏《网络攻防协议实战分析》,连接这里。在SMB协议中往往需要连接到对应的远程管道,如果你经常接触到SMB协议,相信你对于lsass,svcctl等多种命名管道…

558、Vue 3 学习笔记 -【常用Composition API(七)】 2024.05.13

目录 一、Composition API的优势1. Options API存在的问题2. Composition API的优势 二、 新的组件1. Fragment2. Teleport3. Suspense 三、其他1. 全局API的转移2. 其他改变 四、参考链接 一、Composition API的优势 1. Options API存在的问题 使用传统OptionsAPI中&#xf…