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

IMX6ULL--EPIT 定时器理论

0.绪论

        上一讲写了EPIT定时器的实验,中间讲到那个中断放入了延时函数,这种办法是不可行的,需要使用定时器去消抖,后面就想先不看教程自己写,发现写不出来,于是回过头来在看一下手册,把EPIT定时器的理论知识在学习一下。这里包含消抖的理论知识。可以直接看正点原子提供的手册,每个人理解不一样,接受程度不一样,我就属于接受比较慢的,完整的资料官网就有,不是他家的板子也可以参考一下。

1.EPIT定时器简介

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

1.时钟源可选的32位向下计数器

2.12位的分频值

3.当计数值和比较直相等的时候产生中断。

EPIT定时器结构图
  1. 多路选择器,有三个时钟源可供选择
  2. 是一个12位的分频器,负责对时钟源进行分频,12位对应的值是0-4095,对应着1-4096分频。
  3. 经过分频的时钟进入到EPIT内部,在EPIT内部有三个重要的寄存器分别是:计数寄存器(EPIT_CNR),加载寄存器(EPIT_LR)和比较寄存器(EPIT_CMPR),都是32位寄存器。EPIT是一个向下计数器,也就是说给他一个初值,他就会从这个初值开始递减,直到减为0,EPIT_CNR(计数寄存器),里面保存的就是当前的计数值。这里就要提及EPIT的工作模式了
    1. set-and-forget模式EPITx_CR(x=1,2下同)寄存器的RLD位,置为1的时候EPIT处于该工作模式下,在此模式下EPIT的计数器从加载寄存器EPITx_LR中获取初始值,不能直接向计数器寄存器写入数据。只要计数器计数到0,就会从加载寄存器EPITx_LR中重新加载数据到计数器中。
    2. free-running模式:EPITx_CR寄存器的RLD位清零的时候EPIT工作在此模式下,当计数器计数到0的时候会重新从0XFFFFFFFF开始计数,并不是从加载寄存器EPITx_LR中获取数据的。
  4. 比较器。
  5. EPIT可以设置引脚输出,如果设置了的话就会通过指定的引脚输出信号。
  6. 产生比较中断,也就是定时中断。

2.EPIT的配置步骤

        这里拿上一讲的定时器代码来讲解一下,重新写一下。

EPITx_CR引脚图

         这一步创建EPIT1的初始化函数,这里需要传递两个参数:分频值和计数值。上面有讲分频值是12位的,最大值是0XFFF,所以我们需要判断输入的分频值是否大于0XFFF以及是否小于0,如果大于0XFFF则将分频值设定为0XFFF,若小于0设定为0,即是1分频,防止原则上的错误。 

2.1.设置EPIT1的时钟源       

时钟选择
EPIT1->CR = 1 << 24;

2.2.设置分频值

EPIT分频值设置

由上图可以 EPITx_CR的pin4~pin15为设置EPIT的分频值,所以将我们输入的分频值左移4位即可。

EPIT1->CR = frec << 4;

2.3.设置工作模式

EPIT工作模式

         这里是设置的set-and-forget的工作模式,所以将bit3置为1,即是:

EPIT1->CR = 1 << 3;

2.4.设置计数器的初始值来源

        这个就是我们传进来的第二个参数了,将计数值赋值给LR寄存器

EPIT1->CR = 1 << 1;

2.5.使能比较中断

EPITx_CR使能比较中断
EPIT1->CR = 1 << 2;

2.6.设置加载值和比较值

EPIT1->LR = value;
EPIT1->CMPR = 0;

2.7.使能EPIT1定时器

EPIT1->CR |= 1 << 0;

http://www.xdnf.cn/news/13392.html

相关文章:

  • 打卡第41天:训练和测试的规范写法
  • C/C++八股文
  • 面试题 - 日志(Java)
  • 网络爬虫学习心得
  • 智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
  • 二维数组判断空的情况
  • uniapp自定义导航栏,采用粘性定位
  • STM32 PID控制
  • python打卡训练营打卡记录day50
  • 林清轩以研发为核,用专利技术筑就高端国货护肤壁垒
  • 函数02 day11
  • AI赋能农业
  • 第十六章 I2C
  • 【PhysUnits】17.6 Unit基础结构(unit.rs)
  • <component :is=““>
  • CentOS7下的ZooKeeper部署
  • 55. Jump Game
  • Redis持久化策略介绍,以及如何选择?
  • 第二十四章 通用同步异步收发器(USART)
  • java异步编程难题拆解
  • Java 中 switch-case 语句的执行逻辑与避坑指南
  • Java判断规则工具类
  • 工作日记总结-transaction is aborted, commands ignored until end of transaction block
  • [软件测试]:什么是自动化测试?selenium+webdriver-manager的安装,实现你的第一个脚本
  • Kotlin基础语法二
  • 大数据学习(136)-数据埋点
  • 玄机 日志分析-Tomcat日志分析 WriteUp
  • G-Star公益行 | 公益组织入门开源技术,六月北京点燃改变的星火
  • 【MySQL数据库】InnoDB存储引擎:事务原理redolog、undolog与版本控制MVCC
  • QuecPython 文件系统操作