嵌入式知識-ARM裸機-學習筆記(8):SoC定時器與看門狗(WDT)

嵌入式知識-ARM裸機-學習筆記(8):SoC定時器與看門狗(WDT)

一、定時器

1. 定時器簡介

定時器是SoC中最常見的外設
(1)定時器與計數器。計數器是用來計數的(每隔一個固定時間會計一個數);因爲計數器的計數時間週期是固定的,因此到了一定時間只要用計數值×計數時間週期,就能得到一個時間段,這個時間段就是我們定的時間(這就是定時器了)。
(2)定時器/計數器作爲SoC的外設,主要用來實現定時執行代碼的功能。定時器相對於SoC來說,就好象鬧鐘相對於人來說意義一樣。

定時器有什麼用
(1)定時器可以讓SoC在執行主程序的同時,具有計時功能(通過定時器),到了一定時間(計時結束)後,定時器會產生中斷提醒CPU,CPU會去處理中斷並執行定時器中斷的ISR。從而去執行預先設定好的事件。
(2)定時器就好象是CPU的一個祕書一樣,這個祕書專門管幫CPU來計時,併到時間後提醒CPU要做某件事情。所以CPU有了定時器之後,只需預先把自己xx時間之後必須要做的事情綁定到定時器中斷ISR即可,到了時間之後定時器就會以中斷的方式提醒CPU來處理這個事情。

定時器的原理
(1)定時器計時其實是通過計數來實現的。 定時器內部有一個計數器,這個計數器根據一個時鐘(這個時鐘源來自於ARM的APB總線,然後經過時鐘模塊內部的分頻器來分頻得到)來工作。每隔一個時鐘週期,計數器就計數一次,定時器的時間就是計數器計數值×時鐘週期。
(2)定時器內部有1個寄存器TCNT,計時開始時我們會把一個總的計數值(初值)放入TCNT寄存器中,然後每隔一個時鐘週期(假設爲1ms)TCNT中的值會自動減1(硬件自動完成,不需要CPU軟件去幹預),直到TCNT中減爲0的時候,TCNT就會觸發定時器中斷。
(3)定時時間是由2個東西共同決定的:一個是TCNT中的計數值,一個是時鐘週期,兩者的乘積即爲最終定時的時間

2. 與定時器有關的器件

看門狗
看門狗定時器和普通的定時器並無本質區別。定時器可以設定一個時間,在這個時間完成之前定時器不斷計時,時間到的時候定時器會復位CPU(重啓系統)。
普通設備重啓不是問題,但是有些設備人工重啓存在困難。這時候我們希望系統能夠自己檢驗自己是否已經跑飛,並且在意識到自己跑飛的時候,可以很快的(幾個ms或者更短)自我重啓。這個功能就要靠看門狗定時器來實現。
我們在應用程序中打開看門狗設備,初始化好給它一個時間,然後應用程序使用一個線程來喂狗,這個線程的執行時間安全短於看門狗的復位時間。當系統(或者應用程序)異常後,喂狗線程自然就不工作了,然後到時候看門狗就會復位。
實戰中有時候爲了絕對的可靠,我們並不會用SoC中自帶的看門狗,而是使用專門的外置的看門狗芯片來實現看門狗。

pwm定時器
PWM(pulse wide modulation 脈寬調製):是一個週期性波形,週期爲T,在每個週期內波形是完全相同的。每個週期內由一個高電平和一個低電平組成。
PWM波形有2個重要參數:一個是週期T,另一個是佔空比duty(佔空比就是一個週期內高電平的時間除以週期時間的商)。
對於一個PWM波形,知道了週期T和佔空比duty,可以得到高電平時間爲Txduty,低電平時間爲Tx(1-duty)。 PWM波形其實就是用時間來控制電平高低,所以用定時器來實現PWM波形是天經地義的。
在S5PV210中,PWM波形產生有2個寄存器很關鍵,一個是TCNTB、一個是TCMPB。其中,TCNTB決定了PWM波形的週期,TCMPB決定了PWM波形的佔空比。
最終生成的PWM波形的週期是:TCNTB×時鐘週期(PCLK_PSYS經過兩極分頻後得到的時鐘週期)。注意這個週期是PWM中高電平+低電平的總時間,不是其中之一。最終生成的PWM波形的佔空比是:TCMPB/TCNTB。

