TIM(Timer)簡介

TIM(Timer)定時器介紹

  1. 定時器可以對輸入的時鐘進行計數,并在計數值達到設定值時觸發中斷
  2. 16位計數器、預分頻器、自動重裝寄存器的時基單元,在72MHz計數時鐘下可以實現最大59.65s的定時
  3. 不僅具備基本的定時中斷功能,而且還包含內外時鐘源選擇、輸入捕獲、輸出比較、編碼器接口、主從觸發模式等多種功能
  4. 根據復雜度和應用場景分為了高級定時器、通用定時器、基本定時器三種類型

定時器分類

在這里插入圖片描述

基本定時器

在這里插入圖片描述
時基單元為下圖的預分頻器、計數器、自動重裝寄存器。

內部時鐘CK-INT

預分頻器之前連接的是基準計數時鐘的輸入(由于基本定時器只能選擇內部時鐘、輸入端可以直接認為內部時鐘CK-INT、所以通向時基單元的計數頻率就是72M)

預分頻器

預分頻系數實際分頻系數=預分頻器的值+1(預分頻值0:就是不分頻72M 、數值1: 就是2分頻就是36M)預分頻是16位的也就是0X0000~0XFFFF所以最大值是65535,也就是65536分頻(預分頻器的值+1)

計數器

作用是對輸入的預分頻后的計數時鐘(CK_CNT)進行計數,計數時鐘(CK_CNT)每來一個上升沿,計數器值就+1
計數器也是16位的也就是0X0000~0XFFFF所以最大值是65535,如果再加的話計數器就會回到0,當運行到目標值時就會產生UI更新中斷U更新事件

自動重裝寄存器

作用就是存儲我們寫入的計數目標,也是16位的也就是0X0000~0XFFFF所以最大值是65535,到達目標值后就會產生UI更新中斷U更新事件,中斷就會通向NIVC,配置好NVIC的定時器通道,定時器的事件信息就能得到CPU的相應了
在這里插入圖片描述

主從模式觸發DAC

用途時使用DAC輸出一段波形,那就需要每隔一段時間觸發一次DAC,讓他輸出下一個電壓點。中斷容易打斷主程序運行,所以提供主模式下可以把定時器的U更新事件 映射到觸發TRGO(Trigger Out)的位置,TRGO直接接到DAC的觸發引腳上。實現了硬件的自動化

通用定時器

在這里插入圖片描述
基本定時器只有向上計時的功能。通用定時器和高級定時器有三種計時功能:向上(0到目標值)、向下(目標值到0)、中央對其計時(0到目標值再從目標值到0,完成一次計時就觸發一次事件)

基準定時器輸入

對于基本定時器只能選擇內部時鐘也是72MHZ,通用和高級不僅可以使用內部時鐘,還可以使用外部時鐘TIMx-ETR

外部時鐘模式2——外部時鐘TIMx-ETR- ETR極性選擇…-輸入濾波-EFRF-基準時鐘選擇

外部時鐘模式1——TRGI主要是觸發輸入來使用的

  1. ETR

  2. ITR0
    定時器的級聯
    在這里插入圖片描述
    在這里插入圖片描述

  3. TI1FP1、TI2FP2

編碼器接口
可以讀取正交編碼器的輸出波形

輸出比較電路

在這里插入圖片描述
可以用于輸出PWM波形,驅動電機。對應四個通道CH1、CH2、CH3、CH4

輸入捕獲電路

在這里插入圖片描述
可以用于測量輸入方波的頻率和占空比。
輸入捕獲電路也對應四個通道CH1、CH2、CH3、CH4。

捕獲/比較寄存器

在這里插入圖片描述
捕獲/比較寄存器,是輸入和輸出比較電路公用的

高級定時器

在這里插入圖片描述

與通用定時器不相同的只有下面部分不一樣,

  1. 申請中斷的地方增加了一個重復的計數器

    可以實現每隔幾個計數周期,才發發生一個更新事件和更新中斷事件,原來是每個計數周期都會發生更新

  2. 高級定時器對輸出比較模塊的升級(前三路互補波形,第四路CH4沒什么變化)

    DTG(Dead Time Generate)是死區生成電路(避免開關切換的瞬間,由于器件的不理想造成短暫的直通現象,讓橋臂的上下管全都關斷。防止直通現象),輸出引腳由原來的一個,變為了兩互補的輸出,可以輸出一對互補的PWM波。這些電路可以驅動三相無刷電機比較常用。比如四軸飛行器、電動車后輪、電鉆等
    在這里插入圖片描述
    圖左邊是產生短暫的直通現象,圖右邊是橋臂的上下管全都關斷

  3. 剎車輸入
    在這里插入圖片描述
    給電機驅動提高安全保障。

