STM32 定時器系統原理

2021-10-24 18:09:41 字數 4103 閱讀 1495

目錄

stm32的定時器概述

通用定時器

通用定時器簡介

主要功能

模組框圖

時鐘**

通用定時器暫存器

控制暫存器 1(timx_cr1)

dma/中斷使能暫存器(timx_dier)

時基單元暫存器

計數器模式

向上計數模式

向下計數模式

定時週期的計算

庫函式**配置定時器

配置步驟

狀態檢視函式

**範例

stm32f1有time1和time8 等高階定時器,也有time2~time5等通用定時器,還有time6和time7等基本定時器

關於高階定時器、通用定時器、基本定時器的區別:

基本定時器:具有最基本的計時功能,與通用和高階定時器的16位自動重裝載計數器不同,他的計數器是乙個累加計數器!基本定時器獨有乙個其他定時器沒有的dac的同步電路!

通用定時器:能滿足大部分使用需求的定時器。

我們一般常用到的就是通用定時器。

使用外部訊號控制定時器和定時器互連的同步電路

如下事件發生時產生中斷/dma:

支援針對定位的增量(正交)編碼器和霍爾感測器電路

觸發輸入作為外部時鐘或者按週期的電流管理

加色處理的功能都是非常重要的常用功能!

通用定時器框圖如下所示,紅色框是計數器部分,當僅使用計數器模式的時候,只涉及這部分。在定時器的基礎上,還有下方的捕獲/比較通道,輸入通道可用於輸入捕獲(藍色部分)和輸出通道可用於輸出pwm(綠色部分),與上面主要功能的顏色對應。本文只涉及到紅色部分,也就是定時器的計數單元!輸入捕獲、pwm和dma在後文寫。

不過,一般我們使用內部時鐘

在時鐘樹可以看到,定時器2~7的內部時鐘源是apb1。庫函式版本預設使用systeminit函式初始化系統該時鐘的情況下:

sysclk=72m

ahb=72m

apb1=36m

也就是說apb1的分頻係數為2,所以定時器2~7(包括通用定時器)時鐘內部時鐘頻率為2*36m=72m。

另外需要注意的是定時器1和定時器8的時鐘源是apb2!

當使用外部時鐘的時候,其框圖如下

通用定時器的暫存器有,包括

加黑的幾個暫存器是使用定時器基本功能的必須了解的幾個暫存器!這裡也只敘述這幾個暫存器。

dir:計數方向

0:計數器向上計數

1:計數器向下計數

當計數器配置為**對齊模式或編碼器模式時,該位為唯讀。

cen:使能計數器

0:禁止計數器;

1:使能計數器。

cms[1:0]:選擇**對齊模式

00:邊沿對齊模式。計數器依據方向位(dir)向上或向下計數。

01:**對齊模式1。計數器交替地向上和向下計數。配置為輸出的通道(timx_ccmrx暫存器

中ccxs=00)的輸出比較中斷標誌位,只在計數器向下計數時被設定。

10:**對齊模式2。計數器交替地向上和向下計數。配置為輸出的通道(timx_ccmrx暫存器

中ccxs=00)的輸出比較中斷標誌位,只在計數器向上計數時被設定。

11:**對齊模式3。計數器交替地向上和向下計數。配置為輸出的通道(timx_ccmrx暫存器

中ccxs=00)的輸出比較中斷標誌位,在計數器向上和向下計數時均被設定。

當在計數器開啟時(cen=1),不允許從邊沿對齊模式轉換到**對齊模式。

其他的位,請檢視《stm32中/英文參考手冊》

uie:允許更新中斷

0:禁止更新中斷

1:允許更新中斷,計數暫存器中的資料更新時觸發中斷請求。

ccxie:允許捕獲/比較x中斷 (capture/compare 1 interrupt enable) 

0:禁止捕獲/比較x中斷;

1:允許捕獲/比較x中斷。

這個暫存器用於使能捕獲中斷(後面會寫)

時基單元包含:

預分頻器暫存器(timx_psc)

psc[15:0]:預分頻器的值

該暫存器存放的是預分頻器的值。預分頻器對定時器的時鐘源進行分頻,然後提供給計數器。前文已經提到,通用定時器的時鐘源有四個,可以通過timx_smcr 暫存器的的相關為進行設定。

為什麼要進行分頻?

答:因為一般時鐘源太快了。以系統時鐘源為例,72m的頻率,如果不分頻的話,那16位定時器的計時週期就65536/72m秒,約等於0.91ms,時間太短了。

自動重裝載暫存器(timx_arr)arr[15:0]:自動重裝載的值

arr包含了將要傳送至實際的自動重裝載暫存器的數值。

計數暫存器(timx_cnt)

cnt[15:0]:計數器的值

計數器從0計數到自動載入值(timx_arr計數器的內容),然後重新從0開始計數並且產生乙個計數器溢位事件。

計數器從自動裝入的值(timx_arr計數器的值)開始向下計數到0,然後從自動裝入的值重新開始並且產生乙個計數器向下溢位事件。

定時週期與時基單元密切相關,首先確定定時器時鐘源的頻率tclk(使用內部時鐘源,一般是72m),通過設定分頻器的值psc可以確定最大計時週期,然後通過設定自動重裝載暫存器的值arr,可以確定具體的溢位時間!計算公式如下:

tout(溢位時間)= (arr+1)(psc+1)/tclk

比如,要定時500ms,tclk為72m,令psc=7199,arr=4999,即可。

初始化定時器

開啟定時器更新中斷,配置nvic中斷控制器

使能定時器

編寫中斷服務函式

flagstatus tim_getflagstatus(tim_typedef* timx, uint16_t tim_flag);

void tim_clearflag(tim_typedef* timx, uint16_t tim_flag);

itstatus tim_getitstatus(tim_typedef* timx, uint16_t tim_it);

void tim_clearitpendingbit(tim_typedef* timx, uint16_t tim_it);

timer.c

void tim3_init(u16 arr,u16 psc)  

void tim3_irqhandler(void)

}

main.c

int main(void)

}

stm32關定時器 STM32定時器TIM3程式

include led.h include delay.h include key.h include sys.h include usart.h include timer.h stm32開發板實驗8 定時器中斷實驗 int main void delay init 延時函式初始化 nvic co...

STM32系統定時器 SysTick

systick 系統定時器是cm3核心中的乙個外設,內嵌在nvic中,所有基於cm3核心的微控制器都具有這個系統定時器,系統定時器一般用於作業系統,用於產生時基,維持作業系統的心跳。系統定時器是乙個24bit的向下遞減的計數器,計數器計數一次的時間為1 sysclk,一般我們設定系統時鐘sysclk...

stm32的定時器

stm32一共有8個都為16位的定時器。其中tim6 tim7是基本定時器 tim2 tim3 tim4 tim5是通用定時器 tim1和tim8是高階定時器。1.基本定時器 基本定時器tim6和tim7只具備最基本的定時功能,就是累加的時鐘脈衝數超過預定值時,能觸發中斷或觸發dma請求。由於在晶元...