s5pv210——定时器理论与操作
以下內容源于朱有鵬《物聯網大講壇》課程的學習,如有侵權,請告知刪除。
一、定時器簡介
1、定時器是SoC中常見外設
(1)定時器與計數器。
- 計數器每隔一個固定時間會計一個數;
- 計數值 * 計數時間周期 = 一段時間。
- 這個時間段就是我們定的時間。
(2)定時器/計數器作為SoC的外設,主要用來實現定時執行代碼的功能。
- 定時器相對SoC而言,就像鬧鐘相對于人的意義一樣。
2、定時器作用
(1)通過定時器的計時功能,計時結束后,定時器會產生中斷提醒CPU。
- 此時CPU會去處理中斷,并執行定時器中斷的ISR,從而去執行預先設定好的事件。
(2)定時器就好比CPU的秘書,這個秘書專門用來計時,并到時間后提醒CPU做某件事情。
3、定時器的原理
(1)定時器通過計數來實現定時。
- 定時器內部有一個計數器。
- 計數器的時鐘,由ARM的APB總線時鐘,經過時鐘模塊內部的分頻器的分頻得到
- 每隔一個時鐘周期,計數器就計數一次,定時器的時間就是計數器計數值×時鐘周期。
- 定時器內部有1個寄存器TCNT。
- 計時開始時,把總的計數值放入TCNT寄存器中,然后每隔一個時鐘周期TCNT中的值會自動減1(硬件自動完成,不需要CPU軟件去干預);
- 直到TCNT中減為0的時候,TCNT就會觸發定時器中斷。
(2)由此可知,定時時間是由2個東西共同決定的:一個是TCNT中的計數值,一個是時鐘周期。
4、定時器和看門狗、RTC、蜂鳴器的關系
(1)這幾個東西都是和時間有關的部件。
(2)看門狗其實就是一個定時器,只不過定時時間到了之后不只是中斷,還可以復位CPU
(3)RTC是實時時鐘,它和定時器的差別就好象鬧鐘(定時器)和鐘表(RTC)的差別一樣。
(4)蜂鳴器是一個發聲設備,在ARM里面蜂鳴器是用定時器模塊來驅動的。
二、S5PV210中的定時器
在S5PV210內部,一共有4類定時器件。這4類定時器件的功能、特征是不同的。
1、PWM定時器
(1)這種是最常用的,平時所說的定時器一般指的是這個。像簡單單片機(譬如51單片機)中的定時器也是這類。
(2)為什么叫PWM定時器?因為一般SoC中產生PWM信號都是靠這類定時器器件的。
2、系統定時器
(1)系統(指的是操作系統)定時器,也是用來產生固定時間間隔(TCNT×時鐘周期)信號的,稱為systick,這個systick用來給操作系統提供tick信號。
(2)產生systick作為操作系統的時間片(time slice)的。
(3)一般做操作系統移植的時候,這里不會由我們自己來做,一般原廠提供的基礎移植部分就已經包含了,所以幾乎不需要研究。
3、看門狗定時器
(1)看門狗定時器本質上也是一個定時器,和上面2個沒有任何本質區別。
(2)看門狗定時器可以設置在時間到了的時候產生中斷,也可以選擇發出復位信號復位CPU。
(3)看門狗定時器在實踐中應用很多,尤其是工業領域(環境復雜、干擾多)機器容易出問題,而且出問題后后果很嚴重,此時一般都會用看門狗來進行系統復位。
4、實時時鐘RTC(real time clock)
(1)區分時間段和時間點。
- 時間段是相對的,兩個時間點相減就會得到一個時間段;
- 時間點是絕對的,是絕無僅有的一個時間點。
(2)定時器關注的是時間段,定時器計時從開啟定時器的那一刻開始,到定的時間段結束為止產生中斷;而RTC中工作用的是時間點(xx年x月x日……)。
(3)RTC和定時器的區別,就相當于是鐘表和鬧鐘的區別。
三、S5PV210的PWM定時器
1、為什么叫PWM定時器?
- 本質上是定時器;
- 用來產生PWM波形。
2、PWM定時器介紹
(1)S5PV210有5個PWM定時器。
- 其中0、1、2、3各自對應一個外部GPIO,可以通過這些對應的GPIO產生PWM波形信號并輸出;
- Timer4沒有對應的外部GPIO(它不是為了生成PWM波形而設計的,而是為了產生內部定時器中斷而設計的);
(2)S5PV210的5個PWM定時器的時鐘源為PCLK_PSYS
- timer0和timer1共同使用一個預分頻器,timer2、3、4共同使用一個預分頻器;
- 每個timer有一個專用的獨立的分頻器;
- 預分頻器和分頻器構成了2級分頻系統,將PCLK_PSYS兩級分頻后生成的時鐘供給timer模塊作為時鐘周期。
3、S5PV210的PWM定時器框圖簡介
關鍵點:時鐘源、預分頻器、分頻器、TCMPB&TCNTB、dead zone
(1)預分頻器與分頻器
- 兩級分頻是串聯(級聯)的,所以兩級分頻的分頻數是相乘的。
- 兩級分頻的分頻系數分別在TCFG0和TCFG1兩個寄存器中設置。
- 預分頻器有2個,prescaler0為timer0&timer1共用,prescaler1為timer2、3、4共用;
- 兩個prescaler都是8個bit位,因此prescaler value范圍為0~255,因此預分頻器的分頻值范圍為1~256(注意實際分頻值為prescaler value + 1)。
- 分頻器實質上是一個MUX開關,多選一開關決定了走哪個分頻系數路線。可以選擇的有1/1,1/2,1/4,1/8,1/16等。
- 計算一下,兩級分頻下來,分頻最小為1/1(也可能是1/2),最大分頻為1/256×16(1/4096)。
- 在PCLK_PSYS為66MHz的情況下(默認時鐘設置就是66MHz的),此時兩級分頻后的時鐘周期范圍為0.03us到62.061us;
- 再結合TCNTB的值的設置(范圍為1~2的32次方),可知能定出來的時間最長為266548.27s(折合74小時多,遠遠夠用)。
(2)TCNT&TCMP、TCNTB&TCMPB、TCNTO
- TCNT和TCNTB是相對應的;TCNTB是有地址的寄存器,供程序員操作;TCNT在內部和TCNTB相對應,它沒有寄存器地址,程序員不能編程訪問這個寄存器。
- TCNT寄存器功能就是用來減1的,它是內部的不能讀寫;我們向TCNT中寫數值要通過TCNTB往進寫,讀取TCNT寄存器中的值要通過讀取相對應的TCNTO寄存器。
- 工作流程:事先算好TCNT寄存器中開始減的那個數(譬如300),然后將之寫入TCNTB寄存器中,在啟動timer前,將TCNTB中的值刷到TCNT寄存器中(有一位寄存器專門用來操作刷數據過去的),之后就可以啟動定時器開始計時;在計時過程中如果想知道TCNT寄存器中的值減到多少了,可以讀取相應的TCNTO寄存器。
- 定時功能只需要TCNT、TCNTB兩個即可;TCNTO寄存器用來做一些捕獲計時;TCMPB用來生成PWM波形。
4、自動重載和雙緩沖(auto-reload and double buffering)
(1)定時器工作的時候,一次定時算一個工作循環。
- 定時器默認是單個循環工作的,也就是說定時一次,計時一次,到期中斷一次就完了。下次如果還要再定時中斷,需要另外設置。
- 可以寫代碼反復重置定時器寄存器的值(在每次中斷處理的isr中再次給TCNTB中賦值,再次刷到TCNT中再次啟動定時器),早期的單片機定時器就是這樣的;
- 高級SoC中的定時器已經默認內置這種循環定時工作模式,就叫自動裝載(auto-reload)機制。
(3)自動裝載機制就是當定時器初始化好開始計時后再不用管了,一個周期到了之后,自動從TCNTB中再次裝載值到TCNT中,再次啟動定時器開始下個循環。
5、什么是PWM?
(1)PWM(pulse wide modulation,脈寬調制)
- PWM波形是一個周期性波形,周期為T,在每個周期內波形是完全相同的。
- 每個周期內由一個高電平和一個低電平組成。
- 一個是周期T,另一個是占空比duty(占空比就是一個周期內高電平的時間除以周期時間的商)。
(3)PWM波形的用處
- 譬如通信上用PWM來進行脈寬調制對基波進行載波調制;
- 在發光二極管LED照明領域可以用PWM波形來調制電流進行調光;
- 用來驅動蜂鳴器等設備。
6、PWM波形的生成原理
(1)早期的簡單單片機里(譬如51單片機)沒有專用的PWM定時器
- 需要自己結合GPIO和定時器模塊來生產PWM波形;
- 流程:先將GPIO引腳電平拉高,同時啟動定時器定T*duty時間,時間到了在isr中將電平拉低,然后定時T*(1-duty)后再次啟動定時器,然后時間到了后在isr中將電平拉高,然后再定時T*duty時間再次啟動定時器……
(2)因為定時器經常和PWM的產生有關,所以設計SoC的時候就直接把定時器和一個GPIO引腳內部綁定起來
- 然后在定時器內部給設置了PWM產生的機制,可以更方便的利用定時器產生PWM波形。
- 利用PWM定時器來產生PWM波形時,就可以不用中斷,而是直接生成PWM。
- 綁定之后壞處就是GPIO引腳是固定的、死板的、不能隨便換的。
- TCNTB決定PWM波形的周期,TCMPB決定PWM波形的占空比。
- 最終生成的PWM波形的周期是:TCNTB×時鐘周期(PCLK_PSYS經過兩極分頻后得到的時鐘周期)。
- 最終生成的PWM波形的占空比是:TCMPB/TCNTB
7、輸出電平翻轉器
(1)PWM定時器可以規定:當TCNT>TCMPB時為高電平,當TCNT<TCMPB時為低電平。也可以規定:當TCNT>TCMPB時為低電平,當TCNT<TCMPB時為高電平。在這兩種規定下,計算時TCMP寄存器的值會變化。
(2)基于上面講的,當duty從30%變到70%時,我們TCMPB寄存器中的值就要改(譬如TCNTB中是300時,TCMPB就要從210變化到90)。這樣的改變可以滿足需要,但是計算有點麻煩。于是乎210的PWM定時器幫我們提供了一個友好的工具叫做電平翻轉器。
(3)電平翻轉器在電路上的實質就是一個電平取反的部件,在編程上反映為一個寄存器位。寫0就關閉輸出電平反轉,寫1就開啟輸出電平反轉。開啟后和開啟前輸出電平剛好高低反轉。(輸出電平一反轉30%的duty就變成70%了)
(4)實戰中到底是TCNT和TCMPB誰大誰小時高電平還是低電平,一般不用理論分析,只要寫個代碼然后用示波器實際看一下出來的波形就知道了;如果反了就直接開啟電平翻轉器即可。
8、死區生成器
(1)PWM有一個應用就是用在功率電路中用來對交流電壓進行整流。整流時2路整流分別在正電平和負電平時導通工作,不能同時導通(同時導通會直接短路,瞬間的同時導通都會導致電路燒毀)。大功率的開關電源、逆變器等設備廣泛使用了整流技術。特別是逆變器,用SoC的GPIO輸出的PWM波形來分別驅動2路整流的IGBT。
(2)PWM波形用來做整理時要求不能同時高或低,因為會短路。但是實際電路是不理想的,不可能同時上升/下降沿,所以比較安全的做法是留死區。
(3)死區這東西離不了也多不了。死區少了容易短路,死區多了控制精度低了不利于產品性能的提升。
(4)S5PV210給大家提供了自帶的死區生成器,只要開啟死區生成器,生產出來的PWM波形就自帶了死區控制功能,用戶不用再自己去操心死區問題。
(5)大部分人工作是用不到這個的,直接關掉死區生成器即可。
四、蜂鳴器和PWM定時器編程實踐
1、蜂鳴器的工作原理
(1)蜂鳴器里面有2個金屬片,離的很緊但沒挨著;沒電的時候兩個片在彈簧本身張力作用下分開彼此平行;有電的時候兩邊分別充電,在異性電荷的吸力作用下兩個片挨著;
(2)我們只要以快速的頻率給蜂鳴器的正負極:供電、斷電。進行這樣的循環,蜂鳴器的兩個彈簧片就會挨著分開挨著分開……,從而敲擊發出聲音。
(3)因為人的耳朵能聽見的聲音頻率有限制(20Hz-20000Hz),我們做實驗時一般給個2KHz的頻率。
(4)頻率高低會影響聲音的音頻,一般是音頻越低聲音聽起來越低沉、音頻越高聽起來越尖銳。
(5)只要用PWM波形的電壓信號來驅動蜂鳴器,把PWM波形的周期T設置為要發出的聲音信號的1/頻率即可;PWM的占空比只要確保能驅動蜂鳴器即可(驅動能力問題,一般引腳驅動能力都不夠,所以蜂鳴器會額外用三極管來放大流來供電)。
2、原理圖和硬件信息
(1)查閱原理圖可知,開發板底板上的蜂鳴器通過GPD0_2(XpwmTOUT2)引腳連接在SoC上。
(2)GPD0_2引腳通過限流電阻接在三極管基極上,引腳有電蜂鳴器就會有電(三極管導通);引腳沒電蜂鳴器就會沒電(三極管關閉)。這些都是硬件問題,軟件工程師不用管,軟件工程師只要寫程序控制GPD0_2引腳的電平產生PWM波形即可。
(3)GPD0CON(0xE02000A0),要把bit8~bit11設置為0b0010(功能選擇為TOUT_2,就是把這個引腳設置為PWM輸出功能)。
(4)從GPD0_2引腳可以反推出使用的是timer2這個PWM定時器。
3、PWM定時器的主要寄存器詳解
相關的寄存器有TCFG0、TCFG1、CON、TCNTB2、TCMPB2、TCNTO2
4、蜂鳴器和PWM定時器編程實踐
(1)基于uart_stdio項目源碼來添加PWM定時器驅動蜂鳴器實驗;(2)PWM定時器來產生PWM波形時是不需要中斷干預的。
五、看門狗定時器
1、什么是看門狗、有什么用?
(1)看門狗定時器和普通的定時器并無本質區別。定時器可以設定一個時間,在這個時間完成之前定時器不斷計時,時間到的時候定時器會復位CPU(重啟系統)。
(2)系統正常工作的時候當然不希望被重啟,但是系統受到干擾、極端環境等可能會產生異常工作或者不工作,這種狀態可能會造成不良影響(至少是不工作),此時解決方案就是重啟系統。
(3)普通設備重啟不是問題,但是有些設備人工重啟存在困難。這時候我們希望系統能夠自己檢驗自己是否已經跑飛,并且在意識到自己跑飛的時候,可以很快的(幾個ms或者更短)自我重啟。這個功能就要靠看門狗定時器來實現。
(4)典型應用的情景是:我們在應用程序中打開看門狗設備,初始化好給它一個時間,然后應用程序使用一個線程來喂狗,這個線程的執行時間安全短于看門狗的復位時間。當系統(或者應用程序)異常后,喂狗線程自然就不工作了,然后到時候看門狗就會復位。
(5)補充:實戰中有時候為了絕對的可靠,我們并不會用SoC中自帶的看門狗,而是使用專門的外置的看門狗芯片來實現看門狗。
2、S5PV210看門狗定時器的結構框圖
(1)PCLK_PSYS經過兩級分頻后生成WDT(watchdog timer)的時鐘周期,然后把要定的時間寫到WTDAT寄存器中,刷到WTCNT寄存器中去減1,減到0時(定時時間到)產生復位信號或中斷信號。
(2)典型應用中是配置為產生復位信號,我們應該在WTCNT寄存器減到0之前給WTDAT寄存器中重新寫值以喂狗。
3、看門狗定時器的主要寄存器
WTCON WTDAT WTCNT WTCLRINT
4、看門狗定時器的編程實踐
(1)產生中斷信號
(2)產生復位信號
六、實時時鐘RTC
1、何為實時時鐘?
(1)real time clock,真實時間,即xx年x月x日x時x分x秒;
(2)RTC是SoC中一個內部外設,擁有獨立的晶振提供RTC時鐘源(32.768KHz),內部有一些寄存器用來記錄時間(年月日時分秒星期)。
- 一般情況下為了在系統關機時時間仍然在走,還會給RTC提供一個電池供電。
2、S5PV210實時時鐘的結構框圖
(1)時間寄存器7個;
(2)鬧鐘發生器;
3、鬧鐘發生器
(1)可以定鬧鐘時間,到時間會產生RTC alarm interrupt,通知系統鬧鐘定時到了。
(2)鬧鐘定時是定的時間點,而timer定時是定的時間段。
4、S5PV210實時時鐘的主要寄存器
(1)INTP,中斷掛起寄存器
(2)RTCCON,RTC控制寄存器
(3)RTCALM ALMxxx,鬧鐘功能有關的寄存器
(4)BCDxxx,時間寄存器
5、BCD碼
(1)RTC中所有的時間(年月日時分秒星期,包括鬧鐘)都是用BCD碼編碼的。
(2)BCD碼本質上是對數字的一種編碼,用4位二進制數表示1位十進制數字,比如十進制的56被編碼成0x56。
(3)BCD碼的作用
- 將十進制數拆成組成這個十進制數的各個數字的編碼,變成編碼后就沒有位數的限制了。
- 譬如123456789123456789,如果這個數純粹當數字肯定超出了int的范圍,計算機無法直接處理。
- 想讓計算機處理這個數,計算機首先得能表達這個數,表達的方式就是先把這個數轉成對應的BCD碼(123456789123456789)。
(4)BCD碼在計算機中可以用十六進制的形式來表示。也就是說十進制的56轉成BCD碼后是0x56,在計算機中用0x56來表達(暫時存儲與運算)。
(5)需要寫2個函數,一個是bcd轉十進制,一個是十進制轉bcd。
- 當要設置時間的時候(譬如要設置為23分),需要將這個23轉成0x23,然后再賦值給相應的寄存器BCDMIN;
- 當從寄存器BCDMIN中讀取一個時間時(譬如讀取到的是0x59),需要轉成十進制再去顯示(0x59當作BCD碼就是59,轉成十進制就是59,所以顯示就是59分)。
七、RTC實戰
1、設置時間與讀取顯示時間
(1)為了安全,默認情況下RTC讀寫是禁止的,此時讀寫RTC的時間是不允許的;當我們要更改RTC時間時,應該先打開RTC的讀寫開關,然后再進行讀寫操作,操作完了后立即關閉讀寫開關。
(2)讀寫RTC寄存器時,一定要注意BCD碼和十進制之間的轉換。
(3)年的問題。
- BCDYEAR寄存器存的并不是完整的年數,而是基于2000年的偏移量來存儲的;
- 譬如今年2015年,實際存的就是15(2015-2000);
- 還有些RTC芯片是以1970年為基點的。
2、鬧鐘實驗
總結
以上是生活随笔為你收集整理的s5pv210——定时器理论与操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 月周报模板
- 下一篇: 汇编指令的学习2——常用的ARM指令