實例

內部時鐘

1、開啟RCC時鐘,定時器的基準時鐘和整個外設的工作時鐘就會同時打開了。

2、選擇時基單元的時鐘源,對于定時中斷就選擇內部時鐘源。TIM_InternalClockConfig(TIM2);

3、時基單元初始化。
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //將結構體變量交給TIM_TimeBaseInit,配置TIM2的時基單元

4、配置輸出中斷控制,允許更新中斷輸出到NVIC。
TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除定時器更新標志位
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //開啟TIM2的更新中斷

5、配置NVIC,在NVIC中打開定時器中斷通道,并分配一個優先級。
NVIC_Init(&NVIC_InitStructure);
6、允許控制,使能定時器。
TIM_Cmd(TIM2, ENABLE); //使能TIM2,定時器開始運行

#include "stm32f10x.h"                  // Device headervoid Timer_Init(void)
{/*開啟時鐘*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);           //打開定時器/*配置時鐘源*/TIM_InternalClockConfig(TIM2);//選擇TIM2為內部時鐘,若不調用此函數,TIM默認也為內部時鐘/*時基單元初始化*/TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定義結構體變量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;//重復計數器,高級定時器才會用到TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//將結構體變量交給TIM_TimeBaseInit,配置TIM2的時基單元	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);/*中斷輸出配置*/TIM_ClearFlag(TIM2, TIM_FLAG_Update);						//清除定時器更新標志位//TIM_TimeBaseInit函數末尾,手動產生了更新事件//若不清除此標志位,則開啟中斷后,會立刻進入一次中斷//如果不介意此問題,則不清除此標志位也可	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);					//開啟TIM2的更新中斷/*NVIC中斷分組*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//配置NVIC為分組2//即搶占優先級范圍:0~3,響應優先級范圍:0~3//此分組配置在整個工程中僅需調用一次//若有多個中斷,可以把此代碼放在main函數內,while循環之前//若調用多次配置分組的代碼,則后執行的配置會覆蓋先執行的配置/*NVIC配置*/NVIC_InitTypeDef NVIC_InitStructure;						//定義結構體變量NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;				//選擇配置NVIC的TIM2線NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC線路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	//指定NVIC線路的搶占優先級為2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC線路的響應優先級為1NVIC_Init(&NVIC_InitStructure);								//將結構體變量交給NVIC_Init,配置NVIC外設/*TIM使能*/TIM_Cmd(TIM2, ENABLE);				                           //啟動定時器
}void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)               //獲取中斷標志位{TIM_ClearITPendingBit(TIM2, TIM_IT_Update);                //清除標志位}
}

外部時鐘

0、開啟GPIO口,配置GPIO。

1、開啟RCC時鐘,定時器的基準時鐘和整個外設的工作時鐘就會同時打開了。

2、選擇時基單元的時鐘源,對于定時中斷就選擇內部時鐘源。

3、配置時基單元。

4、配置輸出中斷控制,允許更新中斷輸出到NVIC。

5、配置NVIC,在NVIC中打開定時器中斷通道,并分配一個優先級。

6、允許控制,使能定時器。

(這里是用對射紅外線做的,擋光10次,計數器加一)

