STM32 TIM定時器配置

TIM簡介

TIM(Timer)定時器

????????定時器可以對輸入的時鐘進行計數,并在計數值達到設定值時觸發中斷

????????16位計數器、預分頻器、自動重裝寄存器的時基單元,在72MHz計數時鐘下可以實現最大59.65s的定時

????????不僅具備基本的定時中斷功能,而且還包含內外時鐘源選擇、輸入捕獲、輸出比較、編碼器接口、主從觸發模式等多種功能

????????根據復雜度和應用場景分為了高級定時器、通用定時器、基本定時器三種類型

定時器類型

定時中斷基本結構

計數器時序:

計數器溢出頻率:CK_CNT_OV = CK_CNT / (ARR + 1)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = CK_PSC (72M)/ (PSC + 1) / (ARR + 1)

預分頻器時序:

計數器計數頻率:CK_CNT = CK_PSC / (PSC + 1)

定時器中斷代碼:?

TIM函數介紹:

????????下面的函數對應著定時中斷的結構

//時基單元初始化
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);//將結構體變量賦一個默認值
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);//使能計數器
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);//使能中斷輸出信號
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);//選擇內部時鐘
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);//選擇ITRx其他定時器時鐘
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);//選擇TIx捕獲通道的時鐘
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter);//選擇ETR通過外部時鐘模式1輸入的時鐘
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);//選擇ETR通過外部時鐘模式2輸入的時鐘
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);//單獨配置ETR引腳的預分頻器、極性、濾波器這些參數
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);

參數更改函數:

//單獨寫預分頻值
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);//用來更改計數器的計數模式
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);//自動重裝器預裝功能配置
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);//給計數器寫入一個值
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);//給自動重裝器寫入一個值
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);//獲取當前計數器的值
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);//獲取當前的預分頻器的值
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);

配置定時器(內部時鐘):

打開時鐘

這次初始化TIM2,也就是通用定時器,TIM2是APB1的總線外設。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//打開TIM2的外設時鐘

選擇內部時鐘

這里不寫這行代碼也行,因為定時器上電后默認就是使用內部時鐘

 TIM_InternalClockConfig(TIM2);//選擇內部時鐘

配置時基單元

//-----------------------------配置時基單元---------------------------------TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定義TIM結構體變量TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;   //時鐘分頻TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//計數器模式  這里選擇向上計數TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;   //周期 就是ARR自動重裝器的值TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1; //是PSC預分頻器的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重復計數器的值(這個是高級寄存器才有的,這里不需要用直接給0)TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //TIM初始化//-----------------------------配置時基單元---------------------------------

使能更新中斷

 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);						//開啟更新中斷到NVIC通路

NVIC配置

這里的中斷通道選擇TIM2的中斷通道。

//-----------------------------NVIC配置-------------------------------------NVIC_InitTypeDef NVIC_InitStructure;//定義NVIC結構體變量NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//選擇中斷分組2NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//選擇中斷通道NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//搶占優先級NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			 //響應優先級NVIC_Init(&NVIC_InitStructure);//NVIC初始化//-----------------------------NVIC配置-------------------------------------

啟動定時器:

TIM_Cmd(TIM2,ENABLE);//啟動定時器

整體函數:

void Timer_Init(void)
{//---------------------------定義結構體變量-------------------------------TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定義TIM結構體變量NVIC_InitTypeDef NVIC_InitStructure;//定義NVIC結構體變量//---------------------------定義結構體變量-------------------------------RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//打開TIM2的外設時鐘TIM_InternalClockConfig(TIM2);//選擇內部時鐘//-----------------------------配置時基單元---------------------------------TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;		 //時鐘分頻TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //計數器模式  這里選擇向上計數TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;							 //周期 就是ARR自動重裝器的值TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;						 //是PSC預分頻器的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;						 //重復計數器的值(這個是高級寄存器才有的,這里不需要用直接給0)TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);						 //TIM初始化//-----------------------------配置時基單元---------------------------------TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);						//開啟更新中斷到NVIC通路//-----------------------------NVIC配置-------------------------------------NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//選擇中斷分組2NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//選擇中斷通道NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//搶占優先級NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			 //響應優先級NVIC_Init(&NVIC_InitStructure);//NVIC初始化//-----------------------------NVIC配置-------------------------------------TIM_Cmd(TIM2,ENABLE);//啟動定時器
}

中斷函數:

實現定時器計時功能。

uint16_t Num = 0;
//中斷函數void TIM2_IRQHandler(void)
{//獲取中斷標志位,判斷是否觸發中斷if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET){Num++;TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中斷標志位}}

這里定義了一個變量Num,所以需要在頭文件了extern一下,讓其他工程文件也能用這個變量。

主函數:

完成了定時器計時功能,沒過一秒,Num + 1.在屏幕上顯示出來。

#include "timer.h"
int main(void)
{LED_Init();OLED_Init();Timer_Init();OLED_ShowString(1, 3, "Num:");while(1){OLED_ShowNum(1, 5, Num, 5);}	}

這里上電以及復位不是從零開始,需要在NVIC配置之前清除一下標志位

配置外部時鐘:

選擇外部時鐘模式

與內部時鐘配置一樣,只需要選擇外部時鐘模式以及加一個GPIO配置。

配置GPIO

//-----------------------------GPIO配置-------------------------------------GPIO_InitTypeDef GPIO_InitStructure;				//定義GPIO結構體變量GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;		//選擇上拉輸入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;    		//配置引腳GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速率GPIO_Init(GPIOA, &GPIO_InitStructure);//GPIO初始化//-----------------------------GPIO配置-------------------------------------

整體函數配置:

void Timer_Init(void)
{//---------------------------定義結構體變量-------------------------------TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定義TIM結構體變量NVIC_InitTypeDef NVIC_InitStructure;							 //定義NVIC結構體變量GPIO_InitTypeDef GPIO_InitStructure;							 //定義GPIO結構體變量//---------------------------定義結構體變量-------------------------------RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//打開TIM2的外設時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打開GPIO A族時鐘TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted,0x0F);//選擇外部時鐘模式//-----------------------------GPIO配置-------------------------------------GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;		//選擇上拉輸入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;    		//配置引腳GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速率GPIO_Init(GPIOA, &GPIO_InitStructure);//GPIO初始化//-----------------------------GPIO配置-------------------------------------//-----------------------------配置時基單元---------------------------------TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;		 //時鐘分頻TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //計數器模式  這里選擇向上計數TIM_TimeBaseInitStructure.TIM_Period = 10 - 1;							 //周期 就是ARR自動重裝器的值TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;						 //是PSC預分頻器的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;						 //重復計數器的值(這個是高級寄存器才有的,這里不需要用直接給0)TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);						 //TIM初始化//-----------------------------配置時基單元---------------------------------TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);						//開啟更新中斷到NVIC通路TIM_ClearITPendingBit(TIM2,TIM_IT_Update);        		//清除標志位//-----------------------------NVIC配置-------------------------------------NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//選擇中斷分組2NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//選擇中斷通道NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//搶占優先級NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			 //響應優先級NVIC_Init(&NVIC_InitStructure);//NVIC初始化//-----------------------------NVIC配置-------------------------------------TIM_Cmd(TIM2,ENABLE);//啟動定時器
}

功能中斷函數:

uint16_t Num = 0;
//中斷函數void TIM2_IRQHandler(void)
{//獲取中斷標志位,判斷是否觸發中斷if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET){Num++;TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中斷標志位}}uint16_t Timer_Getcount(void)
{return TIM_GetCounter(TIM2);
}

主函數:

#include "timer.h"
int main(void)
{LED_Init();OLED_Init();Timer_Init();OLED_ShowString(1, 1, "Num:");OLED_ShowString(2, 1, "CNT:");while(1){OLED_ShowNum(1, 5, Num, 5);OLED_ShowNum(2, 5, Timer_Getcount(), 5);}		
}

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

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

相關文章

pytorch實現基于Word2Vec的詞嵌入

PyTorch 實現 Word2Vec(Skip-gram 模型) 的完整代碼,使用 中文語料 進行訓練,包括數據預處理、模型定義、訓練和測試。 1. 主要特點 支持中文數據,基于 jieba 進行分詞 使用 Skip-gram 進行訓練,適用于小數…

【數據結構】_鏈表經典算法OJ(力扣/牛客第二彈)

目錄 1. 題目1:返回倒數第k個節點 1.1 題目鏈接及描述 1.2 解題思路 1.3 程序 2. 題目2:鏈表的回文結構 2.1 題目鏈接及描述 2.2 解題思路 2.3 程序 1. 題目1:返回倒數第k個節點 1.1 題目鏈接及描述 題目鏈接: 面試題 …

pytorch基于 Transformer 預訓練模型的方法實現詞嵌入(tiansz/bert-base-chinese)

以下是一個完整的詞嵌入(Word Embedding)示例代碼,使用 modelscope 下載 tiansz/bert-base-chinese 模型,并通過 transformers 加載模型,獲取中文句子的詞嵌入。 from modelscope.hub.snapshot_download import snaps…

爬蟲基礎之爬取某站視頻

目標網址:為了1/4螺口買小米SU7,開了一個月,它值嗎?_嗶哩嗶哩_bilibili 本案例所使用到的模塊 requests (發送HTTP請求)subprocess(執行系統命令)re (正則表達式操作)json (處理JSON數據) 需求分析: 視頻的名稱 F12 打開開發者工具 or 右擊…

DeepSeek R1本地化部署 Ollama + Chatbox 打造最強 AI 工具

🌈 個人主頁:Zfox_ 🔥 系列專欄:Linux 目錄 一:🔥 Ollama 🦋 下載 Ollama🦋 選擇模型🦋 運行模型🦋 使用 && 測試 二:🔥 Chat…

【linux網絡(5)】傳輸層協議詳解(下)

目錄 前言1. TCP的超時重傳機制2. TCP的流量控制機制3. TCP的滑動窗口機制4. TCP的擁塞控制機制5. TCP的延遲應答機制6. TCP的捎帶應答機制7. 總結以及思考 前言 強烈建議先看傳輸層協議詳解(上)后再看這篇文章. 上一篇文章講到TCP協議為了保證可靠性而做的一些策略, 這篇文章…

DeepSeek 遭 DDoS 攻擊背后:DDoS 攻擊的 “千層套路” 與安全防御 “金鐘罩”

當算力博弈升級為網絡戰爭:拆解DDoS攻擊背后的技術攻防戰——從DeepSeek遇襲看全球網絡安全新趨勢 在數字化浪潮席卷全球的當下,網絡已然成為人類社會運轉的關鍵基礎設施,深刻融入經濟、生活、政務等各個領域。從金融交易的實時清算&#xf…

二、CSS筆記

(一)css概述 1、定義 CSS是Cascading Style Sheets的簡稱,中文稱為層疊樣式表,用來控制網頁數據的表現,可以使網頁的表現與數據內容分離。 2、要點 怎么找到標簽怎么操作標簽對象(element) 3、css的四種引入方式 3.1 行內式 在標簽的style屬性中設定CSS樣式。這種方…

第三篇:模型壓縮與量化技術——DeepSeek如何在邊緣側突破“小而強”的算力困局

——從算法到芯片的全棧式優化實踐 隨著AI應用向移動終端與物聯網設備滲透,模型輕量化成為行業核心挑戰。DeepSeek通過自研的“算法-編譯-硬件”協同優化體系,在保持模型性能的前提下,實現參數量與能耗的指數級壓縮。本文從技術原理、工程實…

C++編程語言:抽象機制:泛型編程(Bjarne Stroustrup)

泛型編程(Generic Programming) 目錄 24.1 引言(Introduction) 24.2 算法和(通用性的)提升(Algorithms and Lifting) 24.3 概念(此指模板參數的插件)(Concepts) 24.3.1 發現插件集(Discovering a Concept) 24.3.2 概念與約束(Concepts and Constraints) 24.4 具體化…

DeepSeek-R1本地部署實踐

一、下載安裝 --Ollama Ollama是一個開源的 LLM(大型語言模型)服務工具,用于簡化在本地運行大語言模型,降低使用大語言模型的門檻,使得大模型的開發者、研究人員和愛好者能夠在本地環境快速實驗、管理和部署最新大語言…

AI技術路線(marked)

人工智能(AI)是一個非常廣泛且充滿潛力的領域,它涉及了讓計算機能夠執行通常需要人類智能的任務,比如感知、推理、學習、決策等。人工智能的應用已經滲透到各行各業,從自動駕駛到醫療診斷,再到推薦系統和自…

【leetcode詳解】T598 區間加法

598. 區間加法 II - 力扣(LeetCode) 思路分析 核心在于將問題轉化, 題目不是要求最大整數本身,而是要求解最大整數的個數 結合矩陣元素的增加原理,我們將抽象問題轉為可操作的方法,其實就是再找每組ops中…

【最后203篇系列】004 -Smarklink

說明 這個用來替代nginx。 最初是希望用nginx進行故障檢測和負載均衡,花了很多時間,大致的結論是:nginx可以實現,但是是在商業版里。非得要找替代肯定可以搞出來,但是太麻煩了(即使是nginx本身的配置也很煩…

完全卸載mysql server步驟

1. 在控制面板中卸載mysql 2. 打開注冊表,運行regedit, 刪除mysql信息 HKEY_LOCAL_MACHINE-> SYSTEM->CurrentContolSet->Services->EventLog->Application->Mysql HKEY_LOCAL_MACHINE-> SYSTEM->CurrentContolSet->Services->Mysql …

1. 【.NET Aspire 從入門到實戰】--理論入門與環境搭建--引言

在當前軟件開發領域,云原生和微服務架構已經成為主流趨勢,傳統的單體應用正逐步向分布式系統轉型。隨著業務需求的不斷變化與用戶規模的迅速擴大,如何在保證高可用、高擴展性的同時,還能提高開發效率與降低維護成本,成…

Ubuntu 22.04系統安裝部署Kubernetes v1.29.13集群

Ubuntu 22.04系統安裝部署Kubernetes v1.29.13集群 簡介Kubernetes 的工作流程概述Kubernetes v1.29.13 版本Ubuntu 22.04 系統安裝部署 Kubernetes v1.29.13 集群 1 環境準備1.1 集群IP規劃1.2 初始化步驟(各個節點都需執行)1.2.1 主機名與IP地址解析1.…

基于SpringBoot的新聞資訊系統的設計與實現(源碼+SQL腳本+LW+部署講解等)

專注于大學生項目實戰開發,講解,畢業答疑輔導,歡迎高校老師/同行前輩交流合作?。 技術范圍:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容:…

每日一題——包含min函數的棧

包含min函數的棧 題目數據范圍:示例C語言代碼實現解釋1. push(value)2. pop()3. top()4. min() 總結大小堆 題目 定義棧的數據結構,請在該類型中實現一個能夠得到棧中所含最小元素的 min 函數,輸入操作時保證 pop、top 和 min 函數操作時&am…

RDP協議詳解

以下內容包含對 RDP(Remote Desktop Protocol,遠程桌面協議)及其開源實現 FreeRDP 的較為系統、深入的講解,涵蓋協議概要、歷史沿革、核心原理、安全機制、安裝與使用方法、擴展與未來發展趨勢等方面, --- ## 一、引…