【STM32】uwTick在程序中的作用及用法,并与Delay函数的区别

一、uwTick 的作用

1.系统时间基准

  • uwTick 是一个全局变量(volatile uint32_t),记录系统启动后的毫秒级时间累计值。默认情况下,它由 SysTick 定时器每 ​1ms 自动递增一次(通过 HAL_IncTick() 函数。
  • 例如,若系统运行了 5 秒,uwTick 的值约为 5000。

2.实现延时功能

  • HAL_Delay() 函数依赖 uwTick 实现阻塞延时。其原理是通过记录起始时刻的 uwTick 值,并在循环中持续比较当前值与起始值的差值,直到达到设定的延时时间。

3.时间戳生成

  • 通过 HAL_GetTick() 直接返回 uwTick,用于标记事件发生的时刻或计算时间间隔(如程序执行耗时)。

二、uwTick 的使用方法

1.基本延时操作

// 阻塞延时 100ms
HAL_Delay(100);
  • 内部逻辑:HAL_Delay() 调用 HAL_GetTick() 获取当前 uwTick,循环等待直至时间差达到设定值。 

2.时间间隔计算

uint32_t start = HAL_GetTick();
// 执行某些操作...
uint32_t elapsed_time = HAL_GetTick() - start; // 计算耗时(ms)
  •  注意事项:若时间差超过 uint32_t 最大值(约 49.7 天),需额外处理溢出问题。

3.高精度时间测量

结合 SysTick 的当前计数值(SysTick->VAL)和 uwTick,可提升时间分辨率至微秒级:

uint32_t start_ms, start_ticks, end_ms, end_ticks;
vGetStartTime(&start_ms, &start_ticks); // 记录起始时间
// 执行代码...
vGetIntervalTime(start_ms, start_ticks, &end_ms, &end_ticks); // 计算时间差
float us = end_ms * 1000 + (SysTick->LOAD - end_ticks) * (1e6 / SystemCoreClock); // 转换为微秒
  • SysTick 是递减计数器,SysTick->VAL 提供当前周期内的剩余计数值,与 uwTick 共同实现高精度计时。

三、配置与注意事项

1.时基源选择

  • 默认使用 SysTick 作为时基源,但可通过 CubeMX 切换为硬件定时器(如 TIM1),以规避中断优先级冲突或实现更高精度的延时。
  • 修改方法:在 CubeMX 的 SYS 配置中,选择其他定时器作为时基源。

2.中断优先级问题

  • 风险:在中断服务函数(ISR)中调用 HAL_Delay() 可能导致死锁。例如,若高优先级中断等待 SysTick(低优先级)更新 uwTick,SysTick 中断可能无法触发。
  • 修改方法

避免在中断中使用阻塞延时,改用非阻塞计时(如标志位 + 轮询)。

 修改 SysTick 中断优先级至更高等级(需同步调整其他中断优先级)。

3.自定义时基频率 

  • 通过调整 uwTickFreq 可改变 uwTick 的更新频率(如改为 10kHz):
uwTickFreq = 10; // 10kHz(每 0.1ms 更新一次)
HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq));
  • 注意:需同步修改 HAL_GetTick() 相关逻辑以适配新频率。

 四、uwTick和Delay函数的核心区别

