简述

ARM Cortex-A7的一个定时器,用来完成周期性中断定时
特点:

  1. 时钟源可选的32位向下计数器
  2. 12位的分频值
  3. 当计数值和比较值相等的时候产生中断
  4. 可以即使编程的计数器值
  5. 在低功耗和调试模式下能够编程为活跃状态

原理分析

结构分析

  1. 多路选择器,共有三个时钟源可选择:

    1. ipg_clk:由时钟控制模块CCM提供的Peripheral clock;
    2. ipg_clk_32k:低频率参考时钟,32kHz的参考时钟,来自外部的32kHz晶振;
    3. ipg_clk_highfreq:由时钟控制模块CCM提供的高频率参考时钟。
  2. 12bit的预分频器,对时钟源进行分频,12bit对应的值为04095,也就是可以设置为14096分频。
  3. EPIT内部,三个重要的寄存器(32位):
    1. Counter Register,计数寄存器,EPIT是一个向下计数的定时器,给予它一个初值,便会从这个初始值开始递减,直到为0,Counter Register就保存了当前的计数值。
    2. Load Register为装载寄存器,当EPIT被设置为set-and-forget模式,当计数器递减到0后,EPIT就会读取Load Register保存的值到Counter Register,并且重新开始计数。
    3. Compare Register为比较寄存器,用于和Counter Register中的值进行比较,如果相等的话能产生一个比较事件。
  4. 比较器,比较Compare Register和Counter Register中的值,相等即产生比较事件
  5. 设置外设引脚输出,指定引脚输出信号。
  6. 定时中断。

工作模式

两种工作模式: set-and-forget 和 free-running ,通过EPIT_CR[RLD]能设置

  • 当EPIT_CR寄存器的RLD被置1的时候,EPIT工作在set-and-forget模式,在该模式下,EPIT定时器的计数值从LoadRegister中获取初始值,此时不能直接向CounterRegister中写入数据,当计数器的值递减为0后,将会从LoadRegister中加载数据到计数器,周而复始运行。
  • 当EPIT_CR寄存器的RLD被清0的时候,EPIT工作在free-running模式,当计数器的值到0后,计数器的值会进行翻转变为0xFFFF_FFFF,并重新开始计数,而不是从Load Register中获取数据;

寄存器(部分)

寄存器EPITx_CR,用来配置EPIT

CLKSRC(bit[25:24]):用来设置EPIT的时钟源

- CLKSRC 时钟源
00 关闭时钟源
01 Peripheral 时钟
10 High-frequency
11 Low-frequency
  • PRESCALAR(bit[15:4]):EPIT时钟源的预分频值,12bit,能设置的值为0x0000xFFF,对应分频的值为14096。

  • RLD(bit3):用于设置EPIT的工作模式,该bit为0的时候工作在free-running模式,为1的时候工作在set-and-forget模式。

  • OCIEN(bit2):比较中断使能位,设置为0的时候将禁止比较中断,设置为1的时候将使能比较中断。

  • ENMOD(bit1):用来设置计数器的初始值,设置为0时,计数器的初始值等于上次关闭EPIT定时器中计数器的值,设置为1时,初始值取决于RLD的配置,如果RLD=1时,计数器的值来源于Load Register,如果RLD=0,则计数器的值为0xFFFF_FFFF。

  • EN(bit0):EPIT定时器使能位。0闭,1使能


寄存器EPITx_SR,只有最低位(OCIF(bit0))有效,比较中断标识位,0的时候无比较事件发生,1的时候有比较时间发生。需手动清零。

溢出时间计算

溢出时间 = ((分频值+1)*装载值)/时钟频率

配置流程

  1. 设置时钟来源,通过EPIT_CR寄存器的CLKSRC位选择
  2. 设置定时器的预分频值,通过设置EPITx_CR寄存器中的PRESCALAR,配置EPIT定时器时钟分频值
  3. 设置工作方式,置EPITx_CR寄存器中的RLD
  4. 设置定时器中计数器的初始值来源,通过设置EPITx_CR的ENMOD(bit1),配置计数器的初值来源
  5. 使能比较中断,设置EPITx_CR的OCIEN位,置1
  6. 设置加载值(装载值)和比较值,设置EPITx_LR和EPITx_CMPR寄存器
  7. 中断服务函数
  8. 使能EPIT

