STM32 TIM 定時器深度剖析:結構、時基、中斷與應用開發(超形象詳解)

文章目錄

  • 定時器(TIM)
    • 定時器種類與分布
    • 定時器的基本結構
    • 時基單元
      • 時基單元基本結構
      • 計數器計數方向
      • 時基單元時鐘來源計算
      • 寄存器預加載機制
    • 自制延時函數
      • 獲取單片機當前時間
      • 實現延遲函數
      • 初始化定時器3的時基單元
      • 配置中斷
      • 編寫中斷響應函數
      • 測試延遲函數

定時器(TIM)

定時器種類與分布

  • 定時器種類:單片機里定時器分高級、通用、基本三種,功能上高級定時器最全,通用定時器是在高級定時器基礎上閹割部分功能,基本定時器則是在通用定時器基礎上再閹割部分功能。
  • 分布情況:STM32F1 系列芯片最多有 14 個定時器,定時器 1 和 8 是高級定時器,定時器 6 和 7 是基本定時器,定時器 2 到 5 以及定時器 9 到 14 是通用定時器。實際使用芯片中有 1 個高級定時器(定時器 1)和 3 個通用定時器(定時器 2 - 4),學習編程一般以高級定時器 1 為例。

在這里插入圖片描述

定時器的基本結構

時基單元,輸出比較,輸入捕獲,從模式控制器四個部分。

在這里插入圖片描述

時基單元

時基單元基本結構

  • 時鐘源:時鐘信號主要有兩個來源,通常認為來自上一章學習的時鐘樹,一個為從模式控制器。
  • 預分頻器:因輸入時鐘信號頻率高,需用預分頻器降頻,其分頻系數等于 PSC 的值加 1 。
  • 計數器 CNT:對經過分頻后的脈沖信號計數,每來一個脈沖,計數器的值增加 1。
  • 自動重裝寄存器 ARR:用于設置定時周期,定時周期的值等于 ARR 的值加 1。當計數器 CNT 的值增長到與 ARR 相等時,會發生溢出,然后從 0 開始重新計數。
  • 重復計數器 RCR:設置重復計數的次數。沒有 RCR 時,計數器 CNT 每溢出一次產生一個 update 事件;加入 RCR 后,計數器 CNT 需要溢出 RCR + 1 次才產生一個 update 事件。
    在這里插入圖片描述

和手表類似,手表有石英晶振提供時鐘信號,還有其他電路裝置進行降頻,秒針相當于一個計數器,ARR為59,周期為60,RCR為0,每一個周期產生一個事件。

在這里插入圖片描述

計數器計數方向

  • 上計數(count up):從 0 開始,左邊每來一個脈沖,計數器 CNT 的值增加 1,直到增長到和自動重裝計算器 ARR 相等時發生溢出,然后從 0 開始重新計數。
  • 下計數(count down):與上計數相反,從 ARR 開始計數,左邊每來一個脈沖,計數器 CNT 的值減少 1,直到減少到 0 發生溢出,然后從 ARR 開始重新計數。
  • 中心對齊(center line):首先從 0 開始上計數到 ARR,然后轉變成下計數,從 ARR 開始又計數到 0,完成一個定時周期。下計數和中心對齊用得較少,一般用上計數。

在這里插入圖片描述

時基單元時鐘來源計算

  • 分辨率和周期概念:類比手表,分辨率是計時的最小間隔,周期是轉一圈所消耗的時間。對于定時器,計數器 CNT 每跳一下所消耗的時間是分辨率,從某點到計數器溢出是計數周期。
    在這里插入圖片描述

  • 計算過程:以設置定時器 3 的 11 單元分辨率為 1 微秒,周期為 1 毫秒為例。先根據時鐘樹確定輸入信號頻率,當前配置下所有定時器時鐘頻率為 72 兆赫茲。要得到 1 微秒分辨率即 1 兆赫茲信號,設置預分頻器 PSC 值為 71 ;要設置 1 毫秒周期,自動重裝寄存器 AR 值為 999,重復計數器 RCR 值為 0。

    TIM_CLK是系統自動配置的,如果APB2和APB1的分頻系數為1,TIM_CLK = PCLK2,如果其他系數 TIM_CLK = 2 * PCLK2,右面同理。

在這里插入圖片描述

寄存器預加載機制

