STM32 定時器中斷

通用定時器工作過程:
在這里插入圖片描述
時鐘選擇:

計數器時鐘可以由下列時鐘源提供:

  • 內部時鐘(CK_INT)
  • 外部時鐘模式1:外部輸入腳(TIx)
  • 外部時鐘模式2:外部觸發輸入(ETR)
  • 內部觸發輸入(ITRx):使用一個定時器作為另一個定時器的預分頻器,如可以配置一個定時器Timer1而作為另一個定時器Timer2的預分頻器。

內部時鐘選擇
在這里插入圖片描述
在這里插入圖片描述
時鐘計算方法:
在這里插入圖片描述默認調用SystemInit函數情況下:
SYSCLK=72M
AHB時鐘=72M
APB1時鐘=36M
所以APB1的分頻系數=AHB/APB1時鐘=2
所以,通用定時器時鐘CK_INT=2*36M=72M

計數器模式: 通用定時器可以向上計數、向下計數、向上向下雙向計數模式。

  • 向下計數模式(時鐘分頻因子=1(意思就是:CK_PSC=CK_CNT))

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

  • 向上計數模式(時鐘分頻因子=1)
    在這里插入圖片描述
    在這里插入圖片描述

  • 中央對齊計數模式(時鐘分頻因子=1 ARR=6)
    在這里插入圖片描述
    在這里插入圖片描述
    定時器中斷實驗相關寄存器:

  • 計數器當前值寄存器CNT
    在這里插入圖片描述

  • 預分頻寄存器TIMx_PSC

在這里插入圖片描述

  • 自動重裝載寄存器(TIMx_ARR)
    在這里插入圖片描述
  • 控制寄存器1(TIMx_CR1)
    在這里插入圖片描述
  • DMA中斷使能寄存器(TIMx_DIER)
    在這里插入圖片描述

常用庫函數

定時器參數初始化:

 void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
ypedef struct
{uint16_t TIM_Prescaler;//預分頻系數的設置      uint16_t TIM_CounterMode;//計數模式   uint16_t TIM_Period;//自動裝載值uint16_t TIM_ClockDivision;//輸入捕獲會用到 uint8_t TIM_RepetitionCounter;//高級定時器會用到
} TIM_TimeBaseInitTypeDef; 
TIM_TimeBaseStructure.TIM_Period = 4999;
TIM_TimeBaseStructure.TIM_Prescaler =7199; 
TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1; 
TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; 
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 

定時器使能函數:

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

定時器中斷使能函數:

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

狀態標志位獲取和清除:

FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

定時器中斷實現步驟:

  • 能定時器時鐘。
 RCC_APB1PeriphClockCmd();
  • 初始化定時器,配置ARR,PSC。
 TIM_TimeBaseInit();
  • 開啟定時器中斷,配置NVIC。
void TIM_ITConfig();NVIC_Init();
  • 使能定時器。
TIM_Cmd();
  • 編寫中斷服務函數。
TIMx_IRQHandler();//中斷函數要判斷中斷標志位,和手動清除中斷標志位
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

Tout(溢出時間)=(ARR+1)(PSC+1)/Tclk

其中arr為你重裝的值,

psc是預分頻計時器的值(預分頻系數),

Tclk是時鐘頻率

Tclk/(psc+1)是定時器的時鐘

(psc+1))/Tclk*1是計算的計數器 減少/增加 一個數所用的時間;

那么(psc+1))/Tclk*(arr+1)就是一次定時器的時間:

然后繼續重裝arr再次計數,計時:

就構成一個循環;

  • TIM2-TIM5的時鐘不是直接來自于APB1,而是來自于輸入為APB1的一個倍頻器。這個倍頻器的作用是:當APB1的預分頻系數為1時,這個倍頻器不起作用,當APB1的預分頻系數為其他數值時(即預分頻系數為2、4、8或16),這個倍頻器起作用,定時器的時鐘頻率等于APB1的頻率的2倍。
  • 分頻系數就是對定時器時鐘進行多少分頻之后在使用,最好設置為定時器時鐘的倍數,方便運算;重新裝載值是計算這么多值,時間到了之后重新開始計算的值,每一次計數的時間為分頻之后時鐘的到時;

假設定時器時鐘為72M,分頻系數設置為7200-1,那現在定時器的時鐘為10kHz,每計一個數花費1/(10000)秒,重裝值設置為5000-1,那一次溢出的時間為500ms。
分頻值是是指你將系統時鐘的頻率減小,假設時鐘頻率是 72Mhz,然后分頻值是 7199,現在你的定時器值就是 10kHz,表示每計一個數,然后過了 1/(10^4)秒,然后你的重裝值就是你的時間了,如果值是 9999,就表示定時時間為 1s。

定時器配置代碼:

void TIM4_Init(u16 ar,u16 rs)
{TIM_TimeBaseInitTypeDef TIM_InitStrue;NVIC_InitTypeDef NVIC_InitStrue;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能定時器時鐘TIM_InitStrue.TIM_Period=ar;//自動裝載值TIM_InitStrue.TIM_Prescaler=rs;//預分頻系數的設置TIM_InitStrue.TIM_CounterMode=TIM_CounterMode_Up;TIM_InitStrue.TIM_ClockDivision=TIM_CKD_DIV1;//設置時鐘分割:TDTS = Tck_timTIM_TimeBaseInit(TIM4,&TIM_InitStrue);//初始化定時器,對定時器進行配置TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);//開啟定時器中斷NVIC_InitStrue.NVIC_IRQChannel=TIM4_IRQn;NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStrue.NVIC_IRQChannelSubPriority=2;NVIC_Init(&NVIC_InitStrue);//初始化中斷,設置中斷的優先級TIM_Cmd(TIM4,ENABLE);//使能定時器
}void TIM4_IRQHandler(void)
{if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET){LED1=!LED1;TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//清除中斷標志位}
}	

