stm32 主頻216MHz,寫個ms延時函數,us延時函數

在 STM32 微控制器中,實現精確的 ms(毫秒)和 us(微秒)延時函數通常依賴于系統時鐘(SysTick)或定時器。以下是基于主頻為 216 MHz 的實現方法:

1. 使用 SysTick 實現延時函數
SysTick 是 Cortex-M 內核提供的一個 24 位倒計時定時器,通常用于操作系統的任務調度或提供精確的延時。

(1) 配置 SysTick
在 HAL_Init() 中,SysTick 已經被初始化為 1ms 中斷。我們可以利用 SysTick 的計數器來實現延時。

(2) 實現 ms 延時函數

#include "stm32f4xx_hal.h"  // 包含 HAL 庫頭文件void Delay_ms(uint32_t ms)
{uint32_t start_tick = HAL_GetTick();  // 獲取當前 SysTick 值while ((HAL_GetTick() - start_tick) < ms){// 等待}
}

(3) 實現 us 延時函數
由于 SysTick 的分辨率是 1ms,無法直接用于微秒級延時。可以通過循環空操作來實現微秒級延時。

void Delay_us(uint32_t us)
{uint32_t delay_cycles = us * (SystemCoreClock / 1000000);  // 計算需要的 CPU 周期數volatile uint32_t count = 0;for (count = 0; count < delay_cycles; count++){__asm__("nop");  // 空操作,占用一個 CPU 周期}
}

2. 使用定時器實現延時函數
如果需要更高精度的延時(尤其是微秒級延時),可以使用硬件定時器(如 TIM2、TIM3 等)。

(1) 配置定時器
假設使用 TIM2 定時器,配置為主頻 216 MHz 下的 1us 分辨率。

#include "stm32f4xx_hal.h"void TIM2_Init(void)
{__HAL_RCC_TIM2_CLK_ENABLE();  // 使能 TIM2 時鐘TIM_HandleTypeDef htim2;htim2.Instance = TIM2;htim2.Init.Prescaler = (SystemCoreClock / 1000000) - 1;  // 分頻為 1MHz(1us)htim2.Init.CounterMode = TIM_COUNTERMODE_UP;htim2.Init.Period = 0xFFFFFFFF;  // 最大計數值htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;HAL_TIM_Base_Init(&htim2);HAL_TIM_Base_Start(&htim2);  // 啟動定時器
}

(2) 實現 us 延時函數

void Delay_us(uint32_t us)
{uint32_t start_tick = __HAL_TIM_GET_COUNTER(&htim2);  // 獲取當前定時器值while ((__HAL_TIM_GET_COUNTER(&htim2) - start_tick) < us){// 等待}
}

(3) 實現 ms 延時函數

void Delay_ms(uint32_t ms)
{Delay_us(ms * 1000);  // 調用微秒延時函數
}

3. 綜合示例
以下是一個完整的示例,結合 SysTick 和定時器實現 ms 和 us 延時函數:

#include "stm32f4xx_hal.h"// SysTick 延時函數
void Delay_ms(uint32_t ms)
{uint32_t start_tick = HAL_GetTick();while ((HAL_GetTick() - start_tick) < ms){// 等待}
}// 定時器延時函數
TIM_HandleTypeDef htim2;void TIM2_Init(void)
{__HAL_RCC_TIM2_CLK_ENABLE();htim2.Instance = TIM2;htim2.Init.Prescaler = (SystemCoreClock / 1000000) - 1;htim2.Init.CounterMode = TIM_COUNTERMODE_UP;htim2.Init.Period = 0xFFFFFFFF;htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;HAL_TIM_Base_Init(&htim2);HAL_TIM_Base_Start(&htim2);
}void Delay_us(uint32_t us)
{uint32_t start_tick = __HAL_TIM_GET_COUNTER(&htim2);while ((__HAL_TIM_GET_COUNTER(&htim2) - start_tick) < us){// 等待}
}int main(void)
{// 初始化 HAL 庫HAL_Init();// 配置系統時鐘SystemClock_Config();// 初始化定時器TIM2_Init();// 初始化 GPIO__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// 主循環while (1){// 閃爍 LED(500ms 間隔)HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);Delay_ms(500);// 微秒延時示例Delay_us(1000);  // 延時 1ms}
}

4. 注意事項
精度問題:

SysTick 的 ms 延時精度較高,但 us 延時依賴于空操作循環,可能受編譯器優化影響。

定時器的 us 延時精度較高,但需要占用一個硬件定時器資源。

編譯器優化:

如果使用空操作循環實現 us 延時,建議禁用編譯器優化(如 -O0),或使用 volatile 關鍵字防止優化。

定時器資源:

如果系統中使用了多個定時器,請確保選擇的定時器未被占用。

通過以上方法,可以在 216 MHz 主頻的 STM32 微控制器上實現精確的 ms 和 us 延時函數。

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

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

相關文章

modus開源程序是一個由 WebAssembly 提供支持的構建代理流的框架

一、軟件介紹 文末提供程序和源碼下載 Modus 是一個開源的無服務器框架&#xff0c;用于在 Go 和 AssemblyScript 中構建代理系統和 AI 應用程序。 它簡化了模型、上下文和數據的集成。我們將繼續添加其他功能&#xff0c;以更好地支持工具的構建和調用。 You write a functi…

從零構建大語言模型全棧開發指南:第四部分:工程實踐與部署-4.3.2知識庫增強與外部API集成(代碼示例:HTTP節點與檢索增強生成)

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 知識庫增強與外部API集成:HTTP節點與檢索增強生成實戰4.3.2 知識庫增強與外部API集成(代碼示例:HTTP節點與檢索增強生成)1. 核心挑戰與優化目標1.1 技術瓶頸分析1.2 設計目標2. 關鍵技術方案2.1 知識…

藍橋杯Java B組省賽真題高頻考點近6年統計分類

基礎考點 考點高頻難度模擬9基礎枚舉5基礎思維4基礎動態規劃3基礎規律2基礎單位換算2基礎搜索 1基礎雙指針1基礎數學1基礎哈希表1基礎暴力1基礎Dijkstra1基礎 二分1基礎 中等考點 考點高頻難度動態規劃6中等數學5中等枚舉4中等模擬3中等思維3中等貪心3中等前綴和3中等二分2中…

Rancher2.8.5架構

大多數 Rancher 2.x 軟件均運行在 Rancher Server 上。Rancher Server 包括用于管理整個 Rancher 部署的所有軟件組件。 下圖展示了 Rancher 2.x 的上層架構。下圖中&#xff0c;Rancher Server 管理兩個下游 Kubernetes 集群&#xff0c;其中一個由 RKE 創建&#xff0c;另一…

Java Lambda 表達式提升效率

lambda 表達式的應用場景 Stream 的應用場景 Lambda/Stream 的進一步封裝 自定義函數式接口&#xff08;用 jdk 自帶的函數式接口也可以&#xff09; https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html import java.io.Serializable;/*** 可序…

keep-alive緩存

#keep-alive緩存動態路由的使用指南# 代碼如下圖 &#xff1a; <router-view v-slot"{ Component }"> <keep-alive :include"[Hot, Notifications, User, Setting, Test]"> <component :is"Component" …

使用 PyTorch 的 `GradualWarmupScheduler` 實現學習率預熱

使用 PyTorch 的 GradualWarmupScheduler 實現學習率預熱 在深度學習中,學習率(Learning Rate, LR)是影響模型訓練效果的關鍵超參數之一。為了提升模型的收斂速度和穩定性,學習率調度策略變得尤為重要。其中,學習率預熱(Learning Rate Warmup) 是一種常用的策略,它通過…

【DLI】Generative AI with Diffusion Models通關秘籍

Generative AI with Diffusion Models&#xff0c;加載時間在20分鐘左右&#xff0c;耐心等待。 6.2TODO 這里是在設置擴散模型的參數&#xff0c;代碼里的FIXME部分需要根據上下文進行替換。以下是各個FIXME的替換說明&#xff1a; 1.a_bar 是 a 的累積乘積&#xff0c;在 …

如何在本地部署魔搭上千問Qwen2.5-VL-32B-Instruct-AWQ模型在顯卡1上面運行推理,并開啟api服務

環境: 云服務器Ubuntu NVIDIA H20 96GB Qwen2.5-VL-32B Qwen2.5-VL-72B 問題描述: 如何在本地部署魔搭上千問Qwen2.5-VL-32B-Instruct-AWQ模型在顯卡1上面運行推理,并開啟api服務 解決方案: 1.環境準備 硬件要求 顯卡1(顯存需≥48GB,推薦≥64GB)CUDA 11.7或更高…

基于方法分類的無監督圖像去霧論文

在之前的博客中&#xff0c;我從研究動機的角度對無監督圖像去霧論文進行了分類&#xff0c;而現在我打算根據論文中提出的方法進行新的分類。 1. 基于對比學習的方法 2022年 論文《UCL-Dehaze: Towards Real-world Image Dehazing via Unsupervised Contrastive Learning》&a…

4月3號.

JDK7前時間相關類: 時間的相關知識: Data時間類: //1.創建對象表示一個時間 Date d1 new Date(); //System.out.println(d1);//2.創建對象表示一個指定的時間 Date d2 new Date(0L); System.out.println(d2);//3.setTime修改時間 //1000毫秒1秒 d2.setTime(1000L); System.o…

數據結構與算法:子數組最大累加和問題及擴展

前言 子數組最大累加和問題看似簡單,但能延伸出的題目非常多,千題千面,而且會和其他算法結合出現。 一、最大子數組和 class Solution { public:int maxSubArray(vector<int>& nums) {int n=nums.size();vector<int>dp(n);//i位置往左能延伸出的最大累加…

MIT6.828 Lab3-2 Print a page table (easy)

實驗內容 實現一個函數來打印頁表的內容&#xff0c;幫助我們更好地理解 xv6 的三級頁表結構。 修改內容 kernel/defs.h中添加函數聲明&#xff0c;方便其它函數調用 void vmprint(pagetable_t);// lab3-2 Print a page tablekernel/vm.c中添加函數具體定義 采用…

2025高頻面試設計模型總結篇

文章目錄 設計模型概念單例模式工廠模式策略模式責任鏈模式 設計模型概念 設計模式是前人總結的軟件設計經驗和解決問題的最佳方案&#xff0c;它們為我們提供了一套可復用、易維護、可擴展的設計思路。 &#xff08;1&#xff09;定義&#xff1a; 設計模式是一套經過驗證的…

Java基礎:面向對象進階(二)

01-static static修飾成員方法 static注意事項&#xff08;3種&#xff09; static應用知識&#xff1a;代碼塊 static應用知識&#xff1a;單列模式 02-面向對象三大特征之二&#xff1a;繼承 什么是繼承&#xff1f; 使用繼承有啥好處? 權限修飾符 單繼承、Object類 方法重…

Spring框架如何做EhCache緩存?

在Spring框架中&#xff0c;緩存是一種常見的優化手段&#xff0c;用于減少對數據庫或其他資源的訪問次數&#xff0c;從而提高應用性能。Spring提供了強大的緩存抽象&#xff0c;支持多種緩存實現&#xff08;如EhCache、Redis、Caffeine等&#xff09;&#xff0c;并可以通過…

NVIDIA顯卡

NVIDIA顯卡作為全球GPU技術的標桿&#xff0c;其產品線覆蓋消費級、專業級、數據中心、移動計算等多個領域&#xff0c;技術迭代貫穿架構創新、AI加速、光線追蹤等核心方向。以下從技術演進、產品矩陣、核心技術、生態布局四個維度展開深度解析&#xff1a; 一、技術演進&…

【BUG】生產環境死鎖問題定位排查解決全過程

目錄 生產環境死鎖問題定位排查解決過程0. 表面現象1. 問題分析&#xff08;1&#xff09;數據庫連接池資源耗盡&#xff08;2&#xff09;數據庫鎖競爭(3) 代碼實現問題 2. 分析解決(0) 分析過程&#xff08;1&#xff09;優化數據庫連接池配置&#xff08;2&#xff09;優化數…

【計算機網絡應用層】

文章目錄 計算機網絡應用層詳解一、前言二、應用層的功能三、常見的應用層協議1. HTTP/HTTPS&#xff08;超文本傳輸協議&#xff09;2. DNS&#xff08;域名系統&#xff09;3. FTP&#xff08;文件傳輸協議&#xff09;4. SMTP/POP3/IMAP&#xff08;電子郵件協議&#xff09…

Linux 虛擬化方案

一、Linux 虛擬化技術分類 1. 全虛擬化 (Full Virtualization) 特點&#xff1a;Guest OS 無需修改&#xff0c;完全模擬硬件 代表技術&#xff1a; KVM (Kernel-based Virtual Machine)&#xff1a;主流方案&#xff0c;集成到 Linux 內核 QEMU&#xff1a;硬件模擬器&…