STM32 基本定時器

2021-10-23 17:17:59 字數 3122 閱讀 9530

中斷韌體庫程式設計

定時器初始化結構體

開始程式設計

本文為野火學習筆記。

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個頻率...