嵌入式 定時器中斷

2022-05-09 06:57:08 字數 1779 閱讀 2631

先上**

#include void

init();

void

main()

void

init()

void timer0() interrupt 1

示例**就要有示例**的樣子,簡簡單單的才能把問題說清楚!

先解釋下幾個變數,tmod,th0,tl0,et0,ea,tr0,這些變數不是我定義的,而是標頭檔案中的,先掌握用法,再深究原理。

tmod:選擇定時器的模式,不同的模式主要是能數到的最大數不同,一般就用模式1,最大可數到65535

th0:tl0:設定起始值,th0 故名思議就是數字轉為16進製制的高8位,tl0為低八位

tr0:啟動、停止定時器,1啟動,0停止,這個比較好理解吧

ea:允許系統進行中斷,1允許,0禁止,算是個許可權之類的東西

et0:允許定時器0進行中斷,1允許,0禁止

到這裡你肯定還會有疑問,我接著給你解釋!

1.定時器定時時間怎麼算的啊,0x4bfc轉為10進製並不是50啊?

——確實不是50,在講定時器時間的演算法之前,先得說下這個定時器的原理。

在我們高階語言習慣中,定時器就是給他設定乙個數,他一秒數一下,數到那個值後進行一次定時操作。但是在嵌入式中並不是這樣,也是因為這樣錯誤的想法,我不理解了很久。

在嵌入式中,定時器的實現原理是,他從某個數開始數,一直數到上限(如65535),到65536的時候定時器溢位,進行一次操作,而我們給的0x4bfc是定時器的起始值,也就是說定時器將從這個值開始數,一直數到65535,中間所耗費的時間就是50ms。

2.似乎明白了,那這個時間具體怎麼算啊?

——恩,這個問題稍有些複雜,回答這個問題之前,還是要繼續引入幾個概念。

時鐘週期t1:晶振振盪週期,公式  t1 = 1/頻率  ,如11.0592mhz的晶振頻率  t1 = 1/11.0592 us

機器週期t2:機器執行一條基本指令的時間,公式  t2 = 12 * t1  ,如11.0592mhz的機器週期約為  1.085 us

所以,要定時50ms的計算過程

50ms = 50000us = 50000/1.085 機器週期 = 46083 次

也就是說,要讓計時器數 46083 次就好了,要數到65535,那麼很自然就知道是要從 65535 - 46083 = 19452 數起

19452d = 0x4bfc

所以 th0 = 0x4b,  tl0 = 0xfc

3.我有注意到,th0 tl0 tr0 et0 後面都有0,感覺挺奇怪的?

——你看的很仔細,沒錯,這個0是有意義的。事實上,微控制器裡有兩個定時器,th0表示第乙個定時器,th1表示第二個,另外幾個以t開頭的都表示定時器變數,也都有t_0和 t_1兩種,e開頭的表示與中斷相關。

4.interrupt 1 裡面的1是什麼意思,能換成其他數字嗎?

——後面的1是中斷號,timer0 這個函式名稱你可以隨便取,但是後面這個數字卻是固定的,因為它是用來說明這個函式是誰的中斷函式,1表示是定時器1來中斷,3表示定時器2中斷。事實上,還有幾個額外的中斷型別,但是作為入門,就不在這裡列舉了。

5.為什麼在中斷函式 timer0 裡又重新設定了一次 th0 和 tl0 呢,這是必須的嗎?

——上面有提到過,這個函式裡面的過程是在定時器數到65536溢位後執行的,但是有個問題是溢位完後th0 和 tl0就會被重置為0,如果你不重新設定的話它會從0開始數起,所以是必須的,定時器1和定時器2都是這樣的。

定時器簡單的理解到這就差不多了,關於中斷還需要繼續學習,另外幾種中斷方式原理上都是有共通點的!

Linux嵌入式 核心 核心定時器

1.度量時間差 時鐘中斷由系統的定時硬體以週期性的時間間隔產生,這個間隔 即頻率 由核心根據hz來確定,hz是乙個與體系結構無關的常數,可配置 50 1200 在x86平台,預設值為1000 每秒計數1000次 每當時鐘中斷發生時,全域性變數jiffies unsigned long 就加1,因此j...

嵌入式Linux系統 「核心定時器」

linux 下的核心定時器 類似微控制器中的定時器中斷 1.涉及函式 1.初始化定時器佇列結構 init timer buttons timer 2.定時器超時函式 buttons timer.function buttons timer function 3.或者初始化定時器和超時函式作為一步 d...

嵌入式中斷

interrupt double compute area double radius 這個函式有太多的錯誤了,以至讓人不知從何說起了 1 isr 不能返回乙個值。如果你不懂這個,那麼你不會被雇用的。2 isr 不能傳遞引數。如果你沒有看到這一點,你被雇用的機會等同第一項。3 在許多的處理器 編譯器...