news 2026/6/16 0:30:17

STM32 - 滴答定时器 - 2

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32 - 滴答定时器 - 2

一、滴答定时器(SysTick)概述

SysTick 是Cortex-M 内核(如 STM32F103 用的 Cortex-M3)自带的24位递减定时器,属于内核级外设,而非 STM32 片上外设。核心用途:

  1. 裸机开发:实现微秒 / 毫秒级精准延时;
  2. RTOS 开发:作为系统心跳(Tick),支撑任务调度、时间片轮转;
  3. 通用场景:统计函数执行时间、实现简单定时任务。

二、相关寄存器

1、关键寄存器

寄存器作用
LOAD重装值寄存器,设置计数最大值
VAL当前计数值寄存器,可手动清零
CTRL控制 + 状态寄存器(时钟源选择、使能、中断使能、计数完成标志)
CALIB

校准值寄存器(一般用于 RTOS 节拍校准,裸机开发较少用)

2、CTRL 控制与状态寄存器

  • ENABLE:Systick的使能位。
  • TICKINT:在使用时选择Systick是否要产生中断。若把位2设置为1,则Systick在从初值倒计数到0时就会产生中断。
  • CLKSOURCE:设置为0,则Systick的时钟源就是外部时钟;设置为1,则Systick的时钟源就是内部时钟。选择如下图

3、LOAD寄存器

当计数器从 LOAD 的值递减到 0 时,会自动重载 LOAD 的值,重新开始计数(ENABLE = 1)。 寄存器的低24位有效。

4、VAL 当前计数值寄存器

读取时返回当前计数器的递减值

5、CALIB 校准值寄存器

主要用于 RTOS 中校准系统节拍,裸机开发几乎不用。

三、裸机 - 精确延时

基于STM32f103 - 标准库

1、寄存器配置

1> 选择配置寄存器延时1us,后面的函数调用其就可以实现

  • CTRL:0x00000005 -> 使能滴答定时器 + 选择 HCLK(72MHz)作为 SysTick 时钟源
  • LOAD:HCLK=72MHz ->1 us需要计数 72 次
  • VAL:让定时器从LOAD的数值重新开始计数,避免残留的计数值导致延时误差。
/** * @brief 微秒级延时 * @param xus 延时时长,范围:0~233015 * @retval 无 */ void Delay_us(uint32_t xus) { SysTick->LOAD = 72 * xus; //设置定时器重装值 SysTick->VAL = 0x00; //清空当前计数值 SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器 while(!(SysTick->CTRL & 0x00010000)); //等待计数到0 SysTick->CTRL = 0x00000004; //关闭定时器 }

2> 代码部分:

  • while(!(SysTick->CTRL & 0x00010000)); CTRL的 BIT16 是COUNTFLAG(计数完成标志位):当 SysTick 从 LOAD 值递减到 0 时,该位会自动置 1。这行代码的作用是 “循环等待,直到计数完成”,也就是等待延时时间到。
  • SysTick->CTRL = 0x00000004;关闭 SysTick 定时器(BIT0=0),避免定时器继续运行影响后续操作,BIT2 保持 1(不影响,仅关闭使能)。

2、毫秒/秒级延时

有了上面的微秒延时,实现毫秒/秒就简单了,只需要不停的调用微秒函数就可以了

1>ms延时

/** * @brief 毫秒级延时 * @param xms 延时时长,范围:0~4294967295 * @retval 无 */ void Delay_ms(uint32_t xms) { while(xms--) { Delay_us(1000); } }

2>s延时

/** * @brief 秒级延时 * @param xs 延时时长,范围:0~4294967295 * @retval 无 */ void Delay_s(uint32_t xs) { while(xs--) { Delay_ms(1000); } }

四、使用注意

滴答时钟实现的精准延时属于阻塞型延时在延时过程中,CPU 会持续等待延时完成,无法执行其他任务。在使用的时候要格外注意,以避免延时过多导致系统故障。

参考:@Barkley X

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 22:59:17

Obsidian 看板 + Copilot:项目管理与每日总结的完美闭环

在多项目并行的职场节奏中,项目管理是每个人的必修课。我曾深陷“工具选择困难症”,在滴答清单、Notion 等工具间反复横跳。虽然滴答清单足够优秀,但它始终无法与我的个人知识库深度联动,更难以调用 AI 能力来二次加工我的工作轨迹…

作者头像 李华
网站建设 2026/6/13 22:14:48

涡流传感器金属探测识别检测金银铜铁STM32/51单片机DIY设计模块(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

涡流传感器金属探测识别检测金银铜铁STM32/51单片机DIY设计模块产品功能描述: 涡流传感器金属检测工作原理: 根据法拉利电磁感应定律,金属导体置于变化的磁场中或者在磁场中作切割磁力线运动时,导体内将产生呈涡旋状的感应电流&am…

作者头像 李华
网站建设 2026/6/13 3:58:07

51单片机便携式红外非接触人体测温仪阈值报警91(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

51单片机便携式红外非接触人体测温仪阈值报警91(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码产品功能描述: 本系统由STC89C52单片机、lcd1602液晶、MLX90614ESF红外非接触温度检测、按键、(无线蓝牙/…

作者头像 李华
网站建设 2026/6/13 23:02:24

我们的经常遇到FM20.DLL丢失找不到问题 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/6/13 20:09:21

计算机毕业设计springboot校内评奖评优系统 基于Spring Boot的校园评优评奖管理系统设计与实现 Spring Boot驱动的高校评奖评优信息化平台开发

计算机毕业设计springboot校内评奖评优系统6l522(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着互联网技术的飞速发展,高校管理信息化已成为提升管理效率和透明度…

作者头像 李华
网站建设 2026/6/15 19:38:00

Windows 下 ComfyUI 环境搭建实战及常见错误解决

Windows 下 ComfyUI 环境搭建实战及常见错误解决Windows 下 ComfyUI 环境搭建实战及常见错误解决一、环境搭建详细步骤1. 系统要求检查2. 安装必需软件步骤1: 安装Python 3.10.x步骤2: 安装Git步骤3: 安装CUDA和cuDNN (仅限NVIDIA GPU用户)3. ComfyUI安装步骤方法A: 使用官方仓…

作者头像 李华