使用STM32定時器實現精確的時間測量和延時

??作者簡介:熱愛科研的嵌入式開發者,修心和技術同步精進,

代碼獲取、問題探討及文章轉載可私信。

???愿你的生命中有夠多的云翳,來造就一個美麗的黃昏。

🍎獲取更多嵌入式資料可點擊鏈接進群領取,謝謝支持!👇

點擊領取更多詳細資料

1. 介紹

在嵌入式系統開發中,對時間的精確測量和延時是很常見的需求。STM32微控制器提供了豐富的定時器功能,可以用于實現精確的時間測量和延時。本文將介紹如何使用STM32定時器來實現精確的時間測量和延時,并提供相關代碼示例。

2. 定時器測量時間

2.1 定時器初始化配置

在使用定時器測量時間前,首先需要初始化并配置定時器。以下是一個典型的定時器初始化的代碼片段:

```c
TIM_HandleTypeDef htim2;void MX_TIM2_Init(void)
{TIM_ClockConfigTypeDef sClockSourceConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};htim2.Instance = TIM2;htim2.Init.Prescaler = 16000 - 1;htim2.Init.CounterMode = TIM_COUNTERMODE_UP;htim2.Init.Period = 65535;htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(&htim2) != HAL_OK){Error_Handler();}sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK){Error_Handler();}if (HAL_TIM_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK){Error_Handler();}
}
```

在以上代碼中,使用了TIM2定時器,并配置了定時器的時鐘源、分頻系數等參數,以便后續進行精確的時間測量。

2.2 測量時間

使用定時器測量時間一般包括以下步驟:

```c
uint32_t start_time, end_time, elapsed_time;// 啟動定時器
HAL_TIM_Base_Start(&htim2);
start_time = __HAL_TIM_GET_COUNTER(&htim2);// 進行需要測量的操作// 停止定時器
end_time = __HAL_TIM_GET_COUNTER(&htim2);
HAL_TIM_Base_Stop(&htim2);// 計算耗時
elapsed_time = end_time - start_time;
```

通過以上代碼,可以利用定時器準確地測量某段代碼的執行時間,從而實現對程序運行時間的精確測量。

3. 延時

3.1 定時器初始化配置

同樣地,使用定時器進行延時前需要進行初始化配置。以下是一個典型的定時器初始化的代碼片段:

```c
TIM_HandleTypeDef htim3;void MX_TIM3_Init(void)
{TIM_ClockConfigTypeDef sClockSourceConfig = {0};htim3.Instance = TIM3;htim3.Init.Prescaler = 16000 - 1;htim3.Init.CounterMode = TIM_COUNTERMODE_UP;htim3.Init.Period = 65535;htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(&htim3) != HAL_OK){Error_Handler();}sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK){Error_Handler();}
}
```

3.2 實現延時

使用定時器進行延時一般包括以下步驟:

```c
void HAL_Delay(uint32_t milliseconds)
{uint32_t start_time, current_time;HAL_TIM_Base_Start(&htim3);start_time = __HAL_TIM_GET_COUNTER(&htim3);do {current_time = __HAL_TIM_GET_COUNTER(&htim3);} while(current_time - start_time < milliseconds);HAL_TIM_Base_Stop(&htim3);
}
```

通過以上代碼,可以使用定時器實現毫秒級的精確延時,滿足嵌入式系統中對延時精度要求較高的場景。

4. 總結

通過本文的介紹,您應當對如何使用STM32定時器來實現精確的時間測量和延時有了初步的了解。合理配置并使用定時器功能,可以實現對程序運行時間的精確測量和對延時進行有效的控制,為嵌入式系統的開發提供了更精準的時間支持。

嵌入式物聯網的學習之路非常漫長,不少人因為學習路線不對或者學習內容不夠專業而錯失高薪offer。不過別擔心,我為大家整理了一份150多G的學習資源,基本上涵蓋了嵌入式物聯網學習的所有內容。點擊這里,0元領取學習資源,讓你的學習之路更加順暢!記得點贊、關注、收藏、轉發哦。?

