[开发工具] Stm32的SysTick详解

[复制链接]
1011|38
 楼主| rosemoore 发表于 2023-9-28 10:00 | 显示全部楼层 |阅读模式
SysTick是STM32微控制器提供的系统定时器,用于提供一个周期性的计时功能。通过SysTick定时器,我们可以实现定时中断、延时等功能。本文将详细介绍STM32的SysTick定时器,并提供相关的代码示例。
SysTick定时器是一个24位的递减计数器,它使用系统时钟作为时基,并通过设置寄存器的值来确定定时周期。SysTick定时器可以以不同的方式工作,包括作为时钟源、生成中断和提供延时功能等。
首先,我们需要启用SysTick定时器。在STM32中,可以通过以下代码来配置和启用SysTick定时器:
```c// 设置SysTick定时器的计数值为系统时钟的一部分// SysTick_Config函数的参数为时钟周期数减1SysTick_Config(SystemCoreClock/1000); // 设置为1毫秒中断一次```
在上述代码中,我们使用`SysTick_Config`函数来配置并启用SysTick定时器。参数`SystemCoreClock/1000`表示定时周期为系统时钟的1/1000。这意味着SysTick定时器每计数到该值时,将产生一次中断。
接下来,我们可以通过在中断处理函数中编写自己的代码来实现定时中断功能:
```cvoid SysTick_Handler(void){  // 在此处编写中断处理代码  // ...}```
在上述代码中,`SysTick_Handler`函数是SysTick定时器中断的处理函数。当SysTick定时器计数达到设定的值时,它会触发这个中断,从而执行其中的代码。
除了定时中断功能,SysTick定时器还可以用于提供延时功能。通过将SysTick定时器的计数器减去一个已知的值,并检查计数器是否为零,可以实现精确的延时功能。以下是一个示例,演示如何使用SysTick定时器提供延时功能:
```cvoid delay_ms(uint32_t milliseconds){  uint32_t startTick = HAL_GetTick(); // 获取当前的SysTick计数值  // 等待直到经过指定的毫秒数  while (HAL_GetTick() - startTick < milliseconds)  {    // 空循环  }}```
在上述代码中,`delay_ms`函数使用当前的SysTick计数值作为起始点,并在循环中检查经过的时间是否达到指定的毫秒数。这样,函数将阻塞程序执行直到延时完成。
需要注意的是,使用SysTick定时器提供的延时功能时,它的精度受系统时钟频率的影响。如果需要更高的精度,可以使用其他定时器或外部晶振,具体取决于应用的需求。

Henryko 发表于 2023-9-29 19:32 | 显示全部楼层
时钟的频率对定时器的影响大吗
Stahan 发表于 2023-9-30 12:25 | 显示全部楼层
Henryko 发表于 2023-9-29 19:32
时钟的频率对定时器的影响大吗

时钟本质上还是对脉冲的计数,晶振频率越稳定越精确
updownq 发表于 2023-10-5 09:16 | 显示全部楼层
SysTick是系统级的定时器, 它的中断优先级通常比较高,可以确保在需要的时候能够得到响应。
albertaabbot 发表于 2023-10-5 11:06 | 显示全部楼层
以配置定时器中断、延时等功能,常用于精确定时、周期定时等场合。
i1mcu 发表于 2023-10-5 11:48 | 显示全部楼层
SysTick是一个系统级的定时器,由硬件提供。在STM32的软件库中,提供了一个驱动程序,用于配置和使用SysTick。驱动程序定义了SysTick的结构体和函数接口,包括SysTick_Config、SysTick_CLKSourceConfig、SysTick_GetCount等函数。
jackcat 发表于 2023-10-7 13:41 | 显示全部楼层
SysTick定时器是一个24位的向下递减的计数器,计数器每计数一次的时间为1/SYSCLK,一般我们设置系统时钟SYSCLK等于72MHz。当重装载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,以此循环往复。
ingramward 发表于 2023-10-7 14:20 | 显示全部楼层
SysTick的counter是一个递减计数器,首先要填入reload自动重装载计数器的初值,使能SysTick之后counter计数器便会随着系统时钟进行计数。当重装载数值寄存器 的值递减到 0 的时候,系统定时器会产生一个中断。
fengm 发表于 2023-10-7 22:08 | 显示全部楼层
SysTick是STM32微控制器提供的一个系统定时器,用于提供一个周期性的计时功能。通过SysTick定时器,我们可以实现定时中断、延时等功能。
hearstnorman323 发表于 2023-10-7 22:40 | 显示全部楼层
SysTick是STM32中的一个重要部件,它可以帮助开发者控制程序的运行时间,实现定时功能,甚至可以用于构建操作系统。
Jacquetry 发表于 2023-10-7 22:50 | 显示全部楼层
频率不准的话双机通信怎么搞
benjaminka 发表于 2023-10-8 17:00 | 显示全部楼层
SysTick的工作原理是,硬件在每次系统时钟的上升沿都会对SysTick寄存器进行读取,如果读取到的值与上次读取的值不同,就会触发一个中断。中断处理函数会被调用,处理一些与时间管理相关的任务,例如更新计时器、唤醒等待的线程等。
everyrobin 发表于 2023-10-8 17:46 | 显示全部楼层
SysTick可以用于各种实时系统中,例如操作系统、嵌入式系统等。它可以用于定时中断、实时时间管理、任务调度等场景。
uiint 发表于 2023-10-8 18:36 | 显示全部楼层
主要作用是提供一个固定的、可编程的定时中断源,用于在实时系统中进行时间管理。
backlugin 发表于 2023-10-8 19:05 | 显示全部楼层
在使用SysTick之前,需要先进行配置。配置主要包括设置SysTick的时钟源、计数方式、计数器溢出方式等。配置完成后,可以通过SysTick_Config函数来设置SysTick的定时值,然后通过SysTick_CLKSourceConfig函数来设置SysTick的时钟源,最后通过SysTick_GetCount函数来获取SysTick的当前值。
Bowclad 发表于 2023-10-8 22:25 | 显示全部楼层
这个可以做实时操作系统的时钟吧
Henryko 发表于 2023-10-10 13:15 | 显示全部楼层
这个可以精确定时吧
AloneKaven 发表于 2023-10-10 17:38 | 显示全部楼层
SysTick的优先级要高
uytyu 发表于 2023-10-10 20:11 | 显示全部楼层
STM32微控制器中的SysTick是一个系统定时器,用于提供低延迟的计时服务。SysTick以固定频率运行,并且可以通过重载寄存器进行配置,以实现不同的计时精度和功能。
wilhelmina2 发表于 2023-10-10 20:50 | 显示全部楼层
在低功耗模式下,SysTick 可以继续运行,从而实现对系统时间的测量和维护。这使得系统能够在低功耗状态下保持时间同步。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

64

主题

1614

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部