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

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-16讲 EPIT定时器

前言:

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

引用:

正点原子IMX6U仓库 (GuangzhouXingyi) - Gitee.com

《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf》

正点原子资料下载中心 — 正点原子资料下载中心 1.0.0 文档

正文:

本文是 “正点原子[第二期]Linux之ARM(MX6U)裸机篇--第16 讲” 的读书笔记。第16讲主要是介绍I.MX6U处理器的EPIT定时器。本节将参考正点原子的视频教程第16讲和配套的正点原子开发指南文档进行学习。

0. 概述

定时器是最常见的外设,常常需要使用定时器来完成精准的定时功能,I.MX6U 提供了多种硬件定时器,有些定时器功能非常强大。本章我们从最基本的EPIT定时器开始,学习如何配置EPIT定时器,使其按照给定的时间,周期性的产生定时器中断,在定时器中断里面我们可以做其他处理,比如翻转LED灯。

1. EPIT定时器原理

EPIT的全称是:Enhanced Period Interrupt Timer,直译过来就是增强的周期中断定时器,它主要是完成周期性中断的。当学过STM32的话应该知道,STM32里面的定时器还有很多其他的功能,比如输入捕获,PWM输出等等。但是I.MX6U的EPIT定时器只是完成周期性中断定时的功能,仅此一项功能。至于输入捕获,PWM输出灯这些功能,I.MX6U由其他的外设来完成。

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

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

EPIT定时器的结构如下图所示:

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

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 开始计数,并不是从加载寄存器EPITx_LR中获取数据。

1.1 EPIT定时器关联的 EPITx_XX 寄存器如下

寄存器描述
EPITx_CRControl Register 控制寄存器
EPITx_SRStatus Regisetr 状态寄存器
EPITx_LRLoad Register 加载寄存器
EPITx_CMPRCompare Register 比较寄存器
EPITx_CNRCounter Register 计数寄存器

1.2 EPIT 比较重要的几个寄存器

 加下来看一下GPIT重要的几个寄存器,第一个就是EPIT的配置寄存器EPITx_CR,此寄存器的结构如下图所示:

EPITx_CR控制寄存器描述
CLKSRC bit[25:24]

EPIT时钟源选择位,为0时关闭时钟源,1时使用ipg_clk时钟源,2时使用ipg_clk_higrfreq时钟源,3时使用 ipg_clk_32k 时钟源。

在本例程中,我们设置为 1,也就是选择 ipg_clk 作为 EPIT 的时钟源, ipg_clk=66MHz。

IOVW bit[17]

EPIT计数值覆盖写使能。为0写EPIT LR加载寄存器不影响计数寄存器里的值,为1写EPIT LR加载寄存器会立即覆盖写计数寄存器。

PRESCALAR bit[15:4]

EPIT时钟源分配值,可设置范围0~4095,分别对应1~4096分频。
RLD bit[3]EPIT工作模式,为0的时候工作在free-running模式,为1的时候工作在set-and-forget模式。本章例程设置为1,也就是工作在set-and-forget模式
OCIEN bit[2]比较中断使能位,为0时关闭比较中断,为1的时候使能比较中断。本章实验使能比较中断。
ENMOD bit[1]设置计数器初始值,为0时计数器初始值等于上次关闭EPIT定时器以后计数器里面的值,为1的时候来源于加载寄存器。
EN bit[0]EPIT使能位,为0的时候关闭EPIT,为1的时候使能EPIT。

寄存器EPITx_SR 寄存器结构如下图所示:

寄存器EPITx_SR寄存器只有一个有效位,那就是 OCIF(Outpurt Comparte Interrupt Flag)bit[0],为0时表示没有比较事件发生,为1的时候表示有比较事件发生。当比较事件发生以后需要手动清除此位,此位是写1清零。

关于 EPIT 的寄存器就介绍到这里,关于这些寄存器详细的描述,请参考《I.MX6ULL 参考手册》第 1174 页的 24.6 小节。