void Timer_Init(void)
{/*開啟時鐘*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);			//開啟TIM2的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//開啟GPIOA的時鐘/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;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);//將PA0引腳初始化為上拉輸入/*外部時鐘配置*/TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F);//選擇外部時鐘模式2,時鐘從TIM_ETR引腳輸入//注意TIM2的ETR引腳固定為PA0,無法隨意更改//最后一個濾波器參數加到最大0x0F,可濾除時鐘信號抖動/*時基單元初始化*/TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定義結構體變量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;			//重復計數器,高級定時器才會用到TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//將結構體變量交給TIM_TimeBaseInit,配置TIM2的時基單元	/*中斷輸出配置*/TIM_ClearFlag(TIM2, TIM_FLAG_Update);						//清除定時器更新標志位//TIM_TimeBaseInit函數末尾,手動產生了更新事件//若不清除此標志位,則開啟中斷后,會立刻進入一次中斷//如果不介意此問題,則不清除此標志位也可TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);			//開啟TIM2的更新中斷/*NVIC中斷分組*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//配置NVIC為分組2//即搶占優先級范圍:0~3,響應優先級范圍:0~3//此分組配置在整個工程中僅需調用一次//若有多個中斷,可以把此代碼放在main函數內,while循環之前//若調用多次配置分組的代碼,則后執行的配置會覆蓋先執行的配置/*NVIC配置*/NVIC_InitTypeDef NVIC_InitStructure;						//定義結構體變量NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;				//選擇配置NVIC的TIM2線NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC線路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	//指定NVIC線路的搶占優先級為2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC線路的響應優先級為1NVIC_Init(&NVIC_InitStructure);//將結構體變量交給NVIC_Init,配置NVIC外設/*TIM使能*/TIM_Cmd(TIM2, ENABLE);			//使能TIM2,定時器開始運行
}/*** 函    數:返回定時器CNT的值* 參    數:無* 返 回 值:定時器CNT的值,范圍:0~65535*/
uint16_t Timer_GetCounter(void)
{return TIM_GetCounter(TIM2);	//返回定時器TIM2的CNT
}/* 定時器中斷函數,可以復制到使用它的地方
void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}
*/

函數說明

在這里插入圖片描述
在這里插入圖片描述

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

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

相關文章

maven的下載以及配置的詳細教程(附網盤下載地址)

文章目錄 下載配置IDEA內部使用配置 下載 1.百度網盤下載 鏈接: https://pan.baidu.com/s/1LD9wOMFalLL49XUscU4qnQ?pwd1234 提取碼: 1234 2.解壓即可 配置 1.打開安裝文件下conf下的settings.xml文件,我的如下 2.修改配置信息(目的是為了修改本地…

【Fiddler抓包工具】第五節.安卓、IOS抓包+fildder插件

文章目錄 前言一、HTTPS抓包 1.1 HTTPS與HTTP區別 1.2 HTTPS抓包設置過程 1.3 錯誤解決方法 1.4 驗證證書是否安裝成功 1.5 Firefox HTTPS請求捕獲二、IOS設備APP抓包 2.1 APP抓包Fiddler設置 2.2 APP抓包IOS設備設置 2.3 And…

【Redis】 關于 Redis 集合類型

文章目錄 🍃前言🌳普通命令🚩sadd🚩smembers🚩sismember🚩scard🚩spop🚩smove🚩srem 🌲集合間操作🚩sinter🚩sinterstore&#x1f6a9…

C# --- 浮點數類型 float, double, decimal

C# --- 浮點數類型 float, double, decimal float, double, decimaldecimal float, double, decimal decimal double 和 float 的采用base 2, 不能精確的表示浮點數, 進行加減乘除的操作的時候會出現精度丟失的問題decimal 采用base 10,可以精確的表示浮點數&#x…

客戶體驗:電子元器件商城配送滿意度調查

背景介紹 電子元器件商城為了提升配送服務質量,決定開展配送滿意度調查,以了解客戶對配送服務的評價和意見。通過客戶的反饋,商城將進一步優化配送流程,提高客戶滿意度,增強市場競爭力。 調查內容 配送時效性&#xf…

linux 之dma_buf (4)- mmap

一、前言 前面幾篇都是在 kernel space 對 dma-buf 進行訪問的,本篇我們將一起來學習,如何在 user space 訪問 dma-buf。當然,user space 訪問 dma-buf 也屬于 CPU Access 的一種。 二、mmap 為了方便應用程序能直接在用戶空間讀寫 dma-bu…

nbcio-vue升級遷移flowable到最新的jeeg-boot-vue3的問題記錄(一)

因為這個項目license問題無法開源,更多技術支持與服務請加入我的知識星球。 1、vue3 jeeg-boot-vue3新版本的流程定義的頁面,刷新出現下面問題,或第一次進去也一樣 看著好像就一個警告的信息,不知道是什么原因引起的,應…

111.二叉樹的最小深度