預加載機制,如果陰影為黑色,表示默認為開啟,灰色表示默認為關閉。

  • 概念:向寄存器寫值時,先寫入影子寄存器,值不會立即生效,等計數器 CNT 溢出產生 update 事件時,影子寄存器的值才進入活動寄存器并生效,這種緩存機制叫寄存器預加載。

在這里插入圖片描述

  • 作用:以自動重裝寄存器 AR 為例,在定時器運行中改變 AR 值,不使用預加載機制會導致定時器跑飛,加入預加載機制后,可避免該問題,使計數周期正常過渡 。

    未使用預加載寄存器

在這里插入圖片描述

使用了預加載寄存器

在這里插入圖片描述

自制延時函數

使用定時器3和中斷函數自制延時函數,因為使用的是while輪詢等待所以還是會造成程序阻塞。

獲取單片機當前時間

  • 定時器配置:假設時基單元輸入時鐘頻率 72 兆赫茲,設置 PSC 值為 71 對輸入時鐘 72 分頻,得到 1 兆赫茲時鐘頻率,周期 1 微秒;設置定時周期為 1000(999 + 1),即 1 毫秒;設置重復計數器 RCR 值為 0,使 update 事件頻率 1 毫秒一次,激活 update 標志位產生中斷。

  • 變量聲明與作用:聲明無符號 32 位整型變量 current tick ,賦初值 0,用于記錄單片機當前時間(單位毫秒),變量前加 volatile 關鍵字(作用與中斷有關,可自行百度學習)。

    在這里插入圖片描述

  • 中斷響應操作:中斷每毫秒產生一次,在中斷響應函數中讓 current tick 值增加 1,從而記錄單片機開機后的時間。
    在這里插入圖片描述

實現延遲函數

  • 函數設計:定義延遲函數 APP delay,參數為要延遲的毫秒數。
  • 實現思路:用 current tick 獲取當前時間,加上要延遲的時間得到延遲結束時間 expire time ,通過 while 循環等待當前時間超過延遲結束時間,函數結束即實現延遲。

在這里插入圖片描述

初始化定時器3的時基單元

  • 第一步:使能時鐘:定時器 3 在 APB1 總線上,調用 RCC_APB1PeriphClockCmd 開啟其時鐘。
  • 第二步:配置參數:學習 TIM_TimeBaseInit 編程接口,聲明結構體變量 TM_TimeBaseInitTypeDef 并賦值,設置預分頻器 PSC 值 71、周期值 999、計數方向為上計數、重復計數器 RCR 值 0,調用該接口完成參數配置。
  • 第三步:閉合開關:學習 TIM_Cmd 編程接口,用該接口閉合開關使定時器運行。

在這里插入圖片描述

配置中斷

  • 使能 update 中斷:學習 TIM_ITConfig 編程接口,通過該接口閉合 update 標志位產生中斷的開關。
  • 配置 NVIC 模塊
    • 先在 main 方法開頭配置中斷優先級分組;
    • 再聲明結構體變量 NVIC_InitTypeDef 并賦值,設置定時器 3 中斷相關參數,調用 NVIC_Init 完成 NVIC 模塊配置。

在這里插入圖片描述

編寫中斷響應函數

  • 找到函數名:在啟動文件的中斷向量表中找到定時器 3 的中斷響應函數 TIM3_IRQHandler ,復制到 main.c 文件進行實現。
  • 函數內容:先通過 TM_GetFlagStatus 檢查是否由 update 標志位觸發中斷,若是則用 TM_ClearFlag 清除標志位,再讓 current tick 值加 1。

在這里插入圖片描述

測試延遲函數

  • 初始化板載 LED:寫函數初始化板載 LED(PC13 引腳),開啟 GPIOC 時鐘,聲明結構體變量并設置相關參數,初始化完成后關燈。
  • 編寫閃燈程序:在 main 方法的 while 循環中編寫閃燈代碼,調用 APP delay 延遲函數,實現不同閃爍效果(如亮 500 毫秒滅 500 毫秒、兩次短閃一次長閃等),編譯下載代碼到單片機測試,驗證延遲函數可用 。

完整main.c代碼