实现过程

功能描述

通过EPTI1控制LED的亮灭。

代码编写(部分)

/***************************File name: bsp_epitAuthor: oriVersion: v1.0Description: EPIT驱动文件Others: 无log: 2021/2/2***************************/
#include "bsp_epit.h"
#include "bsp_int.h"
#include "bsp_led.h"/** @description     :EPIT1初始化* @param - frac    :分频* @param - value   :装载值* @return          :0*/
void epit1_init(unsigned int frac, unsigned int value)
{if(frac > 0XFFF)frac = 0XFFF;   /* 这里先设置为最大分频 */EPIT1->CR = 0;      /* 清零CR寄存器,为了方便后续配置 *//* 66MHz,分频值为4,set-and-forget工作模式,值来源load register */EPIT1->CR = (1<<24 | frac << 4 | 1 << 3 | 1 << 2 | 1 << 1);EPIT1->LR = value;  /* 加载寄存器值 */EPIT1->CMPR = 0;    /* 比较寄存器值 *//* 使能中断 */GIC_EnableIRQ(EPIT1_IRQn); /* 注册中断服务函数 */system_register_irqhandler(EPIT1_IRQn, (system_irq_handler_t)epit1_irqhandler, NULL); /* 使能EPIT1 */ EPIT1->CR |= 1<<0;  }/** @description          : EPIT中断处理函数* @param               : 无* @return               : 无*/
void epit1_irqhandler(void)
{ static unsigned char state = 0;state = !state;if(EPIT1->SR & (1<<0))           /* 判断比较事件发生 */{led_switch(LED0, state);     /* 定反转LED */}EPIT1->SR |= 1<<0;               /* 清除中断标志位 */
}
/***************************File name: bsp_epitAuthor: oriVersion: v1.0Description: EPIT驱动头文件Others: 无log: 2021/2/2***************************/
#ifndef _BSP_EPIT_H
#define _BSP_EPIT_H#include"imx6ul.h"void epit1_init(unsigned int frac, unsigned int value);void epit1_irqhandler(void);#endif // !1
/***************************File name: bsp_epitAuthor: oriVersion: v1.0Description: EPIT练习Others: 无log: 2021/2/2***************************/
#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_led.h"
#include "bsp_beep.h"
#include "bsp_key.h"
#include "bsp_int.h"
#include "bsp_exit.h"
#include "bsp_epit.h"/** @description    : main函数* @param       : 无* @return       : 无*/
int main(void)
{int_init();        /* 初始化中断(一定要最先调用!) */imx6u_clkinit();    /* 初始化系统时钟          */clk_enable();     /* 使能所有的时钟          */led_init();           /* 初始化led           */beep_init();      /* 初始化beep          */key_init();           /* 初始化key           */exit_init();      /* 初始化按键中断          *//* 初始化EPIT定时器,1分频,计数值33000000,500ms */epit1_init(0,33000000);while(1)            {   delay(500);}return 0;
}

编译烧录

最后

本文多处参考正点原子的课程和资料(特表感谢),并在此基础上进了扩展和自己的理解,最后自己动手复原例程。

