1. 程式人生 > >STM32F4定時器 -- 定時中斷

STM32F4定時器 -- 定時中斷

1. 定時器簡介

STM32F4的定時器分佈如下:
這裡寫圖片描述
- 其中基本定時器包括TIM6、TIM7,其結構最簡單,也具有最基本的定時功能,一是用於基本定時、產生時基、二是用於驅動DAC數模轉換器。
- 其中通用定時器包括TIME2-TIME5,TIME9-TIME14共10個;通用定時器除了包含基本定時器的功能外還有輸入捕獲、輸出比較和PWM功能等。
- 其中高階定時器包括TIM1、TIM8;
定時器的相關常用暫存器功能如下:

1.1 時鐘源選擇暫存器(TIMx_SMCR)

定時器的時鐘源有4個:
- 內部時鐘(CK_INT)
- 外部時鐘模式1:外部輸入腳(TIx)
- 外部時鐘模式2:外部觸發輸入(ETR),僅適用於TIM2、TIM3、TIM4
- 內部觸發輸入(ITRx):使得A定時器作為B定時器的預分頻器(A為B提供時鐘)
這是通過設定TIMx_SMCR的相關位來選擇的。其中內部時鐘(CK_INT)來自於APB1或APB2匯流排。

1.2 預分頻暫存器(TIMx_PSC)

該暫存器用於對時鐘進行分頻,然後提供給計數器,作為計數器的時鐘。
這裡寫圖片描述
其中16位空間儲存分頻係數。

1.3 定時器計數暫存器(TIMx_CNT)

它儲存了定時器當前的計數值。

1.4 自動重灌載暫存器(TIMx_ARR)

該暫存器在物理結構上對應著2個暫存器,一個是程式設計師可以操作的,另一個是看不到且不能操作的ARM把它叫做影子暫存器。實際上真正起作用的是影子暫存器。
根據 TIMx_CR1 暫存器中 APRE 位的設定: APRE=0 時,預裝載暫存器的內容可以隨時傳送到影子暫存器,此時 2 者是連通的;而 APRE=1 時,在每一次更新事件(UEV)時,才把預裝載暫存器( ARR) 的內容傳送到影子暫存器。


這裡寫圖片描述

1.5 DMA/中斷使能暫存器(TIMx_DIER)

這裡寫圖片描述
這裡我們只用最後一位:更新中斷使能(UIE:update interrupt enable),改為置1用來允許由更新事件產生的中斷。

1.6 控制暫存器1(TIMx_CR1)

這裡寫圖片描述
簡單應用中,我們只需要使用最後一位:計數器使能位(CEN:counter enable),改為必須置1才能使計數器開始計數。

1.7 狀態暫存器(TIMx_SR)

該暫存器用來標記當前定時器相關的各種事件/中斷是否發生。
這裡寫圖片描述

2. 庫函式操作例項

接下來我們使用定時器產生定時中斷,根據配置定時器的實際步驟,以TIM3為例解析配置過程。
定時器相關的庫函式主要集中在韌體庫檔案 stm32f4xx_tim.h 和 stm32f4xx_tim.c 檔案中。 定時器配置步驟如下:

2.1 定時器時鐘使能

TIM3掛載在APB1下,所以要通過使能APB1匯流排的使能函式來使能TIM3的時鐘源。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); ///使能 TIM3 時鐘

2.2 初始化定時器引數

配置定時器相關引數。

void TIM_TimeBaseInit(
                    TIM_TypeDef *TIMx,
                    TIM_TimeBaseInitTypeDef *TIM_TimeBaseInitStruct
                    );

第一個引數是指定哪個定時器;
第二個引數是定時器配置引數結構體;

typedef struct{
uint16_t TIM_Prescaler;         //分頻係數
uint16_t TIM_CounterMode;       //計數方式(向上、向下、中央對其)
uint16_t TIM_Period;            //自動過載計數值(即定時時間)
uint16_t TIM_ClockDivision;     //時鐘分頻因子????
uint8_t TIM_RepetitionCounter;
} TIM_TimeBaseInitTypeDef;

實際的:

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  //宣告初始化引數結構體變數
TIM_TimeBaseStructure.TIM_Period = 5000;        //以下開始填充
TIM_TimeBaseStructure.TIM_Prescaler =7199;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //執行初始化