? 點擊鏈接掃碼進入嵌入式交流群 ?https://fss.mpay8.cn/article/dmrjinh2C6fjejm

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208762.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208762.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208762.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

stm32Flash操作

//G0B0 flash大小 0x08000000-0x0807FFFF 512K(0400 1K)//2k 1頁 //初始化標記數據地址 放最前面 脫機燒寫器可擦除掉 #define CONST_INITMARKDATA_ADDRESS (0x0807D000UL) //2k 1頁 //射頻數據地址 #define CONST_FREQDATA_ADDRESS (0x0807F000UL) //2…

大數據技術4:Lambda和Kappa架構區別

前言&#xff1a;在大數據處理領域&#xff0c;兩種突出的數據架構已成為處理大量數據的流行選擇&#xff1a;Lambda 架構和 Kappa 架構。這些架構為實時處理和批處理提供了強大的技術解決方案&#xff0c;使組織能夠從其數據中獲得有價值的見解。隨著互聯網時代來臨&#xff0…

Python VSCode 配置固定的腳本入口

Python VSCode 配置固定的腳本入口 打開或者新建一個啟動配置 選擇 .vscode目錄下 launch.json文件 將 “program”: “${file}” 替換成 “program”: “mian.py”, //完成你自己的入口.py文件名即可 json啟動配置文件 {// Use IntelliSense to learn about possible attrib…

4-redis高級-redis持久化(RDB 持久化方案、AOF持久化、RDB和AOF混合持久化)、redis主從復制

1 redis持久化 1.1 RDB 持久化方案 1.2 AOF持久化 1.3 混合持久化 2 redis主從復制 1 redis持久化 # 把redis數據從內存保存到硬盤上的過程稱之為持久化# 所有的數據庫&#xff0c;持久化方案快照&#xff1a;某時某刻數據的一個完成備份-mysql的Dump&#xff1a; mysqldump …

【ELK03】ES 索引的Mapping映射詳解、數據類型和settings屬性設置

一、ES 索引的映射和設置 1.MAPPING 映射(MAPPING)就是es中一個決定了文檔如何存儲,如何生成索引,字段各種類型定義的過程.類似于我們在關系型數據庫中創建一個表格數據之前先定義表格有哪些字段,每個字段是什么類型,然后數據會按照這個配置寫入表格,ES中同樣是這個過程,它由…

數據結構:順序表——相關習題2

【2018統考】給定一個含n個整數的數組&#xff0c;設計一個時間上盡可能高效的算法&#xff0c;找到數組中未出現的最小正整數。 void find_min_intnum(int A[],int n){int B[5*n]{0};int i;for (i 0; i < n; i){if(A[i]>0){B[A[i]];}}for(i1;i<5*n;i){if(B[i]0){pr…

面向對象中的單例模式

1、什么是設計模式 設計模式就是前人根據實際的問題提出的問題解決方案&#xff0c;我們把這種就稱之為設計模式。 2、單例模式 單例模式是一種常見的設計模式&#xff01; 所謂的設計模式&#xff0c;不是一種新的語法&#xff0c;而是人們在實際的應用中&#xff0c;面對…

【銀行測試】金融項目+測試方法范圍分析,功能/接口/性能/安全...

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 1、金融行業軟件特…

3GPP標準查看、下載和幾個UE相關系列標準

由于一直做終端側協議。最近以UE為核心重新下載了一系列文檔。 總結并舉例一下分類標準。 如何查看3GPP標準列表 實際上在3GPP網站如下鏈接&#xff1a;Specifications by Series&#xff0c;每個系列以及分類都說的很清楚。 幾個系列分類舉例 和終端協議層工作比較關系密切…

如何使用Java Websocket實現實時數據監控功能?

隨著互聯網應用的不斷發展&#xff0c;實時數據監控功能成為了許多應用的必備功能之一。本文將介紹如何使用Java WebSocket實現實時數據監控功能&#xff0c;并提供具體的代碼示例。 關鍵詞&#xff1a;Java WebSocket、實時數據監控、代碼示例 一、什么是WebSocket&#xff…