【ARM学习笔记】ARM Cortex -A7 EPIT定时器相关推荐

  1. ARM 学习笔记整理(一)

    ARM 学习笔记整理,主要用于将来的研究开发参考. 一.ARM体系结构的版本 处理器的体系结构就是其使用的指令集,而通常我们说的Soc结构的处理器可以理解为一个实现机器指令集的硬件内核,在这个内核周围 ...

  2. QT学习笔记(七):定时器事件的3种常用使用方式

    QT学习笔记(七):定时器事件的2种常用使用方式 Qt中定时器的使用有2种方法:一种是使用QObject类提供的定时器通过重载 timerEvent 事件处理过程函数,一种就是使用QTimer类. 其 ...

  3. STM32CubeMX学习笔记(24)——通用定时器接口使用(电容按键检测)

    一.电容按键简介 电容器(简称为电容)就是可以容纳电荷的器件,两个金属块中间隔一层绝缘体就可以构成一个最简单的电容.如图 32-1(俯视图),有两个金属片,之间有一个绝缘介质,这样就构成了一个电容.这 ...

  4. STM32学习笔记(10)——高级定时器TIM

    前排提示:本笔记参考了野火PPT的大部分内容.本人初学定时器,倍感冗杂,有错烦请指出,谢谢! STM32学习笔记(10)--高级定时器TIM 一.时钟源 1. 内部时钟源 2. 外部时钟模式 1 (1 ...

  5. ARM学习系列 ---- ARM NEON

    ARM学习系列 ---- ARM NEON 1 NEON概述 1.1 简介 NEON是指适用于Arm Cortex-A系列处理器的一种高级SIMD(单指令多数据)扩展指令集,可执行并行数据处理. 1. ...

  6. ARM学习笔记--LPC1788引脚分析

    http://zgmgypb.blog.163.com/blog/static/962028192012730104640980/ RM学习笔记--LPC1788引脚分析 一.电源分析 要弄清楚单片机 ...

  7. freeRtos学习笔记 (6)软件定时器

    freeRtos学习笔记 freeRtos软件定时器 软件定时器需要注意事项 软件定时器的精度基于时钟节拍,例如系统时钟节拍为10ms, 软件定时器定时时间必须是10ms的整数倍,因此软件定时器一般用 ...

  8. 【ARM学习笔记】ARM汇编指令:B、BL、BX、BLX的区别

    文章目录 1 ARM的跳转指令介绍 2 ARM的4个跳转指令 2.1 B 指令 2.2 BL 指令 2.3 BLX 指令 2.4 BX 指令 3 更多分享 1 ARM的跳转指令介绍 跳转指令用于实现程 ...

  9. 嵌入式Arm学习笔记(3)

    ARM指令集 精简指令集设计理念(The RISC design philosophy) 设计原则(Design rules) 指令"短小精悍" 应用流水线技术设计 大量采用寄存器 ...

最新文章

  1. rudesocket如何使用_[WebSocket入门]手把手搭建WebSocket多人在线聊天室(SpringBoot+WebS...
  2. 友商逼急 雷急跳墙:生死看淡 不服就干
  3. mi2 android 5.0 方法,小米2/2S怎么刷Android5.0 小米2/2S刷Android5.0教程【详解】
  4. matlab signal工具箱,免费试用Signal Processing Toolbox
  5. PP面向订单生产模式探讨
  6. Vue.js学习笔记四
  7. 玩C一定用得到的19款Java开源Web爬虫
  8. [css] 你对伪类了解多少?分为几大类?
  9. 踩坑记录--mybatisplus模糊查询中文时 有数据但 like查不到
  10. 如何写出让人抓狂的代码?
  11. [已送完]赠送Google Wave 邀请码
  12. SAN:存储区域网络及其协议
  13. python 概率分布函数_逆累积分布函数,累积分布函数及python实现
  14. python怎么筛选excel数据_python 利用pandas处理excel数据(获取特定值,排序,筛选)...
  15. 能源物联网及其关键技术
  16. docker笔记(转自:陈沙克日志)
  17. 关于timestamp时间范围
  18. 使用Requests库进行网页爬取
  19. android 跳转oppo应用中心_Android 遍历手机应用,跳转应用市场详情页面
  20. 【Mybatis】一二级缓存的源码研究

热门文章

  1. 【Coding】Latex添加表格注释footnote
  2. iO逆向 触动精灵网络请求
  3. 友达8寸高分辨率工业屏G080UAN02.2-8寸MIPI屏
  4. Nano Measurer 1.2.5 for win 纳米颗粒粒度分析
  5. 腾讯云图 数据源 api
  6. 华夏千秋事,风雨亦为之
  7. windows快捷键失效 - 重启无效 - 插拔键盘解决
  8. 用html和css制作日历,CSS3制作日历
  9. ROS机器人021-机器人命令行发送cmd_vel话题及/cmd_vel geometry_msgs/Twist示例
  10. 算法:十六进制最大数