特性uwTickHAL_Delay()
本质全局变量(volatile uint32_t阻塞延时函数
作用记录系统启动后的毫秒级累计时间基于 uwTick 实现固定时长的阻塞延时
更新方式由 SysTick 或硬件定时器中断自动递增无直接操作,依赖 uwTick 的更新
用途时间戳生成、非阻塞计时、任务调度简单延时、代码流程控制
中断安全性可在中断中使用(需注意优先级冲突)禁止在高优先级中断中使用(可能导致死锁)

 五、HAL_Delay()的用法

1.底层原理

  •  HAL_Delay() 是阻塞函数,通过循环检查 uwTick 的差值实现延时。其核心逻辑如下:
void HAL_Delay(uint32_t Delay) {uint32_t tickstart = HAL_GetTick();  // 获取起始时间uint32_t wait = Delay;wait += uwTickFreq;  // 强制至少延时一个时基周期(默认+1ms)[3,4](@ref)while ((HAL_GetTick() - tickstart) < wait) {}  // 阻塞等待[5,7](@ref)
}
  •  误差特性:默认存在 ​**+1ms** 的固定误差(如 HAL_Delay(100) 实际延时 101ms)。

2.典型应用场景

  • 简单延时控制
HAL_Delay(500);  // 阻塞延时500ms(实际501ms)
  • 外设初始化等待:用于传感器上电稳定、通信协议间隔等场景。

3.注意事项

  • 禁止在高优先级中断中使用:可能导致 SysTick 中断无法触发,uwTick 停止更新,函数永不返回。
  • 替代方案:在高实时性场景中,改用硬件定时器或非阻塞计时(基于 uwTick)。

六、关键差异总结

1.角色不同

  • uwTick 是 ​时间基准变量,提供系统时间数据。
  • HAL_Delay() 是 ​延时工具函数,依赖 uwTick 实现功能。

2.使用场景

  • uwTick 适用于需要主动获取时间信息的场景(如性能分析、任务调度)。
  • HAL_Delay() 适用于简单的阻塞等待(如初始化等待、调试指示灯闪烁)。

3.实时性影响

  • HAL_Delay() 会阻塞 CPU,影响系统响应;uwTick 的非阻塞用法更适用于多任务系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73065.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker速通

docker 镜像操作搜索镜像拉取镜像查看镜像删除镜像 容器操作!查看容器运行容器run命令详细介绍 启动容器停止容器重启容器查看容器状态查看容器日志删除容器进入容器 保存镜像提交保存加载 分享社区登录命名推送 docker存储目录挂载卷映射查看所有容器卷创建容器卷查看容器卷详…

OpenCV旋转估计(5)图像拼接的一个函数waveCorrect()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 waveCorrect 是OpenCV中用于图像拼接的一个函数&#xff0c;特别适用于全景图拼接过程中校正波浪形失真&#xff08;Wave Correction&#xff09…

Python、MATLAB和PPT完成数学建模竞赛中的地图绘制

参加数学建模比赛时&#xff0c;很多题目——诸如统计类、数据挖掘类、环保类、建议类的题目总会涉及到地理相关的情景&#xff0c;往往要求我们制作与地图相关的可视化内容。如下图&#xff0c;这是21年亚太赛的那道塞罕坝的题目&#xff0c;期间涉及到温度、降水和森林覆盖率…

深入了解 C# 中的 LINQ:功能、语法与应用解析

1. 什么是 LINQ&#xff1f; LINQ&#xff08;Language Integrated Query&#xff0c;语言集成查询&#xff09;是 C# 和其他 .NET 语言中的一种强大的查询功能&#xff0c;它允许开发者在语言中直接执行查询操作。LINQ 使得开发者可以使用 C# 语法&#xff08;或 VB.NET&…

DeepSeek R1 本地部署指南 (3) - 更换本地部署模型 Windows/macOS 通用

0.准备 完成 Windows 或 macOS 安装&#xff1a; DeepSeek R1 本地部署指南 (1) - Windows 本地部署-CSDN博客 DeepSeek R1 本地部署指南 (2) - macOS 本地部署-CSDN博客 以下内容 Windows 和 macOS 命令执行相同&#xff1a; Windows 管理员启动&#xff1a;命令提示符 CMD ma…

【总结】Pytest vs Behave,BDD 测试框架哪家强?

引言 在测试驱动开发(TDD)和行为驱动开发(BDD)流行的今天&#xff0c;Pytest和 Behave 成为了 Python 生态中最常见的自动化测试框架。那么&#xff0c;究竟该选择哪一个&#xff1f;它们各自有哪些优缺点&#xff1f;本篇文章将为你全面解析&#xff01; 1. 什么是 Pytest&a…

k8s中service概述(二)NodePort

NodePort 是 Kubernetes 中一种用于对外暴露服务的 Service 类型。它通过在集群的每个节点上开放一个静态端口&#xff08;NodePort&#xff09;&#xff0c;使得外部用户可以通过节点的 IP 地址和该端口访问集群内部的服务。以下是关于 NodePort Service 的详细说明&#xff1…

HTML5 Video标签详细教程

HTML5 Video标签详细教程 简介 HTML5引入的<video>标签为网页提供了原生视频播放功能&#xff0c;无需依赖Flash等第三方插件。它使得在网页中嵌入和控制视频内容变得简单而强大。本教程将详细介绍<video>标签的使用方法、属性、事件以及相关技术。 基本用法 最…

Linux系统崩溃破案实录

现代计算环境中&#xff0c;系统的稳定性和可靠性至关重要。然而&#xff0c;即使是最优化的系统也可能会由于硬件故障、软件漏洞或配置错误而崩溃。为了解决这一问题&#xff0c;Linux系统提供了强大的内核崩溃转储机制&#xff0c;本文介绍如何收集和分析崩溃日志&#xff0c…

tcping 命令的使用,ping IP 和端口

1. ‌Windows系统安装‌ ‌下载tcping工具‌&#xff1a;根据系统位数&#xff08;32位或64位&#xff09;下载对应的tcping.exe文件。‌安装步骤‌&#xff1a; 将下载的tcping.exe文件复制到C:\Windows\System32目录下。如果下载的是64位版本&#xff0c;需将文件名改为tcpi…

深度学习框架PyTorch——从入门到精通(6.1)自动微分

使用torch.autograd自动微分 张量、函数和计算图计算梯度禁用梯度追踪关于计算图的更多信息张量梯度和雅可比乘积 在训练神经网络时&#xff0c;最常用的算法是反向传播。在该算法中&#xff0c;参数&#xff08;模型权重&#xff09;根据损失函数的梯度相对于给定参数进行调整…

跟我学C++中级篇——std::not_fn

一、std::not_fn定义和说明 std::not_fn这个模板函数非常有意思&#xff0c;在前面我们学习过wrapper&#xff08;包装器&#xff09;&#xff0c;其实它就是通过封装一个包装器来实现返回值的非。它的基本定义如下&#xff1a; template< class F > /* 未指定 */ not_…

阶跃星辰开源300亿参数视频模型Step-Video-TI2V:运动可控+102帧长视频生成

阶跃星辰&#xff08;StepFun&#xff09;正式开源其新一代图生视频模型 Step-Video-TI2V &#xff0c;该模型基于300亿参数的Step-Video-T2V训练&#xff0c;支持文本与图像联合驱动生成长达102帧的高质量视频&#xff0c;在运动控制与场景适配性上实现突破。 核心亮点 …

java查询es超过10000条数据

java查询es超过10000条数据 背景:需要每天零点导出es中日志数据到数据库中给数据分析人员做清洗&#xff0c;然后展示给业务人员。但在es中默认一次最多只能查询10000条数据。 在这里我就只贴一下关键代码 SearchRequest searchRequest new SearchRequest("索引名"…

使用 libevent 构建高性能网络应用

使用 libevent 构建高性能网络应用 在现代网络编程中&#xff0c;高性能和可扩展性是开发者追求的核心目标。为了实现这一目标&#xff0c;许多开发者选择使用事件驱动库来管理 I/O 操作和事件处理。libevent 是一个轻量级、高性能的事件通知库&#xff0c;广泛应用于网络服务…

HeyGem.ai 全离线数字人生成引擎加入 GitCode:开启本地化 AIGC 创作新时代

在人工智能技术飞速演进的时代&#xff0c;数据隐私与创作自由正成为全球开发者关注的焦点。硅基智能旗下开源项目 HeyGem.ai 近日正式加入 GitCode&#xff0c;以全球首个全离线数字人生成引擎的颠覆性技术&#xff0c;重新定义人工智能生成内容&#xff08;AIGC&#xff09;的…

【leetcode hot 100 39】组合总和

错误解法一&#xff1a;每一次回溯都遍历提供的数组 class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) {List<List<Integer>> result new ArrayList<List<Integer>>();List<Integer> te…

VSCODE右下角切换环境没用

VSCODE惦记右下角python版本&#xff0c;切换别的虚拟环境时&#xff0c;始终切换不了&#xff0c;同时右下角弹出&#xff1a; Client Pylance: connection to server is erroring. 取消继承环境也改了。https://www.cnblogs.com/coreylin/p/17509610.html 还是不行&#xf…

【sql靶场】第23、25,25a关过滤绕过保姆级教程

目录 【sql靶场】第23、25-28关过滤绕过保姆级教程 第二十三关 第二十五关 1.爆出数据库 2.爆出表名 3.爆出字段 4.爆出账号密码 【sql靶场】第23、25&#xff0c;25a关过滤绕过保姆级教程 第二十三关 从本关开始又是get传参&#xff0c;并且还有了对某些字符或字段的过…

python每日十题(5)

保留字&#xff0c;也称关键字&#xff0c;是指被编程语言内部定义并保留使用的标识符。Python 3.x版本中有35个保留字&#xff0c;分别为&#xff1a;and, as,assert,async,await,break,class,continue,def,del,elif,else, except, False, finally,for,from,global, if,import…