ModuleNotFoundError: No module named ‘dlib‘

解決&#xff1a;ModuleNotFoundError: No module named ‘dlib’ 文章目錄 解決&#xff1a;ModuleNotFoundError: No module named dlib背景報錯問題報錯翻譯報錯位置代碼報錯原因解決方法方法一&#xff0c;直接安裝方法二&#xff0c;手動下載安裝方法三&#xff0c;編譯安…

setuid 的風險及開發過程中的避免方式

使用setuid&#xff08;Set User ID&#xff09;功能將執行程序的有效用戶 ID 設置為文件所有者的用戶 ID。這意味著執行程序將以文件所有者的特權運行&#xff0c;而不是以執行者自己的特權運行。 盡管setuid是一個有用的功能&#xff0c;但它也會帶來一些安全風險。下面是幾…

Linux C語言 37- 進程間通信IPC

Linux C語言 37-進程間通信IPC 本節關鍵字&#xff1a;C語言 進程間通信 信號 管道 消息隊列 共享內存 網絡通信&#xff08;套接字&#xff09; 相關庫函數&#xff1a; 提示&#xff1a;先做內容框架梳理&#xff0c;后期進行完善補充&#xff01; 什么是進程間通信&#…

blender 數字鍵盤上的快捷鍵

數字0可以切換到相機視角&#xff0c;即從相機的位置和角度查看場景。數字1、3、7分別可以切換到正交的前視圖、右視圖和頂視圖&#xff0c;即沿著X、Y、Z軸的垂直投影。數字5可以切換正交視圖和透視視圖&#xff0c;即是否考慮遠近的視覺差異。數字2、4、6、8分別可以順時針或…

SD之lora訓練

目錄 為什么要訓練自己的模型 SD模型微調方法 準備素材 1 確定要訓練的LoRA類型 2 圖片收集 3 圖片預處理 4 圖片標注 安裝Koyha_ss 訓練lora 1.準備參數和環境 2.啟動訓練 使用模型 1 拷貝訓練過的lora模型 2 啟動SD WebUI進行圖像生成 為什么要訓練自己的模型 …

webpack該如何打包

1.我們先創建一個空的大文件夾 2.打開該文件夾的終端 輸入npm init -y 2.1.打開該文件夾的終端 2.2在該終端運行 npm init -y 3.安裝webpack 3.1打開webpack網址 點擊“中文文檔” 3.2點擊“指南”在點擊“起步” 3.3復制基本安裝圖片畫線的代碼 4.在一開始的文件夾下在創建一…

【Android】使用Netty庫來實現Socket接收

在Android中使用Netty來實現Socket接收是可行的。Netty是一個高性能的網絡通信框架&#xff0c;支持多種協議&#xff0c;包括原生的Socket通信。 以下是一個簡單的示例代碼&#xff0c;演示如何使用Netty在Android中實現Socket接收&#xff1a; 首先&#xff0c;在你的Andro…

案例061:基于微信小程序的互助學習系統

文末獲取源碼 開發語言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 數據庫&#xff1a;mysql 5.7 開發軟件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序開發軟件&#xff1a;HBuilder X 小程序…

Flask template中使用iframe

Flaks template中使用iframe嵌套新的網頁&#xff08;new_page.html&#xff09;的網頁到歷史網頁&#xff08;old_page.html&#xff09;中&#xff08;減少新網頁的入口&#xff09; 1,增加iframe tag 在old_page.html中適當位置增加iframe入口標簽&#xff1a; <ifram…

django與數據庫交互關于當前時間的坑

背景 在線上服務中使用時間進行數據庫操作時發現異常&#xff0c;而在本地環境無法成功復現此問題&#xff0c;導致難以進行故障排查。 核心問題 view.py class XxxViewSet(viewsets.ModelViewSet):queryset Xxx.objects.with_status().order_by("status", &quo…