2. EPIT定时器程序编写

本章我们使用EPIT产生功能定时中断,然后在中断服务函数里面翻转LED0,接下来以EPIT1为例,讲解需要哪些步骤来实现这个功能。EPIT1的配置步骤如下

  1. 设置EPIT1的时钟源
    设置EPIT1_CR寄存器的 CLKSEL bit[25:24]位,选择 EPIT1的时钟源。
  2. 设置分频值
    设置EPIT1_CR寄存器的 PRESCALER bit[15:4]位,设置分频值
  3. 设置工作模式
    设置EPIT1_CR寄存器的 RLD bit[3] 位,设置计数器的初始值来源。
  4. 设置计数值的初始值来源
    设置EPIT1_CR寄存器的 ENMODE bit[1] 位,设置计数器的初始值来源。
  5. 使能比较中断
    我们要使用到比较中断,因此需要设置EPIT1_CR寄存器的 OCIEN bit[2] 位,使能比较中断。
  6. 设置加载值和比较值
    设置寄存器EPIT1_LR中国加载值和寄存器EPIT1_CMPR中的比较值,通过这两个寄存器就可以决定计时器的中断周期。
  7. EPIT1中断设置和中断服务函数编写
    使能GIC中对应的EPIT1中断,注册中断服务函数,如果需要的话还可以设置中断优先级。最后编写中断服务函数。
  8. 使能EPIT1定时器
    配置好EPIT1以后就可以使能EPIT1了,通过EPIT1_CR寄存器的 EN bit[0] 位来设置。

通过以上几步我们就配置好EPIT了,通过EPIT的比较中断来实现LED0的翻转。

2.1 本节用到的硬件资源

  •  LED0
  • 定时器EPIT1

本实验通过EPIT的中断来控制LED0的亮灭,LED0的硬件原理前面已经介绍过了。

EIPT定时器输出比较中断的中断ID号为 88=56+32:

2.2 实验程序编写

经过上面的分析EPIT1定时器的使用方法和配置EPIT1寄存器的步骤已经清楚,接下来实现正点原子I.MX6U ALPHA/Mini 开发板上的EPIT定时器驱动程序。

#include "bsp_epittimer.h"
#include "bsp_beep.h"
#include "bsp_led.h"
#include "bsp_int.h"void epittimer_init(int frac, int counterValue)
{if(frac<0 || frac > 0xFFF){return;}/* 首先清零EPIT1->CR 控制寄存器.* I.MX6U手册要求在修改EPIT定时器时钟源之前必须先去使能EPIT定时器 */EPIT1->CR = 0x0;/* CLKSEL bit[25:24] EPIT时钟源选择, 1:ipg_clk */EPIT1->CR |= (1 << 24);/* PRESCALAR bit[15:4] EPIT分频值,0:1分频, 66MHz/1==66MHz */EPIT1->CR |= (frac << 4);/* RLD bit[3] EPIT工作模式,1:set-and-foret 模式 */EPIT1->CR |= (1 << 3);/* OCIEN bit[2] EPIT输出比较中断使能,1:使能比较中断 */EPIT1->CR |= (1 << 2);/* ENMODE bit[1] EPIT使能模式,1:EPIT使能是计数器值从LR寄存器获取 */EPIT1->CR |= (1 << 1);/* EPITx_LR 加载值寄存器设置 */EPIT1->LR = counterValue;/* EPIT_CMPR 比较值寄存器设置 */EPIT1->CMPR = 0;/* 使能GIC IRQn 中断 */GIC_EnableIRQ(EPIT1_IRQn);/* 注册EPIT1比较中断 EPIT1_IRQn 的中断处理函数 */system_irqhandler_register(EPIT1_IRQn, eptitimer_irq_handler, NULL);/* 使能EPIT1 EN bit[0], 1: 是能EPIT */EPIT1->CR |= (1 << 0);
}void eptitimer_irq_handler(IRQn_Type irq, void *userparam)
{static int beep_state = 0;static int led_state = 0;if((EPIT1->SR & (1 << 0))){		/* 判断比较中断事件发生 */beep_state = !beep_state;beep_switch(beep_state);led_state = !led_state;led_switch(LED_0, led_state);}/* 清除EPITx_ISR 中断标志位 */EPIT1->SR |= (1 << 0);
}

