当前位置: 首页 > news >正文

11. EPIC定时器

11. EPIC定时器

  • EPIT定时器简介
    • EPIT定时器结构分析
    • EPIT 定时器相关寄存器
      • EPITx_CR
      • EPITx_SR
      • EPITx_LR 加载寄存器
      • EPITx_CMPR 比较寄存器
      • EPITx_CNR 计数寄存器
    • EPIT 配置步骤
  • 例程代码编写
    • bsp_epittimer.h
    • bsp_epittimer.c
    • main.c

EPIT定时器简介

EPIT定时器是增强的周期中断定时器,主要是完成周期性中断定时。EPIT是一个 32 位定时器,在处理器几乎不用介入的情况下提供精准的定时中断,软件使能后EPIT就会开始运行。EPIT有以下特点:

  • 时钟源可选的 32 位向下计数器
  • 12 位的分频值
  • 当计数值和比较值相等的时候产生中断

EPIT定时器结构分析

在这里插入图片描述

  1. 这是一个多路选择器,用来选择 EPIT 定时器的时钟源
  2. 这是一个 12 位的分频器,负责对时钟源进行分频,12 位对应的值是 0 ~ 4095,对应 1 ~ 4096分频
  3. 经过分频的时钟进入到 EPIT 内部,在内部有 3 个重要的寄存器:计数寄存器、加载寄存器和比较寄存器。这 3 个寄存器都是 32 位的。EPIT 计数器是一个向下的计数器,也就是说给它一个初值,它就会从这个初值开始递减,直到减为 0,计数寄存器保存的就是当前的计数器。如果EPIT工作在 set-and-forget 模式下,当计数寄存器里面的值减到0,EPIT 就会重新从加载寄存器读取数值到计数寄存器里面,重新开始向下计数。比较寄存器里保存的数值用于和计数寄存器的计数值比较,如果相等就会产生一个比较事件。
  4. 比较器
  5. EPIT 可以设置引脚输出,如果设置了的话就会通过指定的引脚输出信号
  6. 产生比较中断,也就是定时中断
  7. 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 开始计数,并不是从加载计数器中获取数据。

EPIT 定时器相关寄存器

EPITx_CR

在这里插入图片描述

  • CLKSRC(bit25:24): EPIT 时钟源选择位,为 0 的时候关闭时钟源,为 1 的时候选择ipg_clk 时钟,为 2 的时候选择 ipg_clk_highfreq,为 3 的时候选择 ipg_clk_32k。本例程中,选择ipg_clk = 66MHz
  • PRESCALAR(bit15:4): 时钟源分频值,可设置范围0 ~ 4095,对应1 ~ 4096 分频
  • RLD(bit3): EPIT 工作模式,为 0 的时候工作在 free-running 模式,为 1 的时候工作在 set-and-forget 模式,本例程为 1
  • OCIEN(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 配置步骤

  1. 设置 EPIT1 的时钟源
    设置寄存器 EPIT1_CR 寄存器的 CLKSRC(bit25:24) 位
  2. 设置分频值
    设置寄存器 EPIT1_CR 寄存器的 PRESCALAR(bit 5:4) 位
  3. 设置工作模式
    设置寄存器 EPIT1_CR 寄存器的 RLD(bit3) 位
  4. 设置计数器的初始值来源
    设置寄存器 EPIT1_CR 寄存器的 ENMOD(bit1) 位
  5. 使能比较中断
    设置寄存器 EPIT1_CR 寄存器的 OCIEN(bit2) 位
  6. 设置加载值和比较值
    设置 EPIT1_LR 寄存器的加载值和 EPIT1_CMPR 比较值
  7. EPIT1 中断设置和中断服务函数编写
    使能GIC 中对应的 EPIT1 中断,注册中断服务函数,还可以设置中断优先级,最后编写中断服务函数
  8. 使能 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.h"void epit1_init(unsigned int frac, unsigned int value)
{if(frac > 0xFFF)frac = 0xFFF;EPIT1->CR = 0; // 先清零 CR 寄存器// 先将 EPIT 配置好之后再使能// CR 寄存器:24-25位配置时钟源,选择Peripheral clock=66;4-15位配置frac分频值// 3位当计数器到0的话从LR重新加载数值,也就是工作在set-and-forger 模式;// 2位比较中断使能;1位设置计数器初始值来自LR 寄存器;0位先关闭EPIT1EPIT1->CR = (1<<24|frac<<4|1<<3|1<<2|1<<1);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 |= 1<<0; // 使能EPIT1
}
void epit1_irqhandler()
{static unsigned char state = 0;state = !state;if(EPIT1->SR & (1<<0)) // 判断比较事件发生{led_switch(LED0, state);	// 定时器周期到,反转LED}EPIT1->SR |= 1<<0;		// 清除中断标志位
}

分频值和 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;
}
http://www.lryc.cn/news/227833.html

相关文章:

  • git-bash配置代理
  • 【ElasticSearch系列-07】ES的开发场景和索引分片的设置及优化
  • JavaWeb Day09 Mybatis-基础操作02-XML映射文件动态SQL
  • CV学习基础
  • 设计模式之禅之设计模式-原型模式
  • Spring的循环依赖问题
  • RT-DETR算法改进:更换损失函数DIoU损失函数,提升RT-DETR检测精度
  • 【ICE】2:基于webrtc的 ice session设计及实现
  • Vue组件传
  • 轻量封装WebGPU渲染系统示例<25>- 颜色附件数据更新替换(源码)
  • c语言练习第11周(1~5)
  • 阿里云国际站服务器如何升级内存容量?
  • 神经网络(第二周)
  • 《网络协议》04. 应用层(DNS DHCP HTTP)
  • springboot自己添加的配置文件没有绿色叶子问题
  • 【Java】定时任务 - Timer/TimerTask 源码原理解析
  • SAP ABAP基础语法-Excel上传(十)
  • 记录一次某某虚拟机的逆向
  • upload-labs关卡7(基于黑名单的空格绕过)通关思路
  • CnosDB 在最近新发布的 2.4.0 版本中增加对时空函数的支持。
  • python实现炒股自动化,个人账户无门槛量化交易的开始
  • 推荐系统笔记--Swing模型的原理
  • 联想小新Pro14默认设置的问题
  • 【洛谷 P5019】[NOIP2018 提高组] 铺设道路 题解(分治算法+双指针)
  • 牛客刷题记录11.12
  • NextJS开发:使用IconPark、Lucide图标库
  • 11.12总结
  • Gogs安装和部署教程-centos上
  • Unity中Shader雾效的实现方法一
  • Mac安装配置Tomcat,以及使用(详解)