定時器與延時函式

2021-08-19 17:20:13 字數 2039 閱讀 8909

stm32定時器包含基本定時器、通用定時器和高階定時器,其中tim6和tim7是stm32當中的基本定時器,作為初學者,先從最基本的學起最容易,下面我們用這個定時器實現毫秒延時函式來入門stm32定時器的應用。

學習微控制器,就是學習使用它的暫存器。即便你用庫函式,暫存器也是必須要學習的。

tim6 tim7的暫存器如下所示:

先略覽一下暫存器,cr1和cr1是控制暫存器,sr是狀態暫存器,arr就是溢位值暫存器,cnt就是計數器的當前值,psc是預分頻暫存器。預分頻暫存器?聽的傻眼了吧,前面幾個個暫存器聽的還能理解,一聽到預分頻暫存器,好像不知道是幹嘛用的。瑞生來給你解釋一下吧,你可以給預分頻暫存器裡面寫乙個從0~65535的值,這個值+1,就是定時器執行的時鐘。舉個例子,比如微控制器工作在主頻72mhz,預分頻暫存器寫0,預分頻係數就是0+1=1,定時器的時鐘就是72mhz/1=72mhz;再舉個例子,比如微控制器還是工作在主頻72mhz,預分頻暫存器寫71,預分頻係數就是71+1=72,定時器的時鐘就是72mhz/72=1mhz。知道定時器的時鐘有什麼用?相信很多初學者不清楚,定時器的時鐘關乎定時器計數器cnt遞增的時間間隔,根據頻率和週期的公式f=1/t,定時器計數器遞增的時間間隔就是1/定時器的時鐘,例如當定時器時鐘為1mhz時,定時器計數器遞增的時間間隔就是1/1mhz=1微秒,這時,如果你把溢位值設定為1000,就是1000*1us=1ms溢位。

1.直接操作暫存器

下面,我們先用直接操作暫存器的方式,寫乙個毫秒延時函式:

void delay_ms(uint16_t ms)

第一條語句,設定預分頻係數為35999+1=36000,所以定時器的時鐘為72000000/36000=2000hz,那麼定時時間間隔就是1/2000=0.0005秒,即0.5毫秒。

第二條語句,設定溢位值為ms乘以2,假如要延時1秒,函式的引數ms就是1000,溢位值就是1000*2=2000,2000*0.5毫秒=1000毫秒,即1秒。這時候,有人會說,為什麼不乾脆把預分頻值psc設定為71999,即預分頻係數為72000,定時器的時鐘就是72000000/72000=1000hz,定時時間就是1毫秒,那麼直接把函式的引數ms給了溢位值暫存器arr就可以了,就不必乘以2了。想法是可以,但是你得知道,定時器都是16位的,所以psc的值最大到65535,到不了71999。這下你明白了吧?

第三條語句,cr1暫存器bit3寫1,由暫存器定義得知,這是把定時器設定為一旦發生溢位,就停止定時器,因為我們做的是延時函式,延時到了以後,就沒有必要讓定時器再不斷遞增了,所以要這樣設定。

第四條語句,cr1暫存器bit0寫1,開啟定時器,定時器計數器開始從0遞增。

第五條語句,檢測狀態暫存器sr中的bit0uif是否置1,置1的時候,定時值就達到溢位值了,說明定時時間到了。

第六條語句,清除狀態暫存器sr中剛才溢位造成的uif位。

2.使用庫函式

下面,我們看看怎麼使用庫函式實現毫秒延時函式:

void tim6_delay_ms(uint16_t ms)

你可以細細觀察一下上面的庫函式,實際上,和直接操作暫存器是一樣的。比如說,我們看開啟定時器的庫函式tim_cmd(tim6,enable),我們開啟這個函式,如下所示:

void tim_cmd(tim_typedef* timx, functionalstate newstate)

else

}

上面兩個方式雖能達到普通定時器製作延時函式的目的,但是卻不能us級別延時函式,讓人很是頭疼!所以不得已不用軟體延時來實現,**如下:

void delay_us( __io u32 ntime )

}

定時器和延時

interrupt 中斷優先順序 定時器和延時的區別 定時器,是指在做一件事情過程中,後台有個計時器,預定時間到後觸發另一項工作。延時,是指在做一件事情過程中,保持一種工作狀態的時間。利用迴圈處理的方式實現的延時,並不精確。1 當中斷發生時,cpu被打斷先執行中斷服務。導致執行時間變長。2 使用高階...

Flex之無延時定時器

在寫定時器的時候,我們希望第一次開啟定時器不用延時,直接載入。而不用再等待該定時器設定的時間就直接執行。也是就說無延時定時器 下面我舉個簡單的例子加以說明。mytimer.as package com.utils.allas public override function start void t...

核心定時器和延時

核心在時鐘中斷發生後檢測各定時器是否到期,在linux核心中提供了一組函式和資料結構來完成定時觸發工作 週期的事務。struct timer list expires,定時器的到期時間,單位是jiffies function,定時器到期,要執行的函式 data,傳入要執行的函式的引數 1.void ...