1;原理;
和外部中斷差不多,不同的是外部中斷的產生是由外部硬體產生變化的,而定時器中斷就是通過定時器的溢位實現中斷(可以想象成鬧鐘);
2;操作步驟;
這裡我用的是通用定時器tim3;
1)tim3 時鐘使能。
這裡我們通過 apb1enr 的第 1 位來設定 tim3 的時鐘,因為 stm32_clock_init 函式裡面
把apb1的分頻設定為2了,所以我們的tim3時鐘就是apb1時鐘的2倍,等於系統時鐘(72m)。
2)設定 tim3_arr 和 tim3_psc 的值。
通過這兩個暫存器,我們來設定自動重灌的值,以及分頻係數。這兩個引數加上時鐘頻率
就決定了定時器的溢位時間。
tout= ((arr+1)*(psc+1))/tclk;
tclk:tim3 的輸入時鐘頻率(單位為 mhz)。
tout:tim3 溢位時間(單位為 us)
3)設定 tim3_dier 允許更新中斷。
因為我們要使用 tim3 的更新中斷,所以設定 dier 的 uie 位為 1,使能更新中斷。
4)允許 tim3 工作。
光配置好定時器還不行,沒有開啟定時器,照樣不能用。我們在配置完後要開啟定時器,
通過 tim3_cr1 的 cen 位來設定。
5)tim3 中斷分組設定。
在定時器配置完了之後,因為要產生中斷,必不可少的要設定 nvic 相關暫存器,以使能
tim3 中斷。
6)編寫中斷服務函式。
在最後,還是要編寫定時器中斷服務函式,通過該函式來處理定時器產生的相關中斷。在
中斷產生後,通過狀態暫存器的值來判斷此次產生的中斷屬於什麼型別。然後執行相關的操作,
我們這裡使用的是更新(溢位)中斷,所以在狀態暫存器 sr 的最低位。在處理完中斷之後應
該向 tim3_sr 的最低位寫 0,來清除該中斷標誌。
通過以上幾個步驟,我們就可以達到我們的目的了,使用通用定時器的更新中斷,來控制
ds1 的亮滅;
3;**timer.c;
在這裡插入**片
#include
"timer.h"
#include
"led.h"
#include
"sys.h"
void
tim3_irqhandler
(void
)//中斷服務函式
tim3->sr&=~
(1<<0)
;//清除中斷標誌位
}void
tim3_init1
(u16 arr,u16 psc)
time.h
在這裡插入**片
#ifndef _timer_h_
#define _timer_h_
#include
"sys.h"
void
tim3_init1
(u16 arr,u16 psc)
;#endif
main.c
在這裡插入**片
#include
"stm32f10x.h"
#include
"delay.h"
#include
"led.h"
#include
"timer.h"
intmain()
}
有錯誤,歡迎指正; 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定時器的預裝暫存器及影子暫存器話題
摘自 經常有人問起預裝暫存器和影子暫存器的話題,其實stm32相關系列的手冊裡有介紹,有文件做介紹,這裡借花獻佛地一起分享下。在談預裝暫存器及影子暫存器的差別前,不妨先對stm32定時器的時基單元做個基本了解。stm32各系列的定時器結構和框架基本是一樣的,時基單元也一樣。下面時基單元是以stm32...