給定一個二叉樹,找出其最小深度。 最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,null,15,7], 返回它的最小深度 2. 思路: 后序遍歷(左右中&#xff…

深入理解 Nginx Concat 模塊:示例、安裝和使用方法

Nginx 是一個高性能的開源 Web 服務器,廣泛用于構建可靠的 Web 應用程序和服務。其中的 Concat 模塊為用戶提供了在服務器端快速合并和傳輸多個文件的能力,從而提高了網頁加載速度和性能。在本文中,我們將深入探討 Nginx Concat 模塊的安裝、示例以及使用場景。 什么是 Ngi…

【設計模式深度剖析】【5】【結構型】【橋接模式】| 以電視和遙控器為例加深理解

👈?上一篇:組合模式 設計模式-專欄👈? 目 錄 橋接模式(Bridge Pattern)定義英文原話是:直譯理解 4個角色UML類圖代碼示例 應用優點缺點使用場景 示例解析:電視和遙控器UML類圖 橋接模式(Bridge Pattern) 定義 英文原話是&am…

band對應頻段列表(2G、4G、5G)

5G BAND對應頻段 n1:2.1G n3:1.8 n5:850 n8:900 n28:700 n41:2.6G n77:3.3G n78:3.5G n79:4.9G n257、258、260:毫米波頻段(26G,28G,39G) 4G BAND對應頻段 Band1:2.1G–上行1920-1980 MHz,下行2110-2170 MHz Band3:1.8G–上行1710-1785 MH…

CC工具箱使用指南:【淹沒區分析(BHM)】

一、簡介 群友定制工具。 這個工具適用面比較小。 工具的應用場景如下: 提供一個淹沒區范圍,類型是面要素。統計這個范圍內的一些線、面要素的面積或長度。 給定的幾個數據有:耕地、永久基本農田、房臺、道路(線)…

基于Docker搭建屬于你的CC++集成編譯環境

常常,我會幻想著擁有一個隨時可以攜帶、隨時可以使用的開發環境,那該是多么美好的事情。 在工作中,編譯環境的復雜性常常讓我頭疼不已。稍有不慎,刪除了一些關鍵文件,整個編譯鏈就會瞬間崩潰。更糟糕的是,…

【Go語言入門學習筆記】Part6.包和兩個幾乎用不到的小Tip

一、前言 這個文章簡單了寫了一下包、init函數、匿名函數。 二、學習代碼 1.包 package packTestimport "fmt"func init() { //如果主函數引用了這個包,主函數執行的時候會先執行包的initfmt.Println("hello world") }func Add(num1 int, num…

如何保養和維護氣膜體育館—輕空間

隨著經濟的飛速發展,氣膜體育館以其新穎的外觀、優美的造型、節能環保的特點,迅速進入體育市場。然而,對于氣膜體育館的維護和保養是不容忽視的問題,必須引起重視。下面我們將詳細介紹氣膜體育館的維護需要從哪些方面著手。 一、保…

公路行業交通工程乙級資質的動態考核要點

技術人員保持與更新: 核查技術人員的在職狀態、專業資格證書的有效性,以及新增或離職技術人員的情況,確保關鍵崗位人員的穩定性和資質要求的持續達標。評估技術人員的專業發展,包括繼續教育、培訓和參與專業活動的情況&#xff0c…

【電路筆記】-狀態可變濾波器

狀態可變濾波器 文章目錄 狀態可變濾波器1、概述2、**狀態可變濾波器電路**3、狀態可變濾波器示例4、陷波濾波器設計5、總結狀態可變濾波器是一種多反饋濾波器電路,可以從同一單個有源濾波器設計中同時產生所有三種濾波器響應:低通、高通和帶通。 1、概述 狀態可變濾波器使用…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt + uniapp 新聞資訊 的設計與實現

一.項目介紹 本系統分為 后端 和 小程序端 后端:點擊登錄按鈕 設置個人中心、 管理員賬號數據維護、 基礎數據維護、 短視頻信息維護(包括查看短視頻留言、短視頻收藏)、 論壇維護(增刪改查帖子信息,包括查…

Rabbit MQ學習之《基礎概念》

Message Queue 1 什么是MQ MQ(message queue),本質是個隊列,FIFO 先入先出,只不過隊列中存放的內容是message而已,同時是一種跨進程的通信機制,用于上下游傳遞消息。 在互聯網架構中,MQ 是一種非常常見的…

深入解析力扣166題:分數到小數(模擬長除法與字符串操作詳解及模擬面試問答)

力扣166題:分數到小數 在本篇文章中,我們將詳細解讀力扣第166題“分數到小數”。通過學習本篇文章,讀者將掌握如何使用多種方法來解決這一問題,并了解相關的復雜度分析和模擬面試問答。每種方法都將配以詳細的解釋和ASCII圖解&am…