基本概念:
在嵌入式系統中,General Purpose Timer(GPT)是一種非常重要的硬件組件,用于提供定時功能。
- 定義:通用定時器是一種能夠提供精確時間測量和控制功能的電子設備或電路模塊。它可以產生周期性的時鐘信號,通常可提供從微秒級到毫秒級的定時時鐘功能。也可以對事件進行計時和計數,廣泛應用于各種需要時間控制和測量的場景。
- 工作原理:通常基于振蕩器產生基準時鐘信號,然后通過分頻、計數等操作來實現特定的時間間隔和定時功能。例如,一個簡單的通用定時器可以由一個晶體振蕩器和一個計數器組成,晶體振蕩器產生穩定的振蕩頻率,計數器對振蕩周期進行計數,當計數值達到預設值時,產生一個定時中斷或輸出信號
與其他定時器的比較
-
與RTC(實時時鐘)的區別:
- 功能側重點不同:RTC主要用于提供準確的日期和時間信息,它能夠持續運行,即使在設備斷電的情況下,也能通過備用電池保持時間的連續性,常用于需要長期準確計時的場景,如電子手表、計算機主板等。而通用定時器更側重于產生精確的時間間隔和進行事件計數,用于控制和測量設備的運行狀態和事件的發生。
- 精度和范圍不同:RTC的精度通常在秒級,能夠提供年、月、日、時、分、秒等完整的時間信息。通用定時器的精度可以更高,能夠達到微秒甚至納秒級別,但它的計時范圍相對較小,一般用于較短時間間隔的測量和控制。
-
與看門狗定時器的區別:
- 作用目的不同:看門狗定時器主要用于系統監控和故障恢復。當系統出現異常或死機時,看門狗定時器會在超時后觸發復位信號,使系統重新啟動,以保證系統的可靠運行。通用定時器則主要用于實現設備的正常功能和時間控制,不具有自動復位系統的作用。
- 工作方式不同:看門狗定時器需要定期被“喂狗”,即在正常運行時,系統需要在定時器超時前對其進行清零或重置操作,以防止復位信號的產生。通用定時器則根據預設的時間參數和事件觸發條件進行工作,不需要外部的定期干預。
RTC(實時時鐘)與看門狗定時器在后續博客中會做出重點論述,這里只簡單概述與GPT定時器的區別
以I.MX6ULL開發板為例,介紹GPT定時器在嵌入式中的應用
I.MX6ULL GPT介紹
The GPT has a 32-bit up-counter. The timer counter value can be captured in a register using an event on an external pin. The capture trigger can be programmed to be a rising or/and falling edge. The GPT can also generate an event on the output compare pins and an interrupt when the timer reaches a programmed value. The GPT has a 12-bit prescaler, which provides a programmable clock frequency derived from multiple clock sources.
GPT具有一個32位向上計數器。通過外部引腳上的事件,可以將定時器計數器的值捕獲到寄存器中。捕獲觸發條件可以編程設置為上升沿或/和下降沿。當定時器達到預設值時,GPT還可以在輸出比較引腳上生成事件并產生中斷。GPT具有一個12位預分頻器,可從多個時鐘源派生出可編程的時鐘頻率。
?I.MX6ULL GPT框圖
時鐘輸入與預分頻:
外部時鐘信號從時鐘選擇模塊輸入。
預分頻器(Prescaler)是一個12位可編程的分頻器,可以將輸入時鐘信號分頻,范圍從1到4096。預分頻器的輸出作為定時器計數器的時鐘源。
定時器計數器:
定時器計數器是一個32位向上計數器,它會根據預分頻器輸出的時鐘信號進行計數。計數器的值可以通過處理器數據總線(Processor Data Bus)進行讀取和寫入。
輸入捕獲:
GPT模塊有兩個輸入捕獲通道(GPT_CAPTURE1和GPT_CAPTURE2),它們可以同步外部事件。當外部引腳上的信號變化(如上升沿或下降沿)時,可以通過輸入捕獲寄存器(Timer Input Reg 1和Timer Input Reg 2)捕獲當前計數器的值。輸入捕獲通道可以配置觸發條件,如上升沿(IF1)、下降沿(IF2)或雙邊沿(IF1IE和IF2IE)。
輸出比較:
GPT模塊有三個輸出比較通道(GPT_COMPARE1、GPT_COMPARE2和GPT_COMPARE3),它們可以用于生成事件或中斷。輸出比較寄存器(Timer Output Reg1、Timer Output Reg2和Timer Output Reg3)存儲預設的比較值。當計數器的值與任一輸出比較寄存器的值相匹配時,可以通過比較器(cmp)觸發輸出比較事件(OF1、OF2、OF3)。
輸出模式:
輸出比較事件可以配置不同的輸出模式(OM1、OM2、OM3),這些模式定義了輸出引腳在比較事件發生時的行為。
中斷:
當輸入捕獲或輸出比較事件發生時,可以生成相應的中斷(IF1IE、IF2IE、OF1IE、OF2IE、OF3IE)。中斷通過GPT中斷總線(GPT Interrupt Bus)傳遞給處理器。
溢出和回卷:
當計數器達到最大值(0xFFFFFFFF)時,會發生溢出(ROV),并觸發溢出中斷(ROVIE)。計數器可以配置為在溢出后回卷(FRR),即從0重新開始計數。
自由運行和重新啟動:
GPT可以配置為自由運行模式,即計數器在溢出后繼續計數。也可以配置為重新啟動模式,即在溢出后從預設的初始值重新開始計數。
?計數器時鐘配置圖
Crystal Oscillator (ipg_clk_24M):24MHz的晶體振蕩器時鐘源,它可以輸入到預分頻器24M(Prescaler 24M)。
External Clock (GPT_CLK):外部提供的GPT時鐘信號,它可以直接輸入到多路復用器,也可以通過預分頻器24M后輸入。
Peripheral Clock (ipg_clk):系統周鐘,通常是一個較低頻率的時鐘信號,它可以直接輸入到多路復用器。
Low Frequency Reference Clock (ipg_clk_32k):32kHz的低頻參考時鐘,它可以直接輸入到多路復用器,適用于低功耗模式。
High Frequency Reference Clock (ipg_clk_highfreq):高頻參考時鐘,它可以直接輸入到多路復用器,適用于需要高精度計時的應用。
Prescaler 24M:預分頻器24M是一個可編程的分頻器,它接收24MHz的晶體振蕩器時鐘信號,并將其分頻后輸出。
Sync:同步器(Sync)用于同步來自不同時鐘源的信號,確保時鐘信號的穩定性和一致性。
To Prescaler:多路復用器的輸出可以被選擇性地路由到預分頻器,以進一步降低時鐘頻率,適應定時器計數的需求。
Clock off:允許關閉時鐘信號,用于省電或在不需要定時器工作時關閉時鐘。
?I.MX6ULL GPT?特性
? One 32-bit up-counter with clock source selection, including external clock.? Two input capture channels with a programmable trigger edge.? Three output compare channels with a programmable output mode. A "forcedcompare" feature is also available.? Can be programmed to be active in low power and debug modes.? Interrupt generation at capture, compare, and rollover events.? Restart or free-run modes for counter operations.
- 一個帶有時鐘源選擇的32位向上計數器,包括外部時鐘。
- 兩個輸入捕獲通道,具有可編程的觸發邊緣。
- 三個輸出比較通道,具有可編程的輸出模式。還提供“強制比較”功能。
- 可編程在低功耗模式和調試模式下保持活動狀態。
- 在捕獲、比較和回卷事件時生成中斷。
- 計數器操作的重啟或自由運行模式。
預分頻器值變更時序圖
The clock input source is configured using the clock source field (CLKSRC, in the
GPT_CR control register). The clock input to the prescaler can be disabled by
programming the CLKSRC bits (of the GPT_CR control register) to 000. The CLKSRC
field value should be changed only after disabling the GPT (by setting the EN bit in the GPT_CR to 0).The PRESCALER field selects the divide ratio of the input clock that drives the main counter. The prescaler can divide the input clock by a value (from 1 to 4096) and can be changed at any time. A change in the value of the PRESCALER field immediately affects the output clock frequency.時鐘輸入源是通過時鐘源字段(CLKSRC,在GPT_CR控制寄存器中)進行配置的。可以通過將GPT_CR控制寄存器中的CLKSRC位編程為000來禁用輸入到預分頻器的時鐘。只有在將GPT_CR中的EN位設置為0禁用GPT后,才應該更改CLKSRC字段的值。
PRESCALER字段選擇驅動主計數器的輸入時鐘的分頻比。預分頻器可以將輸入時鐘分頻,分頻值可以從1到4096,并且可以隨時更改。對PRESCALER字段值的更改會立即影響輸出時鐘頻率。
?
在通用定時器(GPT)中如何改變預分頻器的值以及這種改變如何影響時鐘信號:
鐘信號(Clk):圖中最上方的波形代表輸入到預分頻器的原始時鐘信號,通常是一個高頻的方波信號。
預分頻器值(Prescaler Value):中間的水平線代表預分頻器的值。在圖中,預分頻器值從0x004變為0x002。這個值決定了輸入時鐘信號被分頻的程度。
預分頻后的時鐘信號(Prescaled Clk):
圖中最下方的波形代表經過預分頻器處理后的時鐘信號。這個信號的頻率是原始時鐘信號頻率除以預分頻器的值。
預分頻器值的改變:
在圖中,預分頻器的值在某個時刻從0x004改變為0x002。這個改變通過一個斜線箭頭表示,箭頭指向預分頻器值從0x004到0x002的變化。
即時生效:
一旦預分頻器的值被改變,預分頻后的時鐘信號(Prescaled Clk)會立即反映出這種變化。在圖中,這表現為時鐘信號的周期在預分頻器值改變后變得更短,因為分頻值減小了。
時序關系:
圖中展示了預分頻器值改變與時鐘信號之間的時序關系。可以看到,預分頻器值的改變是在時鐘信號的上升沿或下降沿進行的,這確保了改變的同步性。
通用定時器(GPT)工作模式(Operating Modes)
定時器可以執行的基本功能和配置。在工作模式下,GPT可以被設置為不同的時鐘源,并且可以通過預分頻器來調整計數速率。此外,還可以設置定時器的中斷生成,以及在捕獲、比較和回卷事件時的行為。GPT計數器可以被編程為在兩種模式下工作:重啟模式或自由運行模式
重啟模式(Restart Mode):
在重啟模式下(可通過GPT控制寄存器GPT_CR選擇),當計數器達到比較值時,計數器會重置并從0x00000000開始重新計數。此重啟功能僅與比較通道1相關聯。對通道1的比較寄存器進行任何寫操作都將重置GPT計數器。這是為了避免在計數過程中,如果比較值從較高的值更改為較低的值時可能錯過比較事件。
自由運行模式(Free-Run Mode):
在自由運行模式下,當所有三個通道的比較事件發生時,計數器不會重置;相反,計數器會繼續計數直到達到0xFFFFFFFF,然后回卷到0x00000000。這種模式允許計數器在達到最大值后繼續運行,而不是在每個比較事件后重置模式適用于需要持續計時或測量的應用場景,其中計數器的值需要保持連續,而不是周期性重置。
通用定時器(GPT)的輸入捕獲?(Input Capture)
GPT定時器的輸入捕獲通道的工作原理和特性:
有兩個輸入捕獲通道,每個輸入捕獲通道都有專用的捕獲引腳、捕獲寄存器和輸入邊緣檢測/選擇邏輯。每個輸入捕獲功能都有一個關聯的狀態標志,并且能夠導致處理器發出中斷服務請求。
當在輸入捕獲引腳上發生選定的邊緣轉換時,GPT_CNT的內容將被捕獲到相應的捕獲寄存器中,并且設置相應的中斷狀態標志。如果在中斷寄存器中設置了相應的使能位,那么在檢測到轉換時可以生成中斷請求。捕獲可以被編程為發生在輸入引腳的上升沿、下降沿、上升沿和下降沿,或者可以禁用捕獲。這些事件與被選擇來運行計數器的時鐘同步。只有那些在先前記錄的轉換之后至少一個時鐘周期(被選擇來運行計數器的時鐘)發生的轉換才能保證觸發捕獲事件。在輸入轉換的鎖定中最多可以有一個時鐘周期的不確定性。輸入捕獲寄存器可以在任何時候讀取,而不會影響它們的值。
?邊緣檢測:
- 上升沿:從低電平到高電平的轉換。
- 下降沿:從高電平到低電平的轉換。
- 雙邊沿:同時檢測上升沿和下降沿。
?輸入捕獲事件的時序圖
時鐘信號(Clk):
圖中最上方的波形代表從CLKSRC位字段設置中選擇的時鐘信號。這個時鐘信號用于驅動GPT計數器。
捕獲通道1的引腳信號(ipp_ind_capin1):
中間的波形代表捕獲通道1的引腳信號。這個信號是從外部輸入到GPT模塊的,用于捕獲事件。
捕獲信號(Sig):
圖中最下方的波形代表模塊感知到的捕獲信號。這個信號是經過GPT模塊處理后的信號,用于觸發捕獲事件。
捕獲事件:
當ipp_ind_capin1信號的邊緣轉換(如上升沿或下降沿)與Sig信號同步時,GPT計數器的當前值將被捕獲到相應的捕獲寄存器中。圖中用箭頭標出了捕獲事件發生的時刻。
同步性:
捕獲事件與選擇運行計數器的時鐘同步。這意味著,只有在先前記錄的轉換之后至少一個時鐘周期發生的轉換才能保證觸發捕獲事件。
不確定性:
在輸入轉換的鎖定中可能存在最多一個時鐘周期的不確定性。這可能是由于信號傳播延遲或模塊處理延遲造成的。
捕獲寄存器:
捕獲到的GPT計數器值將被存儲在捕獲寄存器中,這個值代表了從定時器啟動到捕獲事件發生的時間。
通用定時器(GPT)的輸出比較?(Output Compare )
GPT定時器的輸出比較通道的工作原理和特性:
三個輸出比較通道使用的是與輸入捕獲通道相同的計數器(GPT_CNT)。當輸出比較寄存器中預設的值與GPT_CNT中的值匹配時,將設置一個輸出比較狀態標志,并生成一個中斷(如果中斷寄存器中的相應位已被設置)。因此,輸出比較定時器引腳將被置位、清零、切換、完全不受影響,或者提供一個低電平脈沖,持續時間為一個輸入時鐘周期(受限于引腳上允許的最大頻率),這取決于已編程的模式位。
此外,還有一個“強制比較”功能,允許軟件在需要時生成一個比較事件,而不需要計數器值等于比較值的條件。由于強制比較而采取的行動與輸出比較匹配時相同,除了不會設置狀態標志且不能生成中斷。在向強制比較位寫入后,強制通道會立即采取編程的行動。這些位是自清零的,并且總是讀取為零
輸出比較和中斷時序圖
時鐘信號(Clk):
圖中最上方的波形代表定時器的時鐘信號,用于驅動GPT計數器。
計數器(Counter):
緊隨Clk下方的波形代表GPT計數器的值,它是一個向上計數的32位計數器。計數器的值在每個時鐘周期內遞增。
比較值(Compare Value):
比較值是預設在輸出比較寄存器中的值,當計數器的值與這個值相匹配時,將觸發輸出比較事件。
輸出模式(Output Mode):
輸出模式決定了當計數器值與比較值相匹配時,輸出信號的行為。
圖中顯示了三種不同的輸出模式:
011
:設置(set),輸出信號在比較事件時被設置為高電平。
010
:清除(clear),輸出信號在比較事件時被設置為低電平。
001
:切換(toggle),輸出信號在每個比較事件時翻轉。輸出信號(Output Signal):
輸出信號是根據輸出模式在比較事件發生時改變的信號。
圖中展示了不同輸出模式下輸出信號的變化:
在
011
模式下,輸出信號在計數器值達到比較值時被設置為高電平。在
010
模式下,輸出信號在計數器值達到比較值時產生一個低電平脈沖。在
001
模式下,輸出信號在計數器值達到比較值時翻轉。中斷(Interrupt):
如果中斷使能位被設置,那么在輸出比較事件發生時,可以生成一個中斷請求。圖中沒有明確顯示中斷請求,但它會在輸出比較事件發生時根據配置生成。
低脈沖(low pulse):
在
010
模式下,當計數器值與比較值相匹配時,輸出信號會產生一個短暫的低電平脈沖。
?I.MX6ULL 通用定時器(GPT)的基本編程步驟:
時鐘配置:確保使能GPT模塊的時鐘,設置時鐘控制器模塊(CCM)的相應位。
定時器初始化:重置GPT模塊,將所有寄存器恢復到默認狀態。
時鐘源選擇:配置GPT的時鐘源,選擇合適的時鐘源并設置預分頻器,以得到所需的計數頻率。
計數模式選擇:選擇計數模式,重啟模式(Restart Mode)或自由運行模式(Free-Run Mode)。
輸入捕獲配置:配置輸入捕獲通道,設置觸發邊緣(上升沿、下降沿或雙邊沿),使能輸入捕獲中斷(如果需要)。
輸出比較配置:配置輸出比較寄存器,配置輸出比較通道,設置比較值和輸出模式(如切換、清除、設置或脈沖),使能輸出比較中斷(如果需要)。
中斷配置(如果需要):配置和使能GPT的中斷,包括輸入捕獲和輸出比較中斷。在中斷服務程序(ISR)中實現相應的處理邏輯。
計數器啟動:設置GPT控制寄存器中的EN位來啟動定時器,開始計數。
結語:
無論你是初學者還是有經驗的開發者,我希望我的博客能對你的學習之路有所幫助。如果你覺得這篇文章有用,不妨點擊收藏,或者留下你的評論分享你的見解和經驗,也歡迎你對我博客的內容提出建議和問題。每一次的點贊、評論、分享和關注都是對我的最大支持,也是對我持續分享和創作的動力