RTC時鐘
RTC(real time clock)是實時時鐘,它和定時器的差別就好象鬧鐘(定時器)和鐘錶(RTC)的差別一樣。也就是所謂的年月日時分秒。
RTC是SoC中一個內部外設,RTC有自己獨立的晶振提供RTC時鐘源(32.768KHz),內部有一些寄存器用來記錄時間(年月日時分秒星期)。一般情況下爲了在系統關機時時間仍然在走,還會給RTC提供一個電池供電。

二、定時器常見用法

1. PWM定時器驅動蜂鳴器

蜂鳴器簡介
蜂鳴器裏面有2個金屬片,離的很緊但沒挨着;沒電的時候兩個片在彈簧本身張力作用下分開彼此平行;有電的時候兩邊分別充電,在異性電荷的吸力作用下兩個片挨着。我們只要以快速的頻率給蜂鳴器的正負極:供電、斷電。進行這樣的循環,蜂鳴器的兩個彈簧片就會挨着分開挨着分開···形成敲擊,發出聲音。
根據以上的分析,可以看出,只要用PWM波形的電壓信號來驅動蜂鳴器,把PWM波形的週期T設置爲要發出的聲音信號的1/頻率即可;PWM的佔空比只要確保能驅動蜂鳴器即可。

PWM定時器主要寄存器
(1)TCFG0、TCFG1
這兩個寄存器是用來進行預分頻和分頻的,通過將PCLK進行分頻處理的到一個頻率較低的時鐘信號,用於驅動PWM定時器。
兩級分頻是串聯(級聯)的,所以兩級分頻的分頻數是相乘的。預分頻器有2個,prescaler0爲timer0&timer1共用prescaler1爲timer2、3、4共用;兩個prescaler都是8個bit位,因此prescaler value範圍爲0~255;所以預分頻器的分頻值範圍爲1~256(注意實際分頻值爲prescaler value + 1)。
在這裏插入圖片描述
(2)CON
在這裏插入圖片描述
第一次需要手工將TCNTB中的值刷新到TCNT中去,以後就可以auto-reload了。
自動裝載機制就是當定時器初始化好開始計時後再不用管了,他一個週期到了後會自己從TCNTB中再次裝載值到TCNT中,再次啓動定時器開始下個循環。

(3)TCNTB2、TCMPB2
在這裏插入圖片描述
通過改變TCMPB與TCNTB的比值即可改變PWM波的佔空比。
在這裏插入圖片描述
除了TCNTB和TCMPB外,還有個寄存器叫TCNT。 TCNT和TCNTB是相對應的,TCNTB是有地址的寄存器,供程序員操作;TCNT在內部和TCNTB相對應,它沒有寄存器地址,程序員不能編程訪問這個寄存器。
TCNT寄存器功能就是用來減1的,它是內部的不能讀寫;我們向TCNT中寫要通過TCNTB往進寫;讀取TCNT寄存器中的值要通過讀取相對應的TCNTO寄存器
工作流程就是:我們事先算好TCNT寄存器中開始減的那個數(譬如300),然後將之寫入TCNTB寄存器中,在啓動timer前,將TCNTB中的值刷到TCNT寄存器中(有一位寄存器專門用來操作刷數據過去的),刷過去後就可以啓動定時器開始計時;在計時過程中如果想知道TCNT寄存器中的值減到多少了,可以讀取相應的TCNTO寄存器來得知。

2. 看門狗定時器

看門狗主要用到的寄存器
(1)WTCON
在這裏插入圖片描述
在這裏要解釋一下,如果設置爲中斷模式的話,即需要寫ISR函數,並且在配置中斷模式時,要將復位禁止。如果設置爲復位模式,如果在規定時間內沒有喂狗(重裝載初值),系統則會復位,在配置爲復位模式時,要將中斷模式禁止。

在配置完成的最後,要將WTCON的第5位置1,使能看門狗程序。

(2)WTDAT、WTCNT
在這裏插入圖片描述
(3)WTCLRINT
當看門狗被設置爲中斷模式時,此寄存器用來清除中斷。
在這裏插入圖片描述
補充:當設置看門狗爲中斷模式時

首先要將看門狗的中斷物理號與ISR通過VECTADDR進行綁定:
在這裏插入圖片描述
之後將中斷配置好之後使能中斷,並且在ISR程序執行的末尾設置清中斷和清看門狗中斷。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章