news 2026/4/3 6:24:19

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/3/30 15:31:10

2.3 从官方Demo到“Hello World”任务

2.3 从官方Demo到“Hello World”任务 2.3.1 官方Demo的价值:作为可运行的系统蓝图 FreeRTOS官方提供的演示项目(Demo),通常随源码包发布或集成在芯片厂商的软件开发包中,其首要价值在于它是一个立即可运行、且功能相对完整的参考系统。对于初学者而言,直接分析一个已在…

作者头像 李华
网站建设 2026/4/1 12:38:12

AirPlay音频SDK缓冲区溢出漏洞分析与利用尝试

AirPlay音频SDK缓冲区溢出漏洞分析与利用尝试 项目描述 本项目旨在记录和分析针对汽车车机系统获取root权限的研究过程,重点关注AirPlay Exploits CVE-2025-24132和CVE-2025-30422(代号Airbourne)这两个由Oligo Security发现的漏洞。研究基于…

作者头像 李华
网站建设 2026/3/27 0:19:05

动态SQL(二)—— where标签

DynamicSQLMapper.xmlDynamicSQLMapper测试可以看到这里自动添加了where,然后也去掉了and 修改 DynamicSQLMapper.xml重新测试总结 当where标签中有内容时,会自动生成where关键字,并且将内容前多余的and或or去掉 当where标签中没有内容时&…

作者头像 李华
网站建设 2026/4/3 4:01:52

Locust百万并发容器化部署实战指南

容器化部署的价值与挑战‌ 在云原生时代,性能测试面临高并发、弹性的新需求。Locust作为开源工具,支持分布式测试,但传统部署难以突破单机瓶颈。容器化(如Docker和Kubernetes)通过资源隔离和弹性伸缩,成为…

作者头像 李华
网站建设 2026/3/28 15:56:08

机械行业WordPress如何处理CAD图纸的Web端批注操作?

要求:开源,免费,技术支持 博客:WordPress 开发语言:PHP 数据库:MySQL 功能:导入Word,导入Excel,导入PPT(PowerPoint),导入PDF,复制粘贴word,导入微信公众号内容,web截屏 平台:Window…

作者头像 李华