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

stm32f103定時器中斷

stm32為我們提供了8個定時器,分為:通用是定時器(TIM2~TIM5),高階定時器(TIM1和TIM8),基本定時器(TIM6和TIM7)。

至於三者之間的區別可以參考以下部落格:https://blog.csdn.net/dukai392/article/details/72058041

本次我們主要討論的是通用定時器的基本知識以及更新中斷的配置過程。

通用定時器框圖如下:

由於stm32的定時器十分複雜,功能特多而本次我們只討論他的計數跟新功能(定時)。

時鐘的選擇:

由框圖中紅色部分可知定時器的時鐘來源有三個:內部時鐘(CK_INT),外部時鐘(TIMx_ETR),其他定時器的時鐘(ITR0-ITR3).

本次我們主要講解內部時鐘的配置,至於其他時鐘可以自行嘗試(實際工作中大多使用內部時鐘)。

內部時鐘框圖:

從圖中可以看出:由AHB時鐘經過APB1預分頻係數轉至APB1時鐘,再通過某個規定轉至TIMxCLK時鐘(即內部時鐘CK_INT、CK_PSC)。最終經過PSC預分頻係數轉至CK_CNT。

注:X1/X2有APB1預分頻係數來決定,如果AHB時鐘為72m,APB1預分頻器值為2那麼CK_PSC=APB1*2=72m。定時器最終時鐘由PSC預分頻器得到。

計數模式:

向上計數:從0計數到預裝載值就會產生一個溢位事件,然後繼續從0開始計數。

向下計數:從預裝載值計數到0就會產生一個溢位事件

,然後繼續從預裝載值開始計數。

中央對齊:計數器從0開始計數到自動裝入的值-1,產生一個計數器溢位事件,然後向下計數到1並且產生一個計數器溢位事件;然後再從0開始重新計數。

相關暫存器:計數器當前值暫存器CNT,預分頻暫存器TIMx_PSC,自動重灌載暫存器(TIMx_ARR),控制暫存器1(TIMx_CR1),DMA中斷使能暫存器(TIMx_DIER)

暫存器的相關配置方法參考手冊

庫函式初始化定時器方法:

能定時器時鐘:RCC_APB1PeriphClockCmd();

 初始化定時器,配置ARR,PSC:TIM_TimeBaseInit();

開啟定時器中斷,配置NVIC:

      void TIM_ITConfig();

      NVIC_Init();

 使能定時器:TIM_Cmd();

 編寫中斷服務函式:TIMx_IRQHandler();

Tout(溢位時間)=ARR+1)(PSC+1)/Tclk      (其中Tclk為PSC時鐘也就是定時器還未分頻時的時鐘,一般為72M)

例如定時1S:

1S=(10000)*(7200)/72M

注:

typedef struct

{

  uint16_t TIM_Prescaler;       //TIMx 時鐘頻率除數的預分頻值(PSC)

  uint16_t TIM_CounterMode;    //計數模式

  uint16_t TIM_Period;       //自動重灌載值

  uint16_t TIM_ClockDivision; //時鐘分頻

  uint8_t TIM_RepetitionCounter; //重複計數

} TIM_TimeBaseInitTypeDef

狀態標誌位獲取和清除:

FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);

void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);