2.3 設定TIM3_DIER允許更新中斷

庫函式TIM_ITConfig用來設定開啟中斷

void TIM_ITConfig(TIM_TypeDef* TIMx,        //指定哪個定時器
                uint16_t TIM_IT,            //指定中斷型別(更新中斷、觸發中斷等等)
                FunctionalState NewState); //使能還是失能

實際的:

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );       //使能更新中斷

2.4 設定中斷優先順序

既然使用中斷,就必須設定NVIC,使用NVIC_Init 函式設定。這裡就不多講了,很常用。

2.5 使能定時器

配置好後要使能定時器,使其開始工作,使用TIM_Cmd函式:

void TIM_Cmd(TIM_TypeDef* TIMx,         //指定定時器
            FunctionalState NewState);  //指定狀態 

實際的:

TIM_Cmd(TIM3, ENABLE); //使能 TIM3 外設

2.6 編寫中斷函式

最後還是要編寫中斷函式來處理定時器產生的相關中斷。流程為:
在中斷產生後:通過狀態暫存器的值來判斷此次中斷屬於什麼型別->執行相關操作->清除SR暫存器的中斷標誌。

  • 讀取中斷狀態的函式:
    ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t);
  • 清除中斷狀態標誌位的函式:
    void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

另外,韌體庫中還提供了兩個函式用來判斷定時器的狀態和清除定時器狀態標誌函式:TIM_GetFlagStatus 和 TIM_ClearFlag,它們的作用和上面兩個相似,不過它們要先判斷中斷是否使能,然後再判斷中斷標誌位,而TIM_GetITStatus直接判斷中斷標誌位。

實際的:

if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //判斷中斷狀態
{
//
//do sth here.                                      //執行操作
//
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );        //清除中斷標誌

相關推薦

STM32F4定時 -- 定時中斷

1. 定時器簡介 STM32F4的定時器分佈如下: - 其中基本定時器包括TIM6、TIM7,其結構最簡單,也具有最基本的定時功能,一是用於基本定時、產生時基、二是用於驅動DAC數模轉換器。 - 其中通用定時器包括TIME2-TIME5,TIM

STM32學習---基本定時(定時中斷)

//STM32定時器實驗: /* STM32一共有8個都為16位的定時器。 其中: TIM6,TIM7是基本定時器; TIM2,TIM3,TIM4,TIM5是通用定時器; TIM1 和 TIM8 是高階定時器。 這是定時器的綜合運用使STM32具有定時、訊號的頻率測量、訊號的PWM測量、PWM輸

STM32定時中斷簡單程式

STM32定時器及中斷簡單 //----------------------------main()-------------------- //stm32f103c8t6有3個普通1個高階定時器 //每次進入中斷服務程式間隔時間為 //((1+TIM_Pr

51中斷-定時/計數器中斷

什麼時中斷:   是指在執行程式的過程中,當出現每種情況,發出緊急的事件或其他情況時, 有服務物件向CPU發出中斷請求的訊號,CPU暫時中斷當前的程式的執行,而轉去 執行相應的處理程式,待處理程式完畢

第二部分 基礎篇-第4章 定時-CC2530 中斷方式使用定時T1

1 理論分析 為定時器分配了一箇中斷向量。當下列定時器事件之一發生時,將產生一箇中斷請求:  計數器達到最終計數值(溢位或回到零)  輸入捕獲事件  輸出比較事件 暫存器狀態暫存器 T1STAT 包括最終計數值事件和五個通道比較/捕獲

TM4C123GH6PM的定時捕獲中斷實現

#include <stdint.h> #include <stdbool.h> #include <stdio.h> #include "inc/hw_memmap.h" #include "inc/hw_types.h" #inclu

CC2530通過定時3中斷方式每10ms輸出一個下降沿

Request/Task: 由於專案中硬體電路遲遲未到位,故利用一個CC2530板子的P0.0口作為輸出,模擬10ms一次的下降沿中斷,給除錯電路板。 Idea 定時器3和定時器4是兩個8位定時器,一般上,控制暫存器TxCTL被用來控制定時器模式。本文選用的是自由執行模式,