#include "stm32f10x.h"                  // Device headervolatile uint32_t currentTick = 0;
void App_delay(uint32_t ms);
void App_TIM3_BaseInit(void);
void App_GpioInit(void);
int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);App_TIM3_BaseInit();App_GpioInit();while(1){GPIO_ResetBits(GPIOC, GPIO_Pin_13);App_delay(100);GPIO_SetBits(GPIOC, GPIO_Pin_13);App_delay(100);GPIO_ResetBits(GPIOC, GPIO_Pin_13);App_delay(500);GPIO_SetBits(GPIOC, GPIO_Pin_13);App_delay(500);}
}
//自制延時函數邏輯
void App_delay(uint32_t ms)
{uint32_t extime = ms + currentTick;while(extime > currentTick);
}
//定時器3初始化
void App_TIM3_BaseInit(void)
{//開啟定時器3的時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//配置時基單元參數TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period = 999;TIM_TimeBaseInitStruct.TIM_Prescaler = 71;TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);//閉合時基單元開關TIM_Cmd(TIM3, ENABLE);//使能updateTIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);//配置NVIC模塊NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStruct);}
void TIM3_IRQHandler(void)
{//先判斷是不是要的中斷if(TIM_GetFlagStatus(TIM3, TIM_FLAG_Update) == SET){//將中斷標志位清除TIM_ClearFlag(TIM3, TIM_FLAG_Update);//操作currentTick++;}
}
void App_GpioInit(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStruct);
}

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

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

相關文章

Java使用minio上傳整個目錄下的所有內容

目錄 1、添加相關配置 2、添加依賴 3、實現方法 1??基礎版: 2??優化版(推薦使用): 3??上傳遠程主機上的目錄內容: 4??直接上傳遠程主機中的目錄內容 業務背景:需要需要minio進行上傳指定目錄下所有…

Python的分布式網絡爬蟲系統實現

1. 系統架構概述 一個典型的分布式網絡爬蟲系統通常包含以下幾個核心組件: 1.主節點(Master Node): 任務調度:負責將抓取任務分配給各個工作節點。URL 管理:維護待抓取的 URL 隊列和已抓取的 URL 集合&a…

AI工具的選擇:Dify還是傳統工具?

