深入解析STM32 Systick定时器:从时钟源选择到精准延时实现

超详细!必看!!STM32-系统滴答SysTick SysTick 定时器的计数是从 LOAD 装载值寄存器的值递减到零的,所以如果你希望实现 n 个时钟周期的延时,你需要将 LOAD 寄存器设置为 n - 1。所以装载值为8999 000,计数器从8999000减到0,总共经过 9000000 个时钟周期,则正好为1s的时间,即实现定时1s。那让滴答时钟计1次,时间过去了1/72μs,也就是一个时钟周期为1/72000000 s =1/72 us。1s的时钟周期个数为9000 000,1ms的时钟周期个数为9000,1us的时钟周期个数为9。 阅读详情

1. Systick定时器:Cortex-M内核的精妙设计

如果你正在学习STM32,肯定会遇到Systick这个定时器。它不像其他外设那样由ST公司设计,而是ARM公司直接内置在Cortex-M内核中的,所有基于Cortex-M3/M4内核的MCU都自带这个定时器。我刚开始接触时也觉得有点绕,但用多了才发现它的精妙之处。

Systick最大的特点就是与NVIC紧密捆绑,这意味着它的中断响应非常高效。在实际项目中,我主要用Systick做两件事:一是裸机开发时的精准延时,替代那些粗糙的for循环延时;二是为RTOS提供心跳时钟,比如FreeRTOS的任务调度就依赖Systick的节拍。记得第一次用Systick实现毫秒级延时时,感觉代码终于摆脱了"盲等"的原始状态。

Systick是一个24位向下递减的计数器,这意味着它的最大计数值是2^24(约1677万)。虽然比不上32位定时器的范围,但对于微秒到秒级的定时需求完全够用。它的时钟源可以选择内核时钟(HCLK)或内核时钟的8分频(HCLK/8),这个选择直接影响定时精度,后面我会详细解释。

2. 深入STM32时钟树:理解Systick的时钟来源

要真正掌握Systick,必须理解STM32的时钟树。我第一次看时钟树时也是一头雾水,但搞明白后才发现STM32的时钟设计真的很巧妙。

STM32有五个主要的时钟源:

  • HSI(高速内部时钟):16MHz的RC振荡器,精度一般但功耗低
  • HSE(高速外部时钟):接外部晶振,通常8-25MHz,精度高
  • LSI(低速内部时钟):32kHz的RC振荡器,用于看门狗和RTC
  • LSE(低速外部时钟):32.768kHz晶振,专门为RTC设计
  • PLL(锁相环):可以对其他时钟进行倍频,得到更高频率

以STM32F407为例,默认使用8MHz的HSE作为时钟源,通过PLL倍频到168MHz。PLL的配置参数很关键:PLL_M=8,PLL_N=336,PPL_P=2。计算公式是:系统时钟 = (HSE / PLL_M) * PLL_N / PLL_P = (8/8)*336/2 = 168MHz。

如果用的开发板外部晶振不是8MHz,就需要修改system_stm32f4xx.c中的PLL_M值和stm32f4xx.h中的HSE_VALUE宏定义。我当初就踩过这个坑,时钟配置不对,所有定时都不准。

3. 时钟源选择:HCLK与HCLK/8的精度差异

Systick有两个时钟源可选:内部时钟(HCLK)和外部时钟(HCLK/8)。这个选择直接影响定时精度和功耗,需要根据具体需求权衡。

如果选择HCLK(168MHz)作为时钟源,计数频率极高,每个计数周期只有约5.95ns。这意味着可以实现非常精细的时间控制,适合需要高精度定时的场合。但高频率也意味着更高的功耗,在电池供电的场景下需要谨慎使用。

如果选择HCLK/8(21MHz)作为时钟源,计数频率降低到原来的1/8,每个计数周期约47.6ns。虽然精度降低了,但功耗也显著下降,适合对功耗敏感的应用。

在实际项目中,我的经验是:如果需要微秒级的高精度延时,就用HCLK;如果只是毫秒级的普通定时且关心功耗,就用HCLK/8。比如驱动WS2812B灯条需要纳秒级精度,就必须用HCLK;而普通的LED闪烁用HCLK/8就足够了。

4. 精准延时实现:中断方式详解

中断方式是使用Systick的经典方法,特别适合需要周期性触发的场景。它的原理很简单:配置Systick每隔固定时间产生一次中断,在中断服务函数中更新计数变量。