這是一個定時,定時執行一次,用在定時發送郵件

mail pri 創建 sendmail public sta 發送 mes times public static void main(String[] args) { //1. 創建計時器類 Timer timer = new Timer(); //2. 創建任

33、生鮮電商平臺-定時,定時任務quartz的設計與架構

說明:任何業務有時候需要系統在某個定點的時刻執行某些任務,比如:凌晨2點統計昨天的報表,早上6點抽取使用者下單的佣金。           對於Java開源生鮮電商平臺而言,有定時推送客戶備貨,定時計算賣家今日的收益,定時提醒每日的提現金額等等  

STM32 定時 定時時間的計算

假設 系統時鐘是72Mhz,TIM1 是由PCLK2 (72MHz)得到,TIM2-7是由 PCLK1 得到 關鍵是設定 時鐘預分頻數,自動重灌載暫存器週期的值 /*每1秒發生一次更新事件(進入中斷服務程式)。RCC_Configuration()的SystemInit(

電商平臺-定時,定時任務quartz的設計與架構

說明:任何業務有時候需要系統在某個定點的時刻執行某些任務,比如:凌晨2點統計昨天的報表,早上6點抽取使用者下單的佣金。           對於Java開源生鮮電商平臺而言,有定時推送客戶備貨,定時計算賣家今日的收益,定時提醒每日的提現金額等等

NRF52832 SAADC定時定時轉換

1.在sdk_config.h中加入巨集 // <e> TIMER_ENABLED - nrf_drv_timer - TIMER periperal driver - legacy layer //===============================

springboot 定時定時任務

專案中經常遇到一些需求就是需要你判斷某個值是否到達要求的值或者某個條件下需要你執行某個動作,但你又不能一直判斷,這時候我們需要使用定時器去設定某個時間去判斷是否達到某個條件. 上乾貨,我使用的是spring中的定時器.我建立的是springboot專案.程式碼

C#定時 定時執行任務 執行緒

http://www.cnblogs.com/linzheng/archive/2011/02/21/1960276.html C#實現Web應用程式定時啟動任務      在業務複雜的應用程式中,有時候會要求一個或者多個任務在一定的時間或者一定的時間間隔內計劃進行,比如

LED:利用通用定時定時閃爍

F28335有三種32位的I/O口,依次PORTA(GPIO0-GPIO31), PORTB(GPIO32-GPIO63), PORTC(GPIO64-GPIO87),這些口都可以配置為普通的數字IO口同樣也能被配置為外部介面。這樣涉及到了IO的暫存器,

mysql資料庫上使用定時定時執行儲存過程建表(月表)

最近有個需求,在mysql資料庫中每個月建自動一個表,把該月的資料儲存到該月對應的表中。 一、建立儲存過程 期望表名: login_history_2017_07(login_history_YYYY_MM) 欄位: id (int(11) pri

使用 Map + 定時 定時存取微信 Token

微信的 Token 可以存放在資料庫裡 , 需要的時候從資料庫讀取 . 但是這樣日積月累 , 資料量會逐漸撐大 , 而且 token 我們用指定時間(兩小時內)就會丟棄 , 以後也不會用到過期的 token , 所以將它儲存在資料庫是很浪費資源的 . 所以我寫了

Mysql定時定時刪除表資料

     由於測試環境有張日誌表沒定時2分鐘程式就狂插資料,導致不到1一個月時間,這張日誌表就佔用了6.7G的空間,但是日誌重新整理較快,有些日誌就沒什麼作用,就寫了個定時器,定期刪除這張表的資料    首先先檢視mysql是否開啟定時任務開關    # SHOW VARIA

利用T0定時定時 100ms,每當定時時間到就使 P1.7 求反

一個簡單的微控制器的問題8031 的 P1.7 接一個發光二極體;利用T0定時器定時100ms,每當定時時間到就使 P1.7 求反。也就是使二極體亮100ms,滅100ms,周而復始。請幫忙把程式寫出

STM32定時定時計算公式

Tout = ((arr+1)*(psc+1))/Tclk ; 其中:   Tclk:定時器的輸入時鐘頻率(單位MHZ)  Tout:定時器溢位時間(單位為us)   .TIM_Period = arr;