從純技術視角出發,選擇Dify還是傳統開發工具需要基于六個核心維度進行理性決策。以下為結構化分析框架,附典型場景示例: 1. 開發效率 vs 控制力權衡矩陣 維度Dify優勢場景傳統工具優勢場景迭代速度需求明確的標準CRUD(如后臺管理…

2.3 TypeScript 非空斷言操作符(后綴 !)詳解

在 TypeScript 中,當你開啟了嚴格的空值檢查(strictNullChecks)后,變量如果可能是 null 或 undefined,就必須在使用前進行顯式的判斷。為了在某些場景下簡化代碼,TypeScript 提供了非空斷言操作符&#xff…

深度學習:損失函數與激活函數全解析

目錄 深度學習中常見的損失函數和激活函數詳解引言一、損失函數詳解1.1 損失函數的作用與分類1.2 回歸任務損失函數1.2.1 均方誤差(MSE)1.2.2 平均絕對誤差(MAE) 1.3 分類任務損失函數1.3.1 交叉熵損失(Cross-Entropy&…

掌握 npm 核心操作:從安裝到管理依賴的完整指南

圖為開發者正在終端操作npm命令,圖片來源:Unsplash 作為 Node.js 生態的基石,npm(Node Package Manager)是每位開發者必須精通的工具。每天有超過 1700 萬個項目通過 npm 共享代碼,其重要性不言而喻。本文…

Elasticsearch的運維

Elasticsearch 運維工作詳解:從基礎保障到性能優化 Elasticsearch(簡稱 ES)作為分布式搜索和分析引擎,其運維工作需要兼顧集群穩定性、性能效率及數據安全。以下從核心運維模塊展開說明,結合實踐場景提供可落地的方案…

國產三維CAD皇冠CAD(CrownCAD)建模教程:汽車電池

在線解讀『汽車電池』的三維建模流程,講解3D草圖、保存實體、拉伸凸臺/基體、設置外觀等操作技巧,一起和皇冠CAD(CrownCAD)學習制作步驟吧! 汽車電池(通常指鉛酸蓄電池或鋰離子電池)是車輛電氣系…

深入理解 JDK、JRE 和 JVM 的區別

在 Java 中,JDK、JRE 和 JVM 是非常重要的概念,它們各自扮演著不同的角色,卻又緊密相連。今天,就讓我們來詳細探討一下它們之間的區別。 一、JVM JVM 即 Java 虛擬機,它是整個 Java 技術體系的核心。JVM 提供了 Java…

云電腦顯卡性能終極對決:ToDesk云電腦/順網云/海馬云,誰才是4K游戲之王?

一、引言 1.1 云電腦的算力革命 云電腦與傳統PC的算力供給差異 傳統PC的算力構建依賴用戶一次性配置本地硬件,特別是CPU與顯卡(GPU)。而在高性能計算和游戲圖形渲染等任務中,GPU的能力往往成為決定體驗上限的核心因素。隨著游戲分…

撤銷Conda初始化

在安裝miniconda3的過程中,最后系統會出現這一行提示用戶可以選擇自動初始化,這樣的話,系統每次啟動就會自動啟動基礎(base)環境。 但是我們也可以通過 conda init --reverse $shell 來撤銷 Conda 的初始化設置。這將恢…

Flask-SQLAlchemy數據庫查詢:query

1、為什么可以用 模型類.query 來查詢數據庫? 在 Flask 中使用 SQLAlchemy ORM 時,所有繼承自 db.Model 的模型類都會自動獲得一個 query 屬性。 其本質是 db.session.query(模型類) 的快捷方式,無需顯式操作 db.session。 代碼示例&#…

【免費】【無需登錄/關注】度分秒轉換在線工具

UVE Toolbox 功能概述 這是一個用于地理坐標轉換的在線工具,支持兩種轉換模式: 十進制度 → 度分秒 度分秒 → 十進制度 使用方法 十進制度轉度分秒 在"經度"輸入框中輸入十進制度格式的經度值(例如:121.46694&am…

怎么判斷一個Android APP使用了React Native 這個跨端框架

要判斷一個 Android 應用是否使用了 React Native 框架,可以通過以下方法逐步驗證: 一、安裝包結構分析 1. 解壓 APK 將 .apk 文件重命名為 .zip 并解壓,檢查以下特征文件: ? assets/index.android.bundle: React Na…

Pluto實驗報告——基于2ASK的簡易的通信系統

一、實驗目的 1. 熟悉并掌握PLUTO SDR 主動學習模塊的使用; 2.通過matlab 編碼與adalm pluto 相配合達成一個簡易的通信系統,并能 夠傳輸一些較為簡單的信息。 二、實驗原理 2ASK 調制原理: 振幅鍵控是指利用載波的振幅變化來傳遞數字基帶信…

Ubuntu 24-部署FTP和自定義用戶

目錄 一、 安裝 vsftpd 二、創建 FTP 數據目錄 三、創建 FTP 用戶 四、配置 vsftpd 五、重啟 vsftpd 服務 六、增加新用戶腳本 一、 安裝 vsftpd sudo apt update sudo apt install vsftpd -y 二、創建 FTP 數據目錄 sudo mkdir -p /data/ftp sudo chown nobody:nogrou…

MySQL問題:什么是MySQL的中的最左匹配原則?

是指在復合索引中,查詢條件需要按照索引列的順序從最左側列開始依次匹配。只有查詢條件中的列按照索引的最左邊列開始進行匹配,索引才能被有效使用,但有時雖然不是正常順序,由于MySQL中存在優化器,會自動調整順序&…

2025軟考軟件設計師題目

選擇題(綜合題) 確定得分的 1、Linux外設目錄是什么 /dev。存儲磁盤的目錄 2、Linux外設sdc類型設備屬于什么 scsi hard disk。根據第一個字母s盲猜的 3、計算機中讓程序計數器PC不能指向當前運行程序的技術是 流水線。根據流水線的原理 4、Python程…

Deep Evidential Regression

摘要 翻譯: 確定性神經網絡(NNs)正日益部署在安全關鍵領域,其中校準良好、魯棒且高效的不確定性度量至關重要。本文提出一種新穎方法,用于訓練非貝葉斯神經網絡以同時估計連續目標值及其關聯證據,從而學習…

每天掌握一個Linux命令 - sqlite3

Linux 命令工具 sqlite3 使用指南 一、工具概述 sqlite3 是 SQLite 數據庫的命令行工具,用于在 Linux 系統中直接操作 SQLite 數據庫(輕量級、無服務器、嵌入式關系型數據庫)。 核心特點: 無需安裝數據庫服務,直接通…