stm32使用通用定時器中斷的一般流程

2021-10-03 23:40:21 字數 1524 閱讀 6128

(注:文中的x為數字)

初始化1.timx的外設時鐘使能

rcc->apb1enr |= 1 << n;

2.設定arr暫存器(計時器自動重灌值)

timx->arr = arr;

3.設定預分頻器的值

在設定預分頻器的值之前,先理解這裡的預分頻器與時鐘系統裡的apb1外設的ppre1不同(由於原子的system中時鐘初始化函式將ppre1設為非1,所以外設定時器的時鐘就應該加倍了),也就是說進入下面這張圖的內部時鐘(ck_int)為72mhz,而psc預分頻器改變的是時基單元的那個,看到了嗎?

**格式:

timx->psc = psc;

4.允許更新中斷

timx->dier |= 1<< 0;

5.開定時器使能

timx->cr1 |= 1 << 0;

6.設定中斷分組及優先順序

在這裡就用原子提供的my_nvic_init();函式

(具體**看《設定中斷流程》)

(注:其實還應該有乙個設定定時器是向哪個方向計數:但預設的是邊沿對齊向上計數模式;如果要改變計數方向看下圖進行相關暫存器(cr1)的修改就可以了)

寫中斷服務函式

(注:每次進入中斷的最後要清除sr的0位

timx->sr &= ~(0x01 << 0))

如何計算裝入arr與psc的值(在這裡採用溯回法講解)

psc.:如果要將72mhz分頻7200,則為6199

arr:這個暫存器中存放的是產生中斷間隔的總計時點數,也就是說,當cnt暫存器中每次從0到arr將產生中斷(預設向上計數模式),那麼變化一次的時間就顯得關鍵了。那麼如何計算變化一次數的時間呢?這要配合psc暫存器來說了。

我們知道,經過psc分頻的頻率指的是變化一次所需時間週期的倒數。前面說過,經過原子的時鐘初始化使得apb1定時器時鐘為72mhz,而psc就是分頻的72mhz。舉例來說,假如你想要一次產生0.5s的中斷,那psc就設定7200 - 1 = 6199 arr設定5000 - 1 = 4999,前者設定分頻為10khz,cnt改變一次0.0001s,後者設定計數總點為5000 中斷時間為5000 * 0.0001 = 0.5s

(至於那個為什麼-1 可以這樣理解,每次溢位(在向上計數模式中),即歸0,都要經過arr + 1個間隔,關於psc,看一段話:

其實讀者自行畫乙個圖就好理解了,在這也就不贅述了)

STM32定時器中斷

本實驗的目的是通過定時器中斷控制led燈的亮滅。筆者所用ide為iar,採用標準庫 3.5韌體庫 通過定時器產生中斷來控制led。ifndef led h define led h include stm32f10x gpio.h include stm32f10x.h include stm32f...

stm32 定時器中斷

stm32f1的定時器非常多,由2個基本定時器 tim6 tim7 4個通用定時器 tim2 tim5 和2個高階定時器 tim1 tim8 組成。基本定時器的功能最為簡單,類似於51微控制器內定時器。通用定時器是在基本定時器的基礎上擴充套件而來,增加了輸入捕獲與輸出比較等功能。高階定時器又是在通用...

stm32 定時器中斷實驗

led.h ifndef led h define led h include sys.h void led init void define led0 pbout 5 紅燈 define led1 peout 5 綠燈 endif led.c include led.h include stm32...