天天看點

嵌入式知識-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)。

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

(2)CON

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

第一次需要手工将TCNTB中的值重新整理到TCNT中去,以後就可以auto-reload了。

自動裝載機制就是當定時器初始化好開始計時後再不用管了,他一個周期到了後會自己從TCNTB中再次裝載值到TCNT中,再次啟動定時器開始下個循環。

(3)TCNTB2、TCMPB2

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

通過改變TCMPB與TCNTB的比值即可改變PWM波的占空比。

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

除了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

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

在這裡要解釋一下,如果設定為中斷模式的話,即需要寫ISR函數,并且在配置中斷模式時,要将複位禁止。如果設定為複位模式,如果在規定時間内沒有喂狗(重裝載初值),系統則會複位,在配置為複位模式時,要将中斷模式禁止。

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

(2)WTDAT、WTCNT

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

(3)WTCLRINT

當看門狗被設定為中斷模式時,此寄存器用來清除中斷。

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

補充:當設定看門狗為中斷模式時

首先要将看門狗的中斷實體号與ISR通過VECTADDR進行綁定:

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

之後将中斷配置好之後使能中斷,并且在ISR程式執行的末尾設定清中斷和清看門狗中斷。

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

繼續閱讀