先来看关键配置函数:

// 初始化Systick,每1ms产生一次中断
SysTick_Config(168000);  // 168MHz/1000 = 168000

// 中断服务函数
void SysTick_Handler(void)
{
    if(ms_count > 0)
        ms_count--;
}

这里的168000是怎么来的呢?因为Systick是向下计数器,从设定值减到0产生中断。168MHz的时钟频率,每秒钟有1.68亿个时钟周期。要实现1ms中断,就需要168000个周期(168MHz/1000)。

中断方式的优点是实现简单,可以轻松实现长时间定时。我在实际项目中常用这种方式实现多任务的时间片调度,虽然没用RTOS,但也能实现简单的多任务效果。

但中断方式也有缺点:中断频繁发生会增加系统负担,特别是在高精度定时的场合。如果设置1us中断,CPU大部分时间都在处理中断,根本没法做其他工作。所以一般不建议中断频率高于10kHz。

5. 非中断延时:查询方式的高效实现

查询方式是另一种使用Systick的方法,它不产生中断,而是通过不断检查计数标志位来判断是否超时。这种方式更适合单次延时需求,避免了中断的开销。

来看一个微秒级延时的实现:

void delay_us(uint32_t us)
{
    SysTick->LOAD = us * 21 - 1;  // 21MHz时钟
    SysTick->VAL = 0;             // 清空当前值
    SysTick->CTRL = 5;            // 使能定时器,使用HCLK/8
    
    while(!(SysTick->CTRL & 0x10000));  // 等待计数完成
    
    SysTick->CTRL = 0;            // 关闭定时器
}

这里为什么是us * 21 - 1呢?因为使用的是21MHz时钟(168MHz/8),每微秒有21个时钟周期。减1是因为计数器从N减到0需要N+1个周期,所以要补偿这个偏差。

查询方式的优点是效率高,不会产生中断开销。我在需要高频延时的场合经常用这种方式,比如软件模拟I2C、SPI接口时,需要精确控制时序。

但查询方式也有局限性:在延时过程中CPU被完全占用,无法执行其他任务。所以不适合长时间延时,一般用于微秒到毫秒级的短延时。

6. 实际项目应用:两种方式的对比与选择

在实际项目中,我通常根据具体需求选择中断方式或查询方式。这两种方式各有优缺点,需要权衡使用。

中断方式适合的场景:

  • 需要周期性执行的任务
  • 长时间定时(秒级以上)
  • 需要低功耗的应用(可以结合睡眠模式)
  • 多任务时间片调度

查询方式适合的场景:

  • 短时间高精度延时(微秒级)
  • 对实时性要求极高的场合
  • 简单的单次延时需求

我有个实际案例:在智能家居项目中,需要用STM32同时控制LED灯、读取温湿度传感器、响应按键输入。我用中断方式的Systick实现10ms的时间片轮询,每个时间片处理不同的任务。LED渐变效果用查询方式实现微秒级PWM控制,这样既保证了系统响应性,又实现了精细的控制。

7. 常见问题与调试技巧

在使用Systick的过程中,我踩过不少坑,也积累了一些调试经验。这里分享几个常见问题和解决方法。

第一个常见问题是时钟配置错误。记得有一次我的延时函数总是比预期慢8倍,排查了好久才发现是误选了HCLK/8时钟源却按HCLK计算参数。现在我会在初始化时明确指定时钟源:

// 明确选择时钟源
SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk;  // 使用HCLK/8
// 或者
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;   // 使用HCLK

第二个问题是中断优先级配置。Systick中断的优先级不能像普通外设那样配置,需要通过内核的SCB->SHP寄存器设置。我一般把Systick优先级设为最低,避免影响其他重要中断:

NVIC_SetPriority(SysTick_IRQn, (1<<4)-1);  // 设置为最低优先级

第三个问题是延时精度问题。由于中断响应延迟等原因,实际延时时间会有几个时钟周期的误差。对于高精度要求的场合,需要补偿这个误差。我的经验值是补偿2-3个周期,具体可以通过示波器测量调整。

调试Systick时,我经常用GPIO引脚输出电平信号,然后用逻辑分析仪或示波器观察实际延时时间。这种方法虽然原始,但非常直观有效。