3. 编译烧写SD卡验证按键EPIT定时器中断实验结果

译修改主频后源码烧录SD卡验证本节的EPIT定时器实验是否生效。预期烧录SD卡后正点原子I.MX6ULL ALPHA/Mini 开发板会周期性的每500ms鸣叫一次。

我本地验证的结果是EPIT定时器正常工作每500ms触发一次EPIT输出比较事件中断在EPIT定时器中断里翻转一次蜂鸣器的开关,蜂鸣器正常鸣叫。

4. 总结和实验遇到的问题记录

4.1 问题1:EPIT定时器驱动程序烧录SD,开发板上电需要等待大概1分钟之后蜂鸣器才会开始按照500ms的间隔鸣叫。

对照正点原子的示例源码找到了问题原因:

原因:忘记了配置EPITx->CR寄存器的ENMODE bit[1] 位置1,这样CR寄存器 ENMOE=0,EPIT计数寄存器就使用上一次残留的寄存器值开始向下递减,可能是从0XFFFFFFFF 开始递减的所以需要等待大概1分钟才能递减到 0.

 5. 结束

本文至此结束

相关文章:

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-16讲 EPIT定时器

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…...

【只会for循环? 来看下, Nodejs中典型的5种循环方式】

Nodejs中的&#xff0c;除了经典的for循环 , 其实还有几种好用的循环方式&#xff0c; 并有典型的使用场景。下面来一起看下&#x1f447;&#x1f3fb; 5种循环用法 For Loop&#xff1a;这是最常见的循环方式&#xff0c;适用于你知道循环次数的情况。 for (let i 0; i &…...

Java基础(三)- 多线程、网络通信、单元测试、反射、注解、动态代理

多线程基础 线程&#xff1a;一个程序内部的一条执行流程&#xff0c;只有一条执行流程就是单线程 java.lang.Thread代表线程 主线程退出&#xff0c;子线程存在&#xff0c;进程不会退出 可以使用jconsole查看 创建线程 有多个方法可以创建线程 继承Thread类 优点&#x…...

WordPress建站公司模板免费下载

WordPress建站公司 适合提供WordPress建站服务的公司或个体(个人)工作室使用的WordPress建站公司主题模板。 演示 https://www.jianzhanpress.com/?p545 https://www.wpicu.com/jianzhan/ 下载 链接: https://pan.baidu.com/s/11trlwUJq_lW81R_acq4ilA 提取码: r19i...

金融信贷风控基础知识

一、所谓风控(What && Why) 所谓风控&#xff0c;可以拆解从2个方面看&#xff0c;即 风险和控制 风险(what) 风险 这里狭隘的特指互联网产品中存在的风险点&#xff0c;例如 账户风险 垃圾注册账号账号被泄露盗用 交易支付风险 刷单&#xff1a;为提升卖家店铺人气…...

Web Server项目实战4-服务器编程基本框架和2种高效的事件处理模式

服务器编程基本框架 虽然服务器程序种类繁多&#xff0c;但其基本框架都一样&#xff0c;不同之处在于逻辑处理 模块功能I/O处理单元处理客户连接&#xff0c;读写网络数据逻辑单元业务进程或线程网络存储单元数据库、文件或缓存请求队列各单元之间的通信方式 I/O 处理单元是…...

。。。。。

...

RPC原理技术

RPC原理技术 背景介绍起源组件实现工作原理 背景 本文内容大多基于网上其他参考文章及资料整理后所得&#xff0c;并非原创&#xff0c;目的是为了需要时方便查看。 介绍 RPC&#xff0c;Remote Procedure Call&#xff0c;远程过程调用&#xff0c;允许像调用本地方法一样调…...

