1. 程式人生 > >STM32定時器時間的計算方法

STM32定時器時間的計算方法

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)=24MTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //向上計數

TIM_TimeBaseStructure.TIM_Period = 65535;        //裝載值18k/144=125hzTIM_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=24MHzTIM_TimeBaseStructure.TIM_Period = 65535; //計數值

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

注意兩點(來自大蝦網,未經檢驗)1TIMx(1-8),在庫設定預設的情況下,都是72M的時鐘;2TIM_TimeBaseStructure.TIM_RepetitionCounter=0;是重複計數,就是重複溢位多少次才給你來一個溢位中斷,它對應的暫存器叫TIM1 RCR.如果這個值不配置,上電的時候暫存器值可是隨機的,本來1秒中斷一次,可能變成N秒中斷一次,讓你超級頭大!

假設系統時鐘是72MhzTIM1是由PCLK272MHz)得到,TIM2-7是由PCLK1得到

關鍵是設定時鐘預分頻數,自動重灌載暫存器週期的值

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

RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK72MHz。因此,每次進入中

斷服務程式間隔時間為

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

 定時器的基本設定

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

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

   2TIM_TimeBaseStructure.TIM_Period = 9999; //自動重灌載暫存器週期的值(定時

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

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

模式 向上計數

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

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

     6TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);  //開啟中斷  溢位中斷  

     7TIM_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表明TIM3CLK72MHz

因此,每次進入中斷服務程式間隔時間為((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)));