从STM32到华大HC32L130:SysTick时钟架构差异与精准延时设计实战 本文深入分析了STM32与华大HC32L130单片机在SysTick时钟架构上的关键差异,特别是HC32L130直接使用系统时钟导致的最大延时时间缩短问题。通过实战案例提供了精准延时设计方案,包括二级延时函数实现、中断安全处理和多场景时钟配置最佳实践,帮助工程师解决代码移植中的时间偏差问题。 阅读详情

相关推荐

【STM32F0系列实战】SysTick定时器:从寄存器到精准延时与RTOS心跳时钟

本文深入解析STM32F0系列微控制器中SysTick定时器的工作原理与应用。从SysTick四大寄存器的详细配置入手,手把手指导如何利用标准库与HAL库实现精准的微秒/毫秒级延时函数,并阐述了SysTick作为实时操作系统(RTOS)心跳时钟的核心机制。文章还分析了实际应用中的精度误差来源及调试技巧,帮助开发者高效利用这一内核资源,提升嵌入式系统的时间控制能力。

weixin_29186249的博客 560

【SysTick系统时钟的使用】

SysTick(System Timer)是一种系统计时器,它是一个24位只能向下递减的计数器(计数器每计数一次的时间为1/SYSCLK),通常用于嵌入式系统中,用于提供基本的系统定时和时钟服务。SysTick定时器是ARM Cortex-M处理器架构中的一个标准组件,存在于内核中。

weixin_44006573的博客 1953

【STM32F407实战指南】深入解析时钟树配置与SysTick高精度延时实现

本文深入解析STM32F407时钟树配置与SysTick高精度延时实现。通过类比城市电网,详细讲解HSI、HSE、PLL等时钟源作用及主PLL配置公式,并提供标准库与HAL库两种配置168MHz系统时钟的实战代码。重点阐述如何利用SysTick定时器实现微秒级和毫秒级精准延时函数,并分享中断影响、操作系统占用等常见避坑指南与优化技巧。

tequila的博客 741

STM32学习笔记一一SysTick

1.简介 SysTick 定时器被捆绑在 NVIC 中,用于产生 SysTick 异常(异常号:15)。在以前,操作系统和有所有使用了时基的系统,都必须要一个硬件定时器来产生需要的“滴答”中断,作为整个系统的时基。滴答中断对操作系统尤其重要。例如,操作系统可以为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时...

霁风AI 896

STM32 SysTick微秒级精准延时实现与工程避坑指南

SysTick是ARM Cortex-M内核集成的24位系统定时器,作为内核级高精度时间基准,其原理基于向下计数与独立AHB时钟路径,相比APB外设定时器具有更低抖动和更高同步性。其技术价值体现在毫秒/微秒级无中断延时、RTOS节拍源及时间戳测量三大核心能力。典型应用场景包括裸机驱动开发、传感器采样同步、LED精确调光等对时序确定性要求严苛的嵌入式系统。本文围绕SysTick寄存器操作、CMSIS头文件依赖(core_cm3.h)、LOAD/VAL/CTRL配置逻辑及查询式延时实现展开,重点解决编译错误频发

weixin_29317963的博客 1052

ADC电路项目1——10bit SAR ADC 设计,smic18工艺,有工艺库,有效位数ENOB为9.8

包括详细仿真文档,原理介绍,完整电路图,仿真参数已设好,可直接使用,在自己的电脑上就可以运行仿真。本设计采用 smic18mmrf CMOS 工艺,使用栅压自举电路的采样开关,Vcm-based 开关。电容开关控制电路,10 位 DFF,最后用 10 位理想 DAC 模块将数字码转换为 10 进制量进。时序上级板采样的 DAC 电容阵列,两级动态比较器,比较器异步时钟,SAR 动态逻辑,DAC。10bit SAR ADC 设计,smic18工艺,有工艺库,有效位数ENOB为9.8。

qq_48407979的博客 814

STM32 CubeMX中Systick 的时钟源

默认时钟源:在 STM32 CubeMX 中,SysTick 的时钟源默认配置为HCLK/8。频率:取决于 HCLK 和分频设置,例如 HCLK = 84 MHz 时,SysTick 时钟 = 10.5 MHz。修改方法:通过修改生成的 HAL 代码(如)切换到 HCLK。

weixin_42727981的博客 1902

群晖设置公网ipv6方式域名解析访问

群晖、IPV6、域名解析

爬山虎的博客 2万+

SysTick时钟