开源大模型与闭源大模型:技术哲学的较量

目录 前言一、 开源大模型的优势1. 社区支持与合作1.1 全球协作网络1.2 快速迭代与创新1.3 共享最佳实践 2. 透明性与可信赖性2.1 审计与验证2.2 减少偏见与错误2.3 安全性提升 3. 低成本与易访问性3.1 降低研发成本3.2 易于定制化3.3 教育资源丰富 4. 促进标准化5. 推动技术进…...

buuctf的RSA(二)

1.RSA 知道 flag.enc 和 pub.key&#xff0c;典型的加密、解密 将pub,key 改为pub.txt 打开后发现公钥 在RSA公私钥分解 Exponent、Modulus&#xff0c;Rsa公私钥指数、系数(模数)分解--查错网 进行解密 得到e65537 n8693448229604811919066606200349480058890565…...

idm软件是做什么的 IDM是啥软件 idm软件怎么下载 idm软件怎么下载

一、IDM是啥软件 IDM 是由美国 Tonec 公司开发的 Windows 软件&#xff0c;该软件最初于 2005 年发布。IDM全称Internet Download Manager&#xff0c;是一款Windows平台老牌而功能强大的下载加速器&#xff0c;专注于互联网数据下载。这款软件是一款不错的轻量级下载工具&…...

基于springboot+vue的学生考勤管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

Java——内部类

1.什么是内部类 在一个类的里面再定义一个类&#xff0c;新定义的这个类就是内部类 举例&#xff1a;在Outer类的里面定义一个Inter类 class Outer{class Inter{} } 在这里Outer叫外部类&#xff0c;Inter叫内部类 内部类的应用场景 定义一个汽车类&#xff1a; 属性&#xf…...

不用从头训练,通过知识融合创建强大的统一模型

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的开发和训练是一个复杂且成本高昂的过程。数据需求是一个主要问题&#xff0c;因为训练这些模型需要大量的标注数据来保证其准确性和泛化能力&#xff1b;计算资源也是一个…...

僵尸进程、孤儿进程、守护进程

【一】僵尸进程和孤儿进程 【1】引入 我们知道在unix/linux中&#xff0c;正常情况下&#xff0c;子进程是通过父进程创建的&#xff0c;子进程在创建新的进程。 子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它…...

【工程化】CJS 和 ESM

common js require 函数的原理伪代码&#xff1a; function require(path) {if (该模块有缓存) {return 该模块的缓存}function _run(exports, require, module, __filename, __dirname) {// 模块代码}// module.exports 即为模块导出的对象var module { exports: {} };_run…...

记录:mac pro 16-inch,2019安装ubuntu双系统

需要的装备&#xff1a;u盘&#xff0c;扩展坞、有线键鼠、ext4硬盘 目的&#xff1a;编译aosp 11 1、首先是参照如下文章&#xff0c;分配空间&#xff0c;制作启动盘&#xff08;测试ubuntu20.04不行&#xff0c;ubuntu22.04正常&#xff09; https://blog.csdn.net/LBSGKD…...

WordPress主题 7B2 PRO 5.4.2 免授权开心版源码

本资源提供给大家学习及参考研究借鉴美工之用&#xff0c;请勿用于商业和非法用途&#xff0c;无任何技术支持&#xff01; WordPress主题 7B2 PRO 5.4.2 免授权开心版源码 B2 PRO 5.4.2 最新免授权版不再需要改hosts&#xff0c;和正版一样上传安装就可以激活。 直接在Word…...

GPT‑4o普通账户也可以免费用

网址 https://chatgpt.com/ 试了一下&#xff0c;免费的确实显示GPT‑4o的模型&#xff0c;问了一下可以联网&#xff0c;不知道能不能通过插件出图 有兴趣的可以试试...

复制即用!纯htmlcss写的炫酷input输入框

