1. 程式人生 > >stm32 基本定時器最簡單定時配置

stm32 基本定時器最簡單定時配置

最近用到了定時器的定時功能,瞭解了下,stm32的定時器功能很強大,東西也挺多的,datasheet裡也說了一大段,這個我就不詳說了,這兒只說明下如何配置最簡單的定時功能配置。

環境說明:MCU:stm32F4系列,用的是通用定時器TIM3

首先要知道的是TIM3 是掛載到APB1總線上的,這點詳見STM32F417xx_datasheet-P.19,有個框圖叫Device overview,算了,還是截個圖
這裡寫圖片描述

而APB1 的時鐘是多少呢?這個得看你自己配置的多少了,一般是在SetSysClock()函式裡,我這兒是系統時鐘的4分頻,系統時鐘這兒為168MHz,所以APB1上的時鐘為42MHz,這兒不要以為TIM3的時鐘就是42MHz了,因為APB1到TIM3還要經過一個倍頻器,這個倍頻器只有當前面系統時鐘到APB1的分頻係數不為1時才起作用,而我們前面說了APB1是系統時鐘4分頻得到的,故這兒倍頻器生效,所以TIM3的時鐘為APB1的倍頻,即84MHz。

ok,得到了定時器的輸入時鐘,我們配置定時器的簡單功能其實就只需要兩個引數:預分頻數自動過載值

Tout = ((arr+1)*(psc+1))/Tclk;

其中arr就是自動重灌值,psc為預分頻值,Tclk就是定時器的時鐘。
比如我想要1s鐘的定時器,就可以設定:arr =9999;psc=8399;
這兒要注意下arr和psc的取值範圍,前者是u32 的,後者是u16的。

  NVIC_InitTypeDef NVIC_InitStructure;

  // TIM3 clock enable 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// Enable the TIM3 gloabal Interrupt NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x3; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_TimeBaseStructure.TIM
_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler = psc; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數模式,就是從0計數到arr,計數到arr時,產生一個TIM_IT_Update中斷,還有其他中斷可選 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /* TIM Interrupts enable */ TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); /* TIM3 enable counter */ TIM_Cmd(TIM3, ENABLE);

這樣定時器就開始工作了,然後再寫上中斷處理函式,

void TIM3_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
        //your code
    }
}

至此,TIM3的定時功能就完成了,由psc和arr值,我們可以設定想要的定時時間。
當然,這只是定時的一個很簡單的功能,還有很多酷炫的東西,如有錯誤,還請指正!