中斷韌體庫程式設計
定時器初始化結構體
開始程式設計
本文為野火學習筆記。
stm32f1系列。除互聯型裝置,共有8個定時器,分為基本,通用,高階3種定時器。不同的定時器有不同的功能。
基本定時器為 tim6,tim7 。其只能定時,沒有外部io,且16位計數器只能向上計數。
通用定時器為 tim2/3/4/5 , 可以定時;也可輸出比較和輸入捕捉,每個定時器有4個io,16位計數器可上下計數。
高階定時器為 tim1/8 ,在通用的基礎上多了互補輸出訊號的功能,每個定時器有8個io口。
下圖為基本定時器的結構框圖:
時鐘源定時器的時鐘源名為timxclk,可以在時鐘樹中找到
timxclk時鐘是來自於apb1的,而apb1的預分頻器一般選擇2分頻,使得apb1匯流排的時鐘為36m;因此,timexclk的時鐘為72m.
計數器時鐘
時鐘接入觸發控制器,經過psc預分頻器分頻,驅動cnt計數器。 psc 為16位分配器,可對時鐘訊號進行1~65536分頻。最終計數器的時鐘計算公式如下。
c k_
cnt=
timx
clkp
sc+1
ck\_cnt ~= ~\frac
ck_cnt
=psc
+1ti
mxcl
k公式中分母+1的操作是官方規定的。
計數器cnt為16位計數器,只能向上計數,計數達到指定數時,更新事件,清零從頭計數。
自動過載暫存器
暫存器中儲存著計數最大值,計到此數,若配置了中斷,會產生中斷。
影子暫存器
自動過載暫存器arr和預分頻器psc下有陰影,表示其有影子暫存器。影子暫存器起到緩衝的作用,若在計數器仍在計數時,修改arr或psc的值,如果直接寫入,則計數器直接清零,重新開始計數。若向影子暫存器寫入,則會在當前計數週期結束後,修改值,計數器不會被打斷。
每記一次耗費時間為 1ck
_clk
\frac
ck_clk
1,計數器計滿一次所需時間為 arr
ck_c
lk\frac
ck_clk
arr
,即為:arr
psc+
1tim
xclk
arr\frac
arrtim
xclk
psc+
1當計時器時鐘為 72m,psc預分頻器為71,自動重裝載arr為1000時,計滿一次的時間即為 1000
7272m=
1ms1000\frac~=1ms
100072
m72
=1ms
.基本定時器只在溢位時才會產生中斷,溢位時也可產生dma請求。timx_dier暫存器控制dma和中斷的使能,timx_egr暫存器記錄溢位事件的產生。
typedef
struct
tim_timebaseinittypedef;
在這裡,計數模式表示的是向上還是向下計數。最後兩個引數是不是基本定時器的功能,不用配置。
基本暫存器十分簡單,只能計時。這裡編寫乙個使得led以1秒間隔閃爍的程式。
void
basic_tim_config
(void
)
基本定時器只能向上計數,因此,初始化結果體中只需配置 psc 和arr。配置psc=71,arr=1000。即計數一次為1ms。
接下來我們希望在計數完成發生中斷,按照 中斷應用總結 中的步驟,使能外設中斷。
使用tim_clearflag
清除中斷標誌位,計數溢位的事件被稱為更新事件,對應韌體庫中的標誌位叫tim_flag_update
。然後使用tim_itconfig
使能更新事件的中斷。
最後使用tim_cmd
使能定時器。這裡我們完成了tim6的初始化和外設中斷使能,下面繼續配置中斷。
因程式只有這乙個中斷,優先順序分組並不重要,這裡配置中斷優先順序分組為0;
nvic_prioritygroupconfig
(nvic_prioritygroup_0)
;
static
void
basic_tim_nvic_config
(void
)
配置主優先順序為0,子優先順序為3。在初始化 tim6 中使用這個函式。
在startup_stm32f10x_hd.s中找到tim6中斷的函式名,在stm32f10x_it.c編寫中斷服務函式。
extern
volatile uint16_t time;
void
tim6_irqhandler
(void
)}
進入中斷後,檢查是否真的中斷,並設乙個全域性變數 time, 用來完成1s的記錄。最後使用tim_clearitpendingbit
清除中斷標誌位。
#define led_g_gpio_pin gpio_pin_0
#define led_g_gpio_port gpiob
#define led_g_teoogle
volatile uint16_t time=0;
intmain
(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定時器 基本定時器1
我是鼎!定時器時鐘一定要明確其中有哪些變數。上圖為stm407資料手冊摘出來的,可能看不清楚,其實就蘊含了幾點資訊。注意一點,我們看圖2,我們以apb1舉例,上面掛著很多的外設,包括usart1 adc 以及定時器,我們知道apb1上面最高時鐘頻率為84mhz,但是定時器的時鐘是要在此基礎上乘2,也...
stm32定時器的基本設定
定時器的基本設定 1 tim timebasestructure.tim prescaler 7199 時鐘預分頻數 例如 時 鐘頻率 72 時鐘預分頻 1 2 tim timebasestructure.tim period 9999 自動重裝載暫存器週期的值 定時 時間 累計 0xffff個頻率...