SysTick时钟,俗称“嘀嗒定时器”,它能按固定的时间产生一次中断,通常是多长时间产生一次中断呢?官方给出的一个时间是1ms 那么,它是怎么准确的产生1ms的呢.. 先来看看这家伙在时钟树的哪里吧    它是由HCLK/8得到的,也就是:72MHz/8=9MHz。  我们还能在STM32手册上找到这么一句话:系统嘀嗒校准值固定位9000,当系统嘀嗒时钟设为9MHz,产生1ms时间基准

liukais的博客 4080

32位MIPS流水线CPU设计

32位MIPS流水线CPU设计(vivado)

m0_51320209的博客 3200

rag综述——RAG技术发展流程、最新技术挑战与系统级优化

RAG技术发展综述:本文系统梳理了检索增强生成(RAG)技术的演进历程,从2017年开放域问答中的早期探索,到2020年正式提出RAG架构并与大模型深度融合,再到2025年向系统化、可信化和智能体化发展。当前RAG面临检索可靠性、系统效率和生成可信度三大核心挑战,解决方案包括领域自适应训练、强化语义编码、迭代检索策略等优化方向。未来RAG将向GraphRAG、SafeRAG等方向发展,从单纯性能优化转向构建可控、可审计的语言系统框架,成为高可靠大模型应用的基础设施。

lovehu6686的博客 1242

【STM32开发】SysTick实现精准延时

摘要:本文深入探讨STM32微控制器中SysTick定时器的精准延时实现方法。首先介绍SysTick的硬件结构和工作原理,包括三个关键寄存器(SYST_CSR、SYST_RVR、SYST_CVR)的功能与配置。随后详细讲解HAL库和寄存器两种配置方式,并给出微秒/毫秒级延时函数的实现代码。针对常见问题(延时不准、定时器溢出)提供解决方案。最后通过智能家居LED控制和工业传感器数据采集两个实际案例,展示SysTick在嵌入式系统中的典型应用。文章强调正确配置SysTick对实现精准延时的重要性,并展望其在物联

大雨淅淅的博客 1310

自适应IIR格型滤波器的Matlab实现

概述 在现有的众多抑制窄带干扰的信号处理手段中,时域自适应陷波干扰抑制技术具有实现简单、抗干扰性能好等优点。IIR陷波器按照结构可以分为直接型和格型两种。相比自适应直接型IIR陷波器,自适应格型IIR陷波器不仅可以准确地控制滤波器的陷波频率,也可以准确地调整陷波器的带宽。 传递函数 二阶自适应IIR格型陷波器的传递函数H(z)为: 其中α与陷波带宽有关,β与陷波频率有关;对应的结构如下图所示: Matlab算法实现 ...

剑藏锋的博客 2799

深入解析STM32 Systick定时器:从寄存器配置到精准延时实践

本文深入解析STM32 Systick定时器的寄存器配置与精准延时实践。作为Cortex-M内核的系统定时器,Systick通过四大核心寄存器实现高精度定时,适用于传感器采样、电机驱动等场景。详细介绍了重装载值计算、毫秒/微秒延时实现,并对比中断与查询模式的精度差异,提供实用的优化技巧和调试方法。

moss5的博客 602

LLM 大模型学习必知必会系列(十一):大模型自动评估理论和实战以及大模型评估框架详解

LLM 大模型学习必知必会系列(十一):大模型自动评估理论和实战以及大模型评估框架详解

丨汀、的博客 3216

小米15修复“NV损坏” 去除主板校验电阻步骤解析与图示

小米15系列将搭载骁龙8至尊版处理器,采用台积电3nm工艺。文章分析了手机出现"NV损坏"故障的表现及修复方法,包括通信异常、系统启动问题等典型症状,并介绍了去除主板校验电阻和刷写工程固件两种修复方案。重点讲解了去除主板电阻后刷写QCN文件的操作流程,强调在维修过程中需要结合分析与思考。适用于小米15系列特定机型(24129PN74G/I/C)的硬件修复。

小马哥的专栏 313

深入解析SysTick:从寄存器配置到精准延时实现

本文深入解析ARM Cortex-M内核的SysTick定时器,从寄存器配置原理到精准延时实现。详细讲解CTRL、LOAD、VAL等关键寄存器的作用,分析时钟源选择对延时精度的影响,并提供经过验证的微秒级和毫秒级延时代码方案,帮助开发者掌握精准定时技术。

