购物网站可行性分析报告,ps做网页效果图,设计公司名字logo,整体软装设计公司11. EPIC定时器 EPIT定时器简介EPIT定时器结构分析EPIT 定时器相关寄存器EPITx_CREPITx_SREPITx_LR 加载寄存器EPITx_CMPR 比较寄存器EPITx_CNR 计数寄存器 EPIT 配置步骤 例程代码编写bsp_epittimer.hbsp_epittimer.cmain.c EPIT定时器简介
EPIT定时器是增强的周期中断定时器… 11. EPIC定时器 EPIT定时器简介EPIT定时器结构分析EPIT 定时器相关寄存器EPITx_CREPITx_SREPITx_LR 加载寄存器EPITx_CMPR 比较寄存器EPITx_CNR 计数寄存器 EPIT 配置步骤 例程代码编写bsp_epittimer.hbsp_epittimer.cmain.c EPIT定时器简介
EPIT定时器是增强的周期中断定时器主要是完成周期性中断定时。EPIT是一个 32 位定时器在处理器几乎不用介入的情况下提供精准的定时中断软件使能后EPIT就会开始运行。EPIT有以下特点
时钟源可选的 32 位向下计数器12 位的分频值当计数值和比较值相等的时候产生中断
EPIT定时器结构分析 这是一个多路选择器用来选择 EPIT 定时器的时钟源这是一个 12 位的分频器负责对时钟源进行分频12 位对应的值是 0 ~ 4095对应 1 ~ 4096分频经过分频的时钟进入到 EPIT 内部在内部有 3 个重要的寄存器计数寄存器、加载寄存器和比较寄存器。这 3 个寄存器都是 32 位的。EPIT 计数器是一个向下的计数器也就是说给它一个初值它就会从这个初值开始递减直到减为 0计数寄存器保存的就是当前的计数器。如果EPIT工作在 set-and-forget 模式下当计数寄存器里面的值减到0EPIT 就会重新从加载寄存器读取数值到计数寄存器里面重新开始向下计数。比较寄存器里保存的数值用于和计数寄存器的计数值比较如果相等就会产生一个比较事件。比较器EPIT 可以设置引脚输出如果设置了的话就会通过指定的引脚输出信号产生比较中断也就是定时中断EPIT 定时器有两种工作模式set-and-forget 和 free-running set-and-forget 模式 EPITx_CR(x1,2)寄存器的 RLD 位置为 1 的时候 EPIT 工作在此模式下在此模式下 EPIT 的计数器从加载寄存器 EPITx_LR 中获取初始值而不能直接向计数器寄存器写入数据。不管什么时候只要计数器计数到 0那么就会从加载寄存器 EPITx_LR 中重新加载数据到计数器中。 free-running 模式 EPITx_CR 寄存器的RLD 位清零的时候 EPIT 工作在此模式下当计数器计数到 0 后会重新从 0xFFFFFFFF 开始计数并不是从加载计数器中获取数据。
EPIT 定时器相关寄存器
EPITx_CR CLKSRC(bit25:24) EPIT 时钟源选择位为 0 的时候关闭时钟源为 1 的时候选择ipg_clk 时钟为 2 的时候选择 ipg_clk_highfreq为 3 的时候选择 ipg_clk_32k。本例程中选择ipg_clk 66MHzPRESCALAR(bit15:4) 时钟源分频值可设置范围0 ~ 4095对应1 ~ 4096 分频RLD(bit3) EPIT 工作模式为 0 的时候工作在 free-running 模式为 1 的时候工作在 set-and-forget 模式本例程为 1OCIEN(bit2) 比较中断使能位为 0 的时候关闭比较中断为 1 的时候使能比较中断这里我们要使能比较中断ENMOD(bit1) 设置计数器初始值为 0 的时候初始值等于上次关闭 EPIT 定时器以后计数器里面的值为 1 的时候来源于加载寄存器或者0xFFFFFFFF由工作模式决定EN(bit0) EPIT 使能位为 0 的时候关闭 EPIT为 1 的时候使能 EPIT
EPITx_SR OCIF 比较中断标志位为 0 的时候表示没有比较事件发生为 1 的时候表示有比较事件发生。当比较事件发生以后需要手动清除此位此位是写1清零
EPITx_LR 加载寄存器
用于保存计数器的当前值以供下一次计数使用。当计数器每次计时达到 0 以后会重新加载此寄存器中的值并且计数器重新开始计数
EPITx_CMPR 比较寄存器
当计数器的值和 CMPR 寄存器的值相等的时候就会产生中断
EPITx_CNR 计数寄存器
通入时钟每一个时钟周期它的值就会减 1
EPIT 配置步骤
设置 EPIT1 的时钟源 设置寄存器 EPIT1_CR 寄存器的 CLKSRC(bit25:24) 位设置分频值 设置寄存器 EPIT1_CR 寄存器的 PRESCALAR(bit 5:4) 位设置工作模式 设置寄存器 EPIT1_CR 寄存器的 RLD(bit3) 位设置计数器的初始值来源 设置寄存器 EPIT1_CR 寄存器的 ENMOD(bit1) 位使能比较中断 设置寄存器 EPIT1_CR 寄存器的 OCIEN(bit2) 位设置加载值和比较值 设置 EPIT1_LR 寄存器的加载值和 EPIT1_CMPR 比较值EPIT1 中断设置和中断服务函数编写 使能GIC 中对应的 EPIT1 中断注册中断服务函数还可以设置中断优先级最后编写中断服务函数使能 EPIT1 定时器 通过寄存器 EPIT1_CR 的 EN(bit0) 位来设置
例程代码编写
bsp_epittimer.h
#pragma once
#include imx6ul.h
void epit1_init(unsigned int frac, unsigned int value);
void epit_irqhandler();bsp_epittimer.c
#include bsp_epittimer.h
#include bsp_int.h
#include bsp_led.hvoid epit1_init(unsigned int frac, unsigned int value)
{if(frac 0xFFF)frac 0xFFF;EPIT1-CR 0; // 先清零 CR 寄存器// 先将 EPIT 配置好之后再使能// CR 寄存器24-25位配置时钟源选择Peripheral clock664-15位配置frac分频值// 3位当计数器到0的话从LR重新加载数值也就是工作在set-and-forger 模式// 2位比较中断使能1位设置计数器初始值来自LR 寄存器0位先关闭EPIT1EPIT1-CR (124|frac4|13|12|11);EPIT1-LR value;EPIT1-CMPR 0;// 使能 GIC 中对应的中断GIC_EnableIRQ(EPIT1_IRQn);// 注册中断服务函数system_register_irqhandler(EPIT1_IRQn, (system_irq_handler_t)epit1_irqhandler, NULL);EPIT1-CR | 10; // 使能EPIT1
}
void epit1_irqhandler()
{static unsigned char state 0;state !state;if(EPIT1-SR (10)) // 判断比较事件发生{led_switch(LED0, state); // 定时器周期到反转LED}EPIT1-SR | 10; // 清除中断标志位
}分频值和 value 就可以决定中断频率公式为EPIT 溢出时间((分频值1)*value)/输入时钟频率
main.c
int main()
{int_init(); // 初始化中断imx6u_clkinit(); // 初始化系统时钟clk_enable(); // 使能所有时钟led_init(); // 初始化LEDbeep_init(); // 初始化beepkey_init();epit1_init(0, 66000000/2); // 初始化EPIT1定时器1分频计数器值为66000000/2 也就是500mswhile(1){delay(500);}return 0;
}