STM32定時器時間的計算方法

2020-12-23 電子發燒友

STM32定時器定時時長計算公式

T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK

其中,TIMxCLK是其時鐘頻率,若是晶振為8MHz的,一般為72MHz

STM32定時器時間的計算方法

STM32中的定時器有很多用法:

(一)系統時鐘(SysTick)

設置非常簡單,以下是產生1ms中斷的設置,和產生10ms延時的函數:

void RCC_Configuration(void)

{

RCC_ClocksTypeDef RCC_ClockFreq;

SystemInit();//源自system_stm32f10x.c文件,只需要調用此函數,則可完成RCC的配置。

RCC_GetClocksFreq(&RCC_ClockFreq);

//SYSTICK分頻--1ms的系統時鐘中斷

if (SysTick_Config(SystemFrequency / 1000))

{

while (1); // Capture error

}

}

void SysTick_Handler(void)//在中斷處理函數中的程序

{

while(tim)

{

tim--;

}

}

//調用程序:

Delay_Ms(10);

當然,前提是要設置好,變量tim要設置成volatile類型的。

(二)第二種涉及到定時器計數時間(TIMx)

/*TIM3時鐘配置*/

TIM_TimeBaseStructure.TIM_Prescaler = 2; //預分頻(時鐘分頻)72M/(2+1)=24M

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數

TIM_TimeBaseStructure.TIM_Period = 65535; //裝載值18k/144=125hz

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

定時時間計算:

TIM_TimeBaseStructure.TIM_Prescaler = 2;

//分頻2 72M/(2+1)/2=24MHz

TIM_TimeBaseStructure.TIM_Period = 65535; //計數值65535

((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+2)/72M)*(1+65535)=0.00273秒=366.2Hz */

注意兩點(來自大蝦網,未經檢驗)

(1)TIMx(1-8),在庫設置默認的情況下,都是72M的時鐘;

(2)TIM_TimeBaseStructure.TIM_RepetitionCounter=0;

是重複計數,就是重複溢出多少次才給你來一個溢出中斷,

它對應的寄存器叫TIM1 RCR.

如果這個值不配置,上電的時候寄存器值可是隨機的,本來1秒中斷一次,可能變成N秒中斷一次,讓你超級頭大!

假設系統時鐘是72Mhz,TIM1是由PCLK2(72MHz)得到,TIM2-7是由PCLK1得到

關鍵是設定時鐘預分頻數,自動重裝載寄存器周期的值

/*每1秒發生一次更新事件(進入中斷服務程序)。RCC_Configuration()的SystemInit()的

RCC-》CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK為72MHz。因此,每次進入中

斷服務程序間隔時間為

((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+9999)=1秒*/

定時器的基本設置

1、 TIM_TimeBaseStructure.TIM_Prescaler = 7199;//時鐘預分頻數 例如:時

鍾頻率=72/(時鐘預分頻+1)

2、TIM_TimeBaseStructure.TIM_Period = 9999; //自動重裝載寄存器周期的值(定時

時間) 累計0xFFFF個頻率後產生個更新或者中斷(也是說定時時間到)

3、 TIM_TimeBaseStructure.TIM_CounterMode = TIM1_CounterMode_Up; //定時器

模式 向上計數

4、TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //時間分割值

5、TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//初始化定時器2

6、TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打開中斷 溢出中斷

7、TIM_Cmd(TIM2, ENABLE);//打開定時器

或者:

TIM_TimeBaseStructure.TIM_Prescaler = 35999;//分頻35999 72M/

(35999+1)/2=1Hz 1秒中斷溢出一次

TIM_TimeBaseStructure.TIM_Period = 2000; //計數值2000

((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*(1+2000)=1秒*/

STM32通用定時器的基本定時器功能實現燈閃爍

/*MAIN.C*/

/* Includes ------------------------------------------------------------------*/

#include 「stm32f10x.h」

#include 「misc.h」

/* Private function prototypes -----------------------------------------------*/

void RCC_Configuration(void);

void NVIC_Configuration(void);

void GPIO_Configuration(void);

void TIM3_Configuration(void);

/* Private functions ---------------------------------------------------------*/

int main(void)

{

RCC_Configuration();

NVIC_Configuration();

GPIO_Configuration();

TIM3_Configuration();

TIM_ClearFlag(TIM3, TIM_FLAG_Update);/*清除更新標誌位*/

TIM_ARRPreloadConfig(TIM3, DISABLE);/*預裝載寄存器的內容被立即傳送到影子寄存器*/

TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);

TIM_Cmd(TIM3, ENABLE);

while (1) {

;

}

}

void TIM3_Configuration(void)

{

/*每1秒發生一次更新事件(進入中斷服務程序)。RCC_Configuration()的SystemInit()的RCC-》CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK為72MHz。

因此,每次進入中斷服務程序間隔時間為((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+9999)=1秒*/

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_TimeBaseStructure.TIM_Period = 9999;

TIM_TimeBaseStructure.TIM_Prescaler = 7199;

TIM_TimeBaseStructure.TIM_ClockDivision = 0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);/*此函數的語句「TIMx-》EGR = TIM_PSCReloadMode_Immediate;」以軟體方式產生更新事件(註:當發生一個更新事件時,所有的寄存器都被更新,硬體同時(依據URS位)設置更新標誌位(TIMx_SR寄存器中的UIF位)。)。*/

}