lg888的博客 691

python实现马丁策略(股市) (附完整源码)

python实现马丁策略(股市) (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 603

STM32(M4)入门:定时器延时与系统滴答(价值 3w + 的嵌入式开发指南)

【STM32 系统滴答(SysTick)开发全解析:从延时实现到系统级应用】 【STM32 定时器延时开发指南:从基础原理到 TIM7 实战应用】 嵌入式开发中如何利用硬件定时器实现精准延时?本文深度解析 STM32 定时器体系,以基本定时器 TIM7 为例,手把手教您掌握延时控制核心技术! 嵌入式开发中如何实现高精度延时与系统级时间管理?本文深度解析 Cortex-M 内核级定时器 SysTick,带您从原理到实战掌握 24 位计数器的核心应用!

嵌入式中手 3879

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【stm32f103c8t6】SysTick滴答定时器延时函数详解

首选要先选择滴答定时器的时钟源(8分频还是1分频)在这里我选择的是8分频。当我们选择8分频的时候,滴答定时器的计数频率就是9MHZ,(也就是计数寄存器 (VAL)1秒计数9 000 000次),计数寄存器一次的时间就是 1/9000000 秒,当计数9次时就是1us,计数器每计数一次就会减一,当减为0 时,重装载寄存器 (LOAD)的值就会给计数寄存器 (VAL),同时控制寄存器 (CTRL)的COUNTFLAG位会置一个标志位。根据这个标志位来判断是否计数1us。

2301_80262474的博客 2313

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

深入解析STM32 Systick定时器:从寄存器配置到精准延时实现

本文深入解析STM32 Systick定时器的寄存器配置与精准延时实现。详细对比HCLK与HCLK_Div8两种时钟源的选择策略,剖析SysTick_Config函数的工作原理,并提供非中断式延时函数的实战代码,帮助开发者掌握这一ARM Cortex-M内核定时器的核心应用技巧。

y7z8a9的博客 757

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【野火指南者】STM32F103 SysTick系统定时器实战:精准延时函数的实现与优化

本文以野火指南者开发板为例,详细讲解了STM32F103中SysTick系统定时器的工作原理与实战应用。通过对比查询标志位、直接操作寄存器及中断等多种方法,指导开发者实现并优化微秒与毫秒级精准延时函数,为嵌入式开发中的时序控制提供可靠解决方案。

p1q2r的博客 1080

【stm32_5】Systick嘀嗒定时器、解析时钟源、分析时钟树、应用Systick设计延时

一般情况下一款MCU有多种时钟源时钟源用于提供时钟信号时钟源分为两类每种时钟源的频率各不相同。内部时钟源外部时钟源结论:不清楚时钟源的频率,就无法计算总线的频率(因为总线的频率也是靠时钟源提供),从而无法计算挂载在总线下外设的频率。定时器属于外设,外设在总线身上, 总线的频率由时钟源提供。

2301_80481107的博客 686

STM32系统滴答定时器SysTick:从原理到精准延时实战

本文深入解析STM32系统滴答定时器SysTick的工作原理与精准延时实现技巧。通过详细讲解寄存器配置、时钟源选择策略及微秒/毫秒级延时函数优化,帮助开发者掌握这一嵌入式时间基准的核心技术,并分享实际项目中的误差分析与补偿方法。

l3m4n的博客 1066

【stm32f103c8t6】SysTick滴答定时器精准延时实现与优化技巧

本文详细介绍了STM32F103C8T6的SysTick滴答定时器实现精准延时的原理与优化技巧。通过分析时钟分频配置、寄存器级操作和常见误差来源,提供了实用的代码示例和调试方法,帮助开发者掌握高精度延时实现,提升嵌入式系统的时间控制性能。

red88的博客 821

STM32F4 SYSTICK实现精准延时控制

本文详解如何利用STM32F4的Cortex-M4内核SysTick定时器实现高精度delay_us和delay_ms延时函数,避免编译器优化与主频变化带来的误差,提供可移植、无外设依赖的轮询式延时方案,并给出初始化配置、核心代码及常见问题解决方案。

weixin_36149538的博客 755
上一篇: SPWM调制技术:从原理到逆变器谐波抑制实战
下一篇: 模块化供电的艺术:TB6612驱动电路与系统电源架构的协同设计
lambda
博客等级 码龄23年 49粉丝 1303原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值