天天看點

Linux之ARM (I.MX6ULL)EPIT定時器實驗1.EPIT 定時器簡介

Linux之ARM (I.MX6ULL)EPIT定時器實驗

  • 1.EPIT 定時器簡介
    • 1.1步驟如下:

定時器是最常用的外設,常常需要使用定時器來完成精準的定時功能, I.MX6U 提供了多種硬體定時器,有些定時器功能非常強大。在定時器中斷裡面我們可以做其它的處理,比如翻轉 LED 燈。

1.EPIT 定時器簡介

EPIT 的全稱是: Enhanced Periodic Interrupt Timer,直譯過來就是增強的周期中斷定時器,它主要是完成周期性中斷定時的。學過 STM32 的話應該知道, STM32 裡面的定時器還有很多其它的功能,比如輸入捕獲、 PWM 輸出等等。但是 I.MX6U 的 EPIT 定時器隻是完成周期性中斷定時的,僅此一項功能!至于輸入捕獲、 PWM 輸出等這些功能, I.MX6U 由其它的外設來完成。

EPIT 是一個 32 位定時器,在處理器幾乎不用介入的情況下提供精準的定時中斷,軟體使能以後 EPIT 就會開始運作, EPIT 定時器有如下特點:

①、時鐘源可選的 32 位向下計數器。

②、 12 位的分頻值。

③、當計數值和比較值相等的時候産生中斷。

EPIT 定時器結構如圖所示:

Linux之ARM (I.MX6ULL)EPIT定時器實驗1.EPIT 定時器簡介

上面的部分的功能如下:

①、這是個多路選擇器,用來選擇 EPIT 定時器的時鐘源, EPIT 共有 3 個時鐘源可選擇,ipg_clk、 ipg_clk_32k 和 ipg_clk_highfreq。

②、這是一個 12 位的分頻器,負責對時鐘源進行分頻, 12 位對應的值是0~ 4095,對應着1~4096 分頻。

③、經過分頻的時鐘進入到 EPIT 内部,在 EPIT 内部有三個重要的寄存器:計數寄存器(EPIT_CNR)、加載寄存器(EPIT_LR)和比較寄存器(EPIT_CMPR),這三個寄存器都是 32 位的。EPIT 是一個向下計數器,也就是說給它一個初值,它就會從這個給定的初值開始遞減,直到減為 0,計數寄存器裡面儲存的就是目前的計數值。如果 EPIT 工作在 set-and-forget 模式下,當計數寄存器裡面的值減少到 0, EPIT 就會重新從加載寄存器讀取數值到計數寄存器裡面,重新開始向下計數。比較寄存器裡面儲存的數值用于和計數寄存器裡面的計數值比較,如果相等的話就會産生一個比較事件。

④、比較器。

⑤、 EPIT 可以設定引腳輸出,如果設定了的話就會通過指定的引腳輸出信号。

⑥、産生比較中斷,也就是定時中斷。

EPIT 定時器有兩種工作模式: set-and-forget 和 free-running,這兩個工作模式的差別如下:

set-and-forget 模式: EPITx_CR(x=1, 2)寄存器的 RLD 位置 1 的時候 EPIT 工作在此模式下,在此模式下 EPIT 的計數器從加載寄存器 EPITx_LR 中擷取初始值,不能直接向計數器寄存器寫入資料。不管什麼時候,隻要計數器計數到 0,那麼就會從加載寄存器 EPITx_LR 中重新加載資料到計數器中,周而複始。

free-running 模式: EPITx_CR 寄存器的 RLD 位清零的時候 EPIT 工作在此模式下,當計數器計數到0以後會重新從0XFFFFFFFF開始計數,并不是從加載寄存器EPITx_LR中擷取資料。

接下來看一下 EPIT 重要的幾個寄存器,第一個就是 EPIT 的配置寄存器 EPITx_CR,此寄存器的結構如圖所示

Linux之ARM (I.MX6ULL)EPIT定時器實驗1.EPIT 定時器簡介

寄存器 EPITx_CR 我們用到的重要位如下:

描述
CLKSRC(bit25:24) EPIT 時鐘源選擇位,為 0 的時候關閉時鐘源, 1 的時候選擇選擇Peripheral 時鐘(ipg_clk),為 2 的時候選擇 High-frequency 參考時鐘(ipg_clk_highfreq),為 3 的時候選擇 Low-frequency 參考時鐘(ipg_clk_32k)。我們設定為 1,也就是選擇 ipg_clk作為 EPIT 的時鐘源, ipg_clk=66MHz。
PRESCALAR(bit15:4) EPIT 時鐘源分頻值,可設定範圍 0~4095,分别對應 1~4096 分頻。
RLD(bit3) EPIT 工作模式,為 0 的時候工作在 free-running 模式,為 1 的時候工作在 setand-forget 模式。我們此次設定為 1,也就是工作在 set-and-forget 模式。
OCIEN(bit2) 比較中斷使能位,為 0 的時候關閉比較中斷,為 1 的時候使能比較中斷,本次試驗要使能比較中斷
ENMOD(bit1) 設定計數器初始值,為 0 時計數器初始值等于上次關閉 EPIT 定時器以後計數器裡面的值,為 1 的時候來源于加載寄存器。
EN(bit0) EPIT 使能位,為 0 的時候關閉 EPIT,為 1 的時候使能 EPIT。

寄存器 EPITx_SR 結構體如圖所示:

Linux之ARM (I.MX6ULL)EPIT定時器實驗1.EPIT 定時器簡介

寄存器 EPITx_SR 隻有一個位有效,那就是 OCIF(bit0),這個位是比較中斷标志位,為 0 的時候表示沒有比較事件發生,為 1 的時候表示有比較事件發生。當比較中斷發生以後需要手動清除此位,此位是寫 1 清零的。

寄存器 EPITx_LR、 EPITx_CMPR 和 EPITx_CNR 分别為加載寄存器、比較寄存器和計數寄存器,這三個寄存器都是用來存放資料的,

寄存器EPITx_LR 結構體如圖所示:

Linux之ARM (I.MX6ULL)EPIT定時器實驗1.EPIT 定時器簡介

寄存器 EPITx_CMPR結構如圖所示:

Linux之ARM (I.MX6ULL)EPIT定時器實驗1.EPIT 定時器簡介

寄存器 EPITx_CNR結構如圖所示:

Linux之ARM (I.MX6ULL)EPIT定時器實驗1.EPIT 定時器簡介

1.1步驟如下:

1、設定 EPIT1 的時鐘源設定寄存器 EPIT1_CR 寄存器的 CLKSRC(bit25:24)位,選擇 EPIT1 的時鐘源。

2、設定分頻值設定寄存器 EPIT1_CR 寄存器的 PRESCALAR(bit15:4)位,設定分頻值。

3、設定工作模式設定寄存器 EPIT1_CR 的 RLD(bit3)位,設定 EPTI1 的工作模式。

4、設定計數器的初始值來源設定寄存器 EPIT1_CR 的 ENMOD(bit1)位, 設定計數器的初始值來源。

5、 使能比較中斷我們要使用到比較中斷,是以需要設定寄存器 EPIT1_CR 的 OCIEN(bit2)位,使能比較中斷。

6、設定加載值和比較值設定寄存器 EPIT1_LR 中的加載值和寄存器 EPIT1_CMPR 中的比較值,通過這兩個寄存器就可以決定定時器的中斷周期。

7、 EPIT1 中斷設定和中斷服務函數編寫使能 GIC 中對應的 EPIT1 中斷,注冊中斷服務函數,如果需要的話還可以設定中斷優先級。最後編寫中斷服務函數。

8、使能 EPIT1 定時器配置好 EPIT1 以後就可以使能 EPIT1 了,通過寄存器 EPIT1_CR 的 EN(bit0)位來設定。通過以上幾步我們就配置好 EPIT 了,通過 EPIT 的比較中斷來實作 LED0 的翻轉。

繼續閱讀