一般我们写css样式都要用样式库&#xff0c;但是嫌麻烦&#xff0c;如果能找到现成的内容复制上去就很香了&#xff0c;下文是笔者觉得好看的纯html&css写的样式&#xff0c;可以直接复制到Vue等内&#xff0c;十分方便。 input组件 1&#xff09; 下面这个很推荐&#…...

前端 CSS 经典:弧形边框选项卡

1. 效果图 2. 开始 准备一个元素&#xff0c;将元素左上角&#xff0c;右上角设为圆角。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, i…...

前端面试题日常练-day21 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末。 AJAX 是什么的缩写&#xff1f; a) Asynchronous JavaScript and XMLb) Asynchronous JavaScript and XHTMLc) Asynchronous Java and XMLd) Asynchronous Java and XHTML使用 AJAX 可以实现以下哪…...

几起 Linux 问题解决分享

&#xff08;首发地址&#xff1a;学习日记 https://www.learndiary.com/2024/05/linux-problems/&#xff09; 朋友们&#xff0c;大家好&#xff01;我是淘宝网学习日记小店专注于Linux服务领域的 learndiary&#xff0c;今天很高兴能与大家分享近期处理的一些Linux故障案例&…...

LeetCode题解:9. 回文数,翻转一半数字,JavaScript,详细注释

原题链接 9. 回文数 解题思路 翻转数字 利用循环&#xff0c;每次将x右移一位将移出的数字存储到reversed的个位中每次存储前&#xff0c;需要将reversed左移一位 判断结果 当原x的长度为偶数&#xff0c;翻转后的结果相等当原x的长度为奇数&#xff0c;reversed一定比翻转后…...

微博:一季度运营利润9.11亿元,经营效率持续提升

5月23日&#xff0c;微博发布2024年第一季度财报。一季度微博总营收3.955亿美元&#xff0c;约合28.44亿元人民币&#xff0c;超华尔街预期。其中&#xff0c;广告营收达到3.39亿美元&#xff0c;约合24.39亿元人民币。一季度调整后运营利润达到1.258亿美元&#xff0c;约合9.1…...

Mysql总结1

Mysql常见日志 &#xff08;1&#xff09;错误日志&#xff1a;记录数据库服务器启动、停止、运行时存在的问题&#xff1b; &#xff08;2&#xff09;慢查询日志&#xff1a;记录查询时间超过long_query_time的sql语句&#xff0c;其中long_query_time可配置&#xff0c;且…...

three.js能实现啥效果?看过来,这里都是它的菜(05)

这是第五期了&#xff0c;本期继续分享three.js可以实现的3D动画案例&#xff0c;捎带讲一下如何将模型导入到three.js中。 如何将模型导入three.js中 three.js可以通过多种方式导入3D模型&#xff0c;以下是其中几种常见的方法&#xff1a; 使用three.js自带的OBJLoader或M…...

innerText和innerHTML的区别

innerHTML和innerText都是元素的属性&#xff0c;通过修改这个元素的属性可以达到修改元素内容的目的。但是二者之间略有不同。具体来说&#xff0c;它们的区别如下&#xff1a; innerHTML可以获取或设置元素内部的HTML内容&#xff0c;包括HTML标签&#xff0c;而innerText则…...

O2OA(翱途)开发平台数据统计如何配置?

O2OA提供的数据管理中心&#xff0c;可以让用户通过配置的形式完成对数据的汇总&#xff0c;统计和数据分组展现&#xff0c;查询和搜索数据形成列表数据展现。也支持用户配置独立的数据表来适应特殊的业务的数据存储需求。本文主要介绍如何在O2OA中开发和配置统计。 一、先决…...

网关过滤器使用及其原理分析

1.网关过滤器介绍 网关过滤器的用途一般是修改请求或响应信息,例如编解码、Token验证、流量复制等 官方文档地址:Spring Cloud Gateway 网关过滤器分为GloablFilter、GatewayFilter及DefaultFilter 过滤器的执行顺序由Order决定,Order值越小,优先级越高,越先执行 1.1…...