目錄
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 暫存器的的相關為進行設定。
為什麼要進行分頻?自動重裝載暫存器(timx_arr)arr[15:0]:自動重裝載的值答:因為一般時鐘源太快了。以系統時鐘源為例,72m的頻率,如果不分頻的話,那16位定時器的計時週期就65536/72m秒,約等於0.91ms,時間太短了。
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請求。由於在晶元...