1. 程式人生 > >STM32學習--定時器(基本定時器)

STM32學習--定時器(基本定時器)

1.功能及原理

  基本定時器TIM6和TIM7各包含一個16位自動裝載計數器,由各自的可程式設計預分頻器驅動。它們可以作為通用定時器提供時間基準,特別地可以為數模轉換器(DAC)提供時鐘。實際上,它們在晶片內部直接連線到DAC並通過觸發輸出直接驅動DAC。這2個定時器是互相獨立的,不共享任何資源。

這裡寫圖片描述
  由圖可知其時鐘源僅能來源於PCLK1,當PCLK1預分頻係數為1時 TIMCLK =PCLK1,否則TIMCLK =2*PCLK1。計數器的驅動時鐘= TIMCLK/PSC。

  基本定時器的計數器為累加計數器,計數器值(CNT)從0開始累加到自動裝載值(ARR)時會產生一個溢位事件,每次溢位事件會產生更新事件,使能中斷後會產生相應中斷。

  比較特別的一點是關於執行時修改ARR和PSC的值。這個需要理解影子暫存器,ARR和PSC都有兩個暫存器,一個儲存我們寫入的值,影子暫存器實際上是正在執行時的值。
  ARR的影子暫存器由_CR1中的ARPE位控制是否使能。ARPE為0時預裝載值立即傳輸到影子暫存器中,CNT計數到新的預裝載值時就產生溢位事件;ARPE為0時預裝載值會在一個更新事件之後才會傳輸到影子暫存器中,CNT計數到原預裝載值後才更新影子暫存器,下次計數時才會按新的預裝載值進行計數。
PSC的影子暫存器只會在一個更新事件之後才會傳輸到影子暫存器中。
  關於更新事件還有兩個點:
  _CR1中URS位可以選擇UEV事件的請求源,為0:如果使能了中斷或DMA,以下任一事件可以產生一個更新中斷或DMA請求:計數器溢位、設定UG位、 通過從模式控制器產生的更新(其實這個好像沒有)。為1時,如果使能了中斷或DMA,只有計數器溢位可以產生更新中斷或DMA請求。
  UDIS位禁止更新,為0時更新事件使能,為1時不產生更新事件(UEV),影子暫存器保持它的內容(ARR、 PSC)。但是如果設定了UG位則計數器和預分頻器將被重新初始化。

  單脈衝模式 :在_CR1中OPM選擇,為1時,在發生下次更新事件時,計數器停止計數(清除CEN位)。

2.暫存器

  TIMx_CR1:除了前面介紹了ARPE、OPM、URS、UDIS,就只有CEN,就是使能定時器。
  TIMx_CR2:設定主模式選擇MMS,由於時鐘僅可來源於PCLK1,所以個人覺得它不能工作在從模式下。但可以在主模式下工作。

000: 復位 – 使用TIMx_EGR暫存器的UG位作為觸發輸出(TRGO)。
001: 使能 –> 計數器使能訊號CNT_EN被用作為觸發輸出(TRGO)。
010:更新 – 更新事件被用作為觸發輸出(TRGO)。

  TIMx_DIER:只用2個位,分別是使能DMA和使能中斷。
  TIMx_SR:只用1個位,標識更新中斷。
  TIMx_EGR:只用1個位,UG:產生更新事件,置1時,重新初始化定時器的計數器併產生對暫存器的更新。注意:預分頻器也被清除(但預分頻係數不變)。
  TIMx_CNT、TIMx_PSC、TIMx_ARR:分別是計數值、分頻係數、預裝載值。

3.使用方法

  基本使用方法:
  ①TIMx時鐘使能。
  ②設定 TIMx_ARR 和 TIMx_PSC 的值。
  ③設定 TIMx_DIER 允許更新中斷。
  ④允許 TIMx 工作,開始計數。
  ⑤TIMx 中斷分組設定。
  ⑥編寫中斷服務函式,在處理完中斷之後應,該向 TIMx_SR 的最低位寫 0,來清除該中斷標誌。