實驗現象:LED0閃爍,時間間隔就是定時器的溢出時間

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

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

相關文章

Debian8.3.0下安裝Odoo8.0步驟

Debian8.3.0下安裝Odoo8.0的方法 假設你已經安裝好了Debian 系統,使用root帳號執行如下命令 # apt-get update && apt-get upgrade # Install system updates # apt-get install sudo # Make sure sudo is installed 使用如下命令來創建一個Odoo用戶&am…

STM32 PWM輸出實驗

定時器用來產生PWM輸出: STM32 的定時器除了 TIM6 和 7。其他的定時器都可以用來產生 PWM 輸出。其中高級定時器 TIM1 和 TIM8 可以同時產生多達 7 路的 PWM 輸出。而通用定時器也能同時產生多達 4路的 PWM 輸出,這樣,STM32 最多可以同時產生…

docker鏡像和容器區別

docker鏡像 docker容器,容器是用鏡像創建的運行實例

域名相關的一些基礎知識

DNS DNS,Domain Name System或者Domain Name Service(域名系統或者域名服務)。域名系統為Internet上的主機分配域名地址和IP地址。由于網絡中的計算機都必須有個IP地址,這樣相互之間才能通信,但讓我們記住一大串的IP地址來訪問網站顯然是不可…

定時器輸入捕獲實驗

輸入捕獲簡介: 輸入捕獲模式可以用來測量脈沖寬度或者測量頻率。STM32 的定時器,除了 TIM6 和 TIM7,其他定時器都有輸入捕獲功能。STM32 的輸入捕獲,簡單的說就是通過檢測 TIMx_CHx 上的邊沿信號,在邊沿信號發生跳變&a…

黑馬程序員—————— 多線程

java使用Thread類代表線程,所有的線程對象都必須是Thread類或其子類的實例。每個線程的作用是完成一定的任務,實際上就是執行一段程序流(一段順序執行的代碼)。java使用線程執行體來代表這段程序流。 繼承Thread類創建線程類 通過…

Linux查看內置命令和非內置命令幫助的幾種方法(man、help、info)

??作者主頁:IT技術分享社區 ??作者簡介:大家好,我是IT技術分享社區的博主,從事C#、Java開發九年,對數據庫、C#、Java、前端、運維、電腦技巧等經驗豐富。 ??個人榮譽: 數據庫領域優質創作者🏆&#x…

電容觸摸按鍵 實驗

RC充放電電路原理: RC電路充放電公式: Vt V0(V1-V0)* [1-exp(-t/RC)]V0 為電容上的初始電壓值; V1 為電容最終可充到或放到的電壓值; Vt 為t時刻電容上的電壓值。如果V0為0,也就是從0V開始充…

tomcat調優方案Maximum number of threads (200) created for connector with address null and port 8091...

1.tomcat6大并發出現:INFO: Maximum number of threads (200) created for connector with address null and port 8091 說明:最大線程數錯誤 解決方案:使用線程池,用較少的線程處理較多的訪問,可以提高tomcat處理請…

SFTP是什么?與FTP之間有什么區別

什么是SFTP? SFTP是一種安全的文件傳輸協議,一種通過網絡傳輸文件的安全方法;它確保使用私有和安全的數據流來安全地傳輸數據。 SFTP要求客戶端用戶必須由服務器進行身份驗證,并且數據傳輸必須通過安全通道(SSH&#x…

C++基礎( C++初識、數據類型、運算符、程序流程結構、)

前言&#xff1a; C專欄筆記來源于觀看視頻筆記 配套視頻&#xff1a; https://www.bilibili.com/video/BV1et411b73Z?p16 基本代碼框架&#xff1a; #include <iostream> using namespace std; int main() {system("pause");//等待程序return 0; }輸出Hell…

C#判斷某天是否是周末或者節假日示例

/// <summary> /// 判斷是不是周末/節假日 /// </summary> /// <param name"date">日期</param> /// <returns>周末和節假日返回true&#xff0c;工作日返回false</returns> public static async Task<bool> IsHolidayByD…

查看docker版本命令docker version

查看docker版本 docker version

spring security原理

spring security通過一系列過濾器實現其功能&#xff0c;入口過濾器如下&#xff08;web.xml&#xff09;&#xff1a; <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilt…

程序員太牛了 公司年會整成代碼討論會

作者丨前端小喬 https://blog.csdn.net/weixin_44330260/article/details/86478512 公司年底年會&#xff0c;被程序員開成代碼討論大會&#xff0c;是一種什么樣的體驗&#xff01;最近某公司舉行了一場年會&#xff0c;本來熱熱鬧鬧&#xff0c;結果被程序員給攪煳了&#xf…

嵌入式C語言基礎(一)

嵌入式C語言基礎&#xff1a; system函數&#xff1a;功能是運行windows命令 #include <stdio.h> #include <stdlib.h> int main() {//main是程序的入口&#xff0c;操作系統運行程序先找mainsystem("ipconfig");//在windows下ipconfig查看本地的網絡狀…

docker info 顯示 Docker 系統信息

docker info : 顯示 Docker 系統信息&#xff0c;包括鏡像和容器數