一 簡介
EPIT定時(shí)器是一種增強(qiáng)的周期中斷定時(shí)器,完成周期性中斷定時(shí)的功能。
具有以下特點(diǎn)
- ?EPIT定時(shí)器是一個(gè)32位的定時(shí)器?
- 時(shí)鐘源可選的向下計(jì)數(shù)器??EPIT 共有 3 個(gè)時(shí)鐘源可選擇,ipg_clk、ipg_clk_32k 和 ipg_clk_highfreq
- ?當(dāng)計(jì)數(shù)值和比較值相等的時(shí)候產(chǎn)生中斷
- ?12 位分頻器 對應(yīng)的值是 0~4095,對應(yīng)1~4096 分頻
- ?EPIT定時(shí)器在處理器幾乎不用介入的情況下提供精準(zhǔn)的定時(shí)中斷,時(shí)序分辨率高達(dá)125fs。它可以應(yīng)用于高速數(shù)據(jù)采集、超聲波測距、雷達(dá)等領(lǐng)域。
- 可以設(shè)置引腳輸出,如果設(shè)置了的話就會(huì)通過指定的引腳輸出信號。
二 結(jié)構(gòu)原理圖
2.1 工作原理
圖中 ?EPIT 內(nèi)部有三個(gè)重要的寄存器:
計(jì)數(shù)寄存器(EPIT_CNR)、加載寄存器(EPIT_LR)和比較寄存器(EPIT_CMPR),
????????EPIT 是一個(gè)向下計(jì)數(shù)器,也就是說給它一個(gè)初值,開始遞減,直到減 為 0,EPIT_CNR?里面保存的就是當(dāng)前的計(jì)數(shù)值。如果 EPIT 工作在 set-and-forget 模式下,當(dāng)計(jì)數(shù)寄存器里面的值減少到 0,EPIT 就會(huì)重新從EPIT_LR讀取數(shù)值到計(jì)數(shù)寄存器里面,重新開 始向下計(jì)數(shù)。比較寄存器 EPIT_CMPR?里面保存的數(shù)值用于和計(jì)數(shù)寄存器里面的計(jì)數(shù)值比較,如果相等的話 就會(huì)產(chǎn)生一個(gè)比較事件。
2.2 工作模式
? ? ? ?兩種工作模式:set-and-forget 和 free-running,
這兩個(gè)工作模式的區(qū)別如下: set-and-forget 模式:EPITx_CR(x=1,2)寄存器的 RLD 位置 1 的時(shí)候 EPIT 工作在此模式 下,在此模式下 EPIT 的計(jì)數(shù)器從加載寄存器 EPITx_LR 中獲取初始值,不能直接向計(jì)數(shù)器寄存 器寫入數(shù)據(jù)。不管什么時(shí)候,只要計(jì)數(shù)器計(jì)數(shù)到 0,那么就會(huì)從加載寄存器 EPITx_LR 中重新 加載數(shù)據(jù)到計(jì)數(shù)器中,周而復(fù)始。 free-running 模式:EPITx_CR 寄存器的 RLD 位清零的時(shí)候 EPIT 工作在此模式下,當(dāng)計(jì)數(shù) 器計(jì)數(shù)到0以后會(huì)重新從0XFFFFFFFF開始計(jì)數(shù),并不是從加載寄存器EPITx_LR中獲取數(shù)據(jù)。
2.3 23.6.1 Control register (EPITx_CR)
2.3.1 EPITx_CR field descriptions? 位字段描述
?
寄存器 EPITx_CR 重要位如下:
CLKSRC(bit25:24): EPIT 時(shí)鐘源選擇位,
為 0 的時(shí)候關(guān)閉時(shí)鐘源,
為1 的時(shí)候選擇選擇Peripheral 時(shí)鐘(ipg_clk),
為 2 的時(shí)候選擇 High-frequency 參考時(shí)鐘(ipg_clk_highfreq),
為 3 的時(shí)候選擇 Low-frequency 參考時(shí)鐘(ipg_clk_32k)。
一般選擇 ipg_clk=66MHz。
PRESCALAR(bit15:4): EPIT 時(shí)鐘源分頻值,可設(shè)置范圍 0~ 4095,分別對應(yīng) 1~ 4096 分頻。
RLD(bit3): EPIT 工作模式,
為 0 的時(shí)候工作在 free-running 模式,
為 1 的時(shí)候工作在 set-and-forget 模式。
一般工作在 set-and-forget 模式。
OCIEN(bit2):比較中斷使能位,
為 0 的時(shí)候關(guān)閉比較中斷,
為 1 的時(shí)候使能比較中斷,
本章試驗(yàn)要使能比較中斷。
ENMOD(bit1):設(shè)置計(jì)數(shù)器初始值,
為 0 時(shí)計(jì)數(shù)器初始值等于上次關(guān)閉 EPIT 定時(shí)器以后計(jì)數(shù)器里面的值,
為 1 的時(shí)候來源于加載寄存器。
EN(bit0): EPIT 使能位,
為 0 的時(shí)候關(guān)閉 EPIT,
為 1 的時(shí)候使能 EPIT。0
2.4??EPIT_SR寄存器
EPIT_SR寄存器,只有bit0有效,表示中斷狀態(tài),寫1清零。當(dāng)OCIF位為1的時(shí)候表示中斷發(fā)生,為0的時(shí)候表示中斷未發(fā)生。我們處理完定時(shí)器中斷以后一定要清除中斷標(biāo)志位。
2.5??EPIT_LR 寄存器
EPIT_LR寄存器設(shè)置計(jì)數(shù)器的加載值。計(jì)數(shù)器每次計(jì)時(shí)到0以后就會(huì)讀取LR寄存器的值重新開始計(jì)時(shí)。
2.6??EPIT_CMPR?寄存器
CMPR比較計(jì)數(shù)器,當(dāng)計(jì)數(shù)器的值和CMPR相等以后就會(huì)產(chǎn)生比較中斷。無需設(shè)置
3? 使用實(shí)驗(yàn)? ?
通過?EPTI1 的中斷來控制 LED0 的亮滅 500ms一次中斷,
3.1 EPIT 的配置步驟
如下:
- 1、設(shè)置 EPIT1 的時(shí)鐘源
- 設(shè)置寄存器 EPIT1_CR 寄存器的 CLKSRC(bit25:24)位,選擇 EPIT1 的時(shí)鐘源。
- 2、設(shè)置分頻值
- 設(shè)置寄存器 EPIT1_CR 寄存器的 PRESCALAR(bit15:4)位,設(shè)置分頻值。
- 3、設(shè)置工作模式
- 設(shè)置寄存器 EPIT1_CR 的 RLD(bit3)位,設(shè)置 EPTI1 的工作模式。
- 4、設(shè)置計(jì)數(shù)器的初始值來源
- 設(shè)置寄存器 EPIT1_CR 的 ENMOD(bit1)位, 設(shè)置計(jì)數(shù)器的初始值來源。
- 5、 使能比較中斷
- 我們要使用到比較中斷,因此需要設(shè)置寄存器 EPIT1_CR 的 OCIEN(bit2)位,使能比較中斷。
- 6、設(shè)置加載值和比較值
- 設(shè)置寄存器 EPIT1_LR 中的加載值和寄存器 EPIT1_CMPR 中的比較值,通過這兩個(gè)寄存器
- 就可以決定定時(shí)器的中斷周期。
- 7、 EPIT1 中斷設(shè)置和中斷服務(wù)函數(shù)編寫
- 使能 GIC 中對應(yīng)的 EPIT1 中斷,注冊中斷服務(wù)函數(shù),如果需要的話還可以設(shè)置中斷優(yōu)先級。最后編寫中斷服務(wù)函數(shù)。
- 8、使能 EPIT1 定時(shí)器
- 配置好 EPIT1 以后就可以使能 EPIT1 了,通過寄存器 EPIT1_CR 的 EN(bit0)位來設(shè)置。
驅(qū)動(dòng)編寫
- ?配置EPIT1
- ?使能對應(yīng)中斷
- 注冊中斷 服務(wù)函數(shù)
- 使能EPIT1
EPIT1->CR = (1<<24 | frac << 4 | 1<<3 | 1<<2 | 1<<1); 一次配置完EPIT1_CR寄存器
/***************************************************************
Copyright ? zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名 : bsp_epittimer.c
作者 : 左忠凱
版本 : V1.0
描述 : EPIT定時(shí)器驅(qū)動(dòng)文件。
其他 : 配置EPIT定時(shí)器,實(shí)現(xiàn)EPIT定時(shí)器中斷處理函數(shù)
論壇 : www.wtmembed.com
日志 : 初版V1.0 2019/1/5 左忠凱創(chuàng)建
***************************************************************/
#include "bsp_epittimer.h"
#include "bsp_int.h"
#include "bsp_led.h"
/*
* @description : 初始化EPIT定時(shí)器.
* EPIT定時(shí)器是32位向下計(jì)數(shù)器,時(shí)鐘源使用ipg=66Mhz
* @param - frac : 分頻值,范圍為0~4095,分別對應(yīng)1~4096分頻。
* @param - value : 倒計(jì)數(shù)值。
* @return : 無
*/
void epit1_init(unsigned int frac, unsigned int value)
{
if(frac > 0XFFF)
frac = 0XFFF;
EPIT1->CR = 0; /* 先清零CR寄存器 */
/*
* CR寄存器:
* bit25:24 01 時(shí)鐘源選擇Peripheral clock=66MHz
* bit15:4 frac 分頻值
* bit3: 1 當(dāng)計(jì)數(shù)器到0的話從LR重新加載數(shù)值
* bit2: 1 比較中斷使能
* bit1: 1 初始計(jì)數(shù)值來源于LR寄存器值
* bit0: 0 先關(guān)閉EPIT1
*/
EPIT1->CR = (1<<24 | frac << 4 | 1<<3 | 1<<2 | 1<<1);
EPIT1->LR = value; /* 倒計(jì)數(shù)值 */
EPIT1->CMPR = 0; /* 比較寄存器,當(dāng)計(jì)數(shù)器值和此寄存器值相等的話就會(huì)產(chǎn)生中斷 */
/* 使能GIC中對應(yīng)的中斷 */
GIC_EnableIRQ(EPIT1_IRQn);
/* 注冊中斷服務(wù)函數(shù) */
system_register_irqhandler(EPIT1_IRQn, (system_irq_handler_t)epit1_irqhandler, NULL);
EPIT1->CR |= 1<<0; /* 使能EPIT1 */
}
/*
* @description : EPIT中斷處理函數(shù)
* @param : 無
* @return : 無
*/
void epit1_irqhandler(void)
{
static unsigned char state = 0;
state = !state;
if(EPIT1->SR & (1<<0)) /* 判斷比較事件發(fā)生 */
{
led_switch(LED0, state); /* 定時(shí)器周期到,反轉(zhuǎn)LED */
}
EPIT1->SR |= 1<<0; /* 清除中斷標(biāo)志位 */
}
3.2 分頻計(jì)算方法
?bit25:24 01 時(shí)鐘源選擇Peripheral clock=66MHz 設(shè)置分頻值1 則計(jì)時(shí)計(jì)數(shù)器為? 66*1000*1000/1*0.5 = 33000 000文章來源:http://www.zghlxwxcb.cn/news/detail-474990.html
epit1_init(0, 66000000/2); /* 初始化EPIT1定時(shí)器,1分頻
* 計(jì)數(shù)值為:66000000/2,也就是
* 定時(shí)周期為500ms。
*/
? ?文章來源地址http://www.zghlxwxcb.cn/news/detail-474990.html
到了這里,關(guān)于I.MX6ull EPIT定時(shí)器的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!