void RCC_Configuration(void)

{

SystemInit();

/* TIM3 clock enable */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

/* GPIOC clock enable */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

}

void NVIC_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

/* Enable the TIM3 gloabal Interrupt*/

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);

/*註:不用為實現通用定時器的基本定時器功能配置Pin*/

}

/*stm32f10x_it.c*/

/* Includes ------------------------------------------------------------------*/

#include 「stm32f10x_it.h」

void TIM3_IRQHandler(void)

{

if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {

/* Clear TIM3 update interrupt */

TIM_ClearITPendingBit(TIM3, TIM_IT_Update);

GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7)));

打開APP閱讀更多精彩內容

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴

相關焦點

  • stm32定時器時間計算
    >   1 2 MHz / 2 = 1 MHz   Tt = 1 / 1 MHz = 1 us   最小定時時間T=1/1MHz=1us   51單片機定時器:   方式0 13位最大定時時間間隔2^13=8.192ms   方式1 16位最大定時時間間隔2^16=65.536ms   方式2 8位最大定時時間間隔
  • STM32單片機的定時器和ADC的應用方法介紹
    主要的幾個函數 //tim_num=0對應 定時器2,tim_num=1對應 定時器3;tim_us:定時器uS數 void stm32_timer_start(uint16_t tim_num使能TIMx外設 } } //停止定時器 void stm32_timer_stop(uint16_t tim_num) { if(tim_num == 0) { TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE); //關中斷 TIM_Cmd
  • stm32的定時器輸入捕獲與輸出比較
    明確一點對比AD的構造,stm32有3個AD,每個AD有很多通道,使用哪個通道就配置成哪個通道,這裡定時器也如此,有很多定時器TIMx,每個定時器有很多CHx(通道),可以配置為輸入捕捉-------測量頻率用,也可以配置為輸出比較----
  • stm32通用定時器用做外部脈衝計數器的例程
    最近幾天要用到stm32對外部輸入脈衝進行計數,很自然想到定時器,可是手上資料沒有講解stm32定時器如何用作外部計數器的,在網上找例程,也沒找到幾個正確的,自己硬著頭皮仔細研究參考手冊,終於知道如何配置了,並寫了一個例程,希望將來對一些網友有用。
  • stm32定時器觸發adc
    ADC的任務就是:將連續變化的模擬信號轉換為離散的數位訊號,以便於我們的數字系統進行計算、處理、存儲、控制、顯示。 stm32的ADC特點   STM32的ADC有單次轉換和連續轉換2種模式,這兩種模式又可以選擇是否結合掃描模式。
  • STM32之時鐘頻率和定時器時鐘講解
    在stm32固件庫3.0中對時鐘頻率的選擇進行了大大的簡化,原先的一大堆操作都在後臺進行。系統給出的函數為SystemInit()。但在調用前還需要進行一些宏定義的設置,具體的設置在system_stm32f10x.c文件中。
  • stm32_timer基本定時器配置及實現燈閃爍
    STM32中一共有11個定時器,其中2個高級控制定時器,4個普通定時器和2個基本定時器,以及2個看門狗定時器和1個系統嘀嗒定時器。下面以定時器2~7的時鐘說明這個倍頻器的作用:當APB1的預分頻係數為1時,這個倍頻器不起作用,定時器的時鐘頻率等於APB1的頻率;當APB1的預分頻係數為其它數值(即預分頻係數為2、4、8或16)時,這個倍頻器起作用,定時器的時鐘頻率等於APB1的頻率兩倍。
  • 單片機定時器周期計算公式
    打開APP 單片機定時器周期計算公式 發表於 2018-01-22 15:59:10 10MS定時器初值的計算 1.晶振12M 12MHz除12為1MHz,也就是說一秒=1000000次機器周期。10ms=10000次機器周期。
  • 自學單片機第五十三篇:設置定時器時間
    定時器的難點也就在這裡了。我們使用定時器時,通過手冊可以查詢到T0定時器是有4中工作方式的,每種工作方式是不一樣的,也就導致了設置的方法也稍有不同。先看下手冊中的四種方式。如果從0開始到65535,我們可以計算出所消耗的時間是:1.08507*65535=71110.06245微秒,也就是71.110毫秒。當定時器加到65536時,就會溢出,然後清零,並觸發中斷。這個溢出又是一個新詞。溢出的意思是滿了,裝不下了。我們假設一個3位定時器。
  • STM32開發筆記3: STM32F407定時器2-5的使用方法
    單片機型號:STM32F407    STM32F4有多種定時器,其中TIM2-TIM5稱為通用定時器,具有相似的軟體設置及使用方法。在這裡還需要注意的是TIM3和TIM4為16位定時器,TIM2和TIM5為32位定時器。
  • 基於STM32定時器的紅外遙控數據接收設計原理
    2、定時器計數和輸入捕獲 定時器就是按照一個特定的頻率對計數值進行加一或減一操作,當數值溢出時則產生一個標誌或中斷。 定時器的輸入捕獲就是可以測量輸入信號的脈衝寬度。 本次就是通過普通計數和輸入捕獲的結合來實現的。
  • STM32通用定時器(時鐘選擇,模式選擇)
    ITRx:內部觸發x(由另外的定時器觸發)TI1F_ED:TI1的邊沿檢測器。TI1FP1/2:濾波後定時器1/2的輸入TRGI:觸發輸入TRGO:觸發輸出 CK_PSC:應該叫分頻器時鐘輸入CK_CNT:定時器時鐘。
  • avr單片機和stm32區別與優缺點分析
    摘要:avr單片機和stm32單片機是目前使用較廣泛的單片機,那麼avr單片機和stm32單片機有什麼區別呢?有什麼優劣勢呢?通常時鐘頻率用4~8MHz,故 最短指令執行時間為250~125ns。   avr單片機缺點:   1. 是沒有位操作,都是以字節形式來控制和判斷相關寄存器位的   2. C語言與51的C語言在寫法上存在很大的差異,這讓從開始學習51單片機的朋友很不習慣   3.
  • stm32F407的TIM定時器輸出PWM波
    今天測試了stm32F407的TIM定時器輸出PWM波,了解了其配置過程。本文引用地址:http://www.eepw.com.cn/article/201611/317472.htm2.分頻和周期計算公式: Prescaler = (TIMxCLK / TIMx counter clock) - 1; Period = (TIMx counter clock / TIM3 output clock) - 1 TIMx counter
  • 電子定時器代換洗衣機機械定時器的方法介紹
    久而久之造成機械定時器內部齒輪損壞。筆者採用電子定時器更換機械定時器。既克服了機械定時器易損壞的毛病,又收到了意想不到的良好效果。 這兩種定時器除了外形一樣外,其內部構造、工作原理以及引出線色等均完全不同,下面以長風XPB50-8S洗衣機四線機械定時器及五線電子定時器為例。
  • STM32單片機通用定時器對lED燈的翻轉控制設計
    一、實驗目的 1)熟悉STM32通用定時器; 2)通過定時器中斷來是lED燈進行翻轉。 二、STM32通用定時器簡介 通用定時器是一個通過可編程預分頻器驅動的16位自動裝載計數器構成。它適用於多種場合,包括測量輸入信號的脈衝長度(輸入捕獲)或者產生輸出波形(輸出比較和PWM)。
  • 定時器的使用方法 MM32主/從定時器同步與精準定時操作實例
    定時器的使用方法 MM32主/從定時器同步與精準定時操作實例 靈動微電子 發表於 2021-01-11 11:25:01 MM32 定時器 1、定時器同步
  • STM32F051R8T6的通用定時器配置
    將系統時鐘24分頻,計數頻率為48MHz/24 = 2MHz,則計一個數的時間為0.5us。計滿1000個數的時間為0.5ms。這就是TIM3的定時周期。void TIM3_Configuration(void) //每0.5ms發生一次更新事件(進入中斷服務程序).
  • 單片機定時器/計數器基本原理
    定時器和計數器功能基本上都是使用相同的邏輯實現的,而且這兩個功能都包含輸入的計數信號,本質上都是對脈衝計數。計數器用來計數並指示在任意間隔內輸入信號(事件)的個數,而定時器則對規定間隔內輸入的信號個數進行計數,用來指示經歷的時間。
  • 系統時鐘和定時器——PWM定時器
    查看晶片手冊,MPLL計算公式如下圖:其中 m=MDIV+8, p=PDIV+2, s=SDIVCLKDIVN寄存器:用於設置FCLK、HCLK、PCLK 三者比例。各種時鐘比例對應的寄存器設置如下圖所示:1、 PWM(Pulse Width Modulation)定時器S3C2440 有5個16位定時器。其中定時器0、1、2、3有PWM功能,即他們都有一個引腳,可以用過定時器來控制引腳周期性的高低電平變化;定時器4沒有輸出引腳。定時器時鐘源為PCLK。