【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.pswp.cn/pingmian/73065.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73065.shtml
英文地址,請注明出處:http://en.pswp.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…