正点原子[第二期]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. 结束

本文至此结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/635917.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Lumines推出RGBL彩色混合LED

Luminus Devices倾心打造了一款崭新的4合1 RGBL&#xff08;红绿蓝绿石灰&#xff09;LED系列&#xff0c;专为舞台与建筑照明领域量身打造&#xff0c;满足对高显色指数&#xff08;CRI&#xff09;与高输出颜色混合的苛刻需求。这一创新之举&#xff0c;无疑是照明技术的一次…

【OpenGL实践10】关于几何着色器

目录 一、说明 二、几何着色器 2.1 设置 2.2 基本几何着色器 2.2.1 输入类型 2.2.2 输出类型 2.2.3 顶点输入 2.2.4 顶点输出 2.3 创建几何着色器 2.4 几何着色器和顶点属性 三、动态生成几何体 四、结论 练习 一、说明 几何着色器的应用比较高级&#xff0c;关于…

Postman使用技巧

Postman是一款广泛使用的API开发和测试工具&#xff0c;专为简化Web服务API的开发、测试、文档编制和协作过程而设计。它支持各种HTTP请求方法&#xff0c;包括GET、POST、PUT、DELETE等&#xff0c;允许用户轻松地构建和发送请求&#xff0c;以及检查响应。 本文介绍几个提升效…

Linux信号:信号的概念及意义

目录 一、什么是信号 kill-l查看信号 二、信号的产生 2.1系统调用 kill raise abort 2.2软件条件 13)SIGPIPE pipe信号 14&#xff09;SIGAKARM alarm信号 2.2硬件中断 2.3异常 8)SIGFPE 除0异常 11)SIGSEGV 野指针 2.4信号处理的常见方式 三、Core Dump和term…

docker如何拉取redis最新镜像并运行

要拉取Docker Hub上最新版本的Redis镜像&#xff0c;您可以使用以下命令&#xff1a; docker pull redis:latest 这里的latest标签会自动获取Redis镜像的最新版本。如果您希望指定一个确切的版本号&#xff0c;可以直接使用该版本号替换latest。例如&#xff0c;要拉取Redis版…

Python | Leetcode Python题解之第108题将有序数组转换为二叉搜索树

题目&#xff1a; 题解&#xff1a; class Solution:def sortedArrayToBST(self, nums: List[int]) -> TreeNode:def helper(left, right):if left > right:return None# 选择任意一个中间位置数字作为根节点mid (left right randint(0, 1)) // 2root TreeNode(nums…

计算机网络数据链路层知识点总结

3.1 数据链路层功能概述 &#xff08;1&#xff09;知识总览 &#xff08;2&#xff09;数据链路层的研究思想 &#xff08;3&#xff09;数据链路层基本概念 &#xff08;4&#xff09;数据链路层基本功能 3.1 封装成帧和透明传输 &#xff08;1&#xff09;数据链路层功能…

上海亚商投顾:三大指数均跌超1.3%,全市场下跌个股超4600只

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 市场全天震荡调整&#xff0c;三大股指均跌超1.3%。PEEK概念股逆势大涨&#xff0c;肯特股份、沃特股份涨停&a…

[STM32-HAL库]AS608-指纹识别模块-STM32CUBEMX开发-HAL库开发系列-主控STM32F103C8T6

目录 一、前言 二、详细步骤 1.光学指纹模块 2.配置STM32CUBEMX 3.程序设计 3.1 输出重定向 3.2 导入AS608库 3.3 更改端口宏定义 3.4 添加中断处理部分 3.5 初始化AS608 3.6 函数总览 3.7 录入指纹 3.8 验证指纹 3.9 删除指纹 3.10 清空指纹库 三、总结及资源 一、前言 …

AI赋能 企业智能化应用实践

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言云定价优化语音助手与聊天机器人预测性维护客服运营自动化低功耗微处理器神…

无线网络安全技术基础

无线网络安全技术基础 无线网络安全风险和隐患 随着无线网络技术广泛应用,其安全性越来越引起关注.无线网络的安全主要有访问控制和数据加密,访问控制保证机密数据只能由授权用户访问,而数据加密则要求发送的数据只能被授权用户所接受和使用。 无线网络在数据传输时以微波进…

微软MSBuild大会发布Copilot+PC:技术革新还是隐私噩梦?

微软在最近的MSBuild 2024大会上发布了全新的CopilotPC概念&#xff0c;这一技术结合了高通骁龙X Elite芯片&#xff0c;将人工智能与PC紧密结合。此次发布引起了广泛关注&#xff0c;不仅是因为其技术创新&#xff0c;还因为潜在的隐私问题。甚至连Elon Musk也对此表示担忧&am…

Nginx企业级负载均衡:技术详解系列(11)—— 实战一机多站部署技巧

你好&#xff0c;我是赵兴晨&#xff0c;97年文科程序员。 工作中你是否遇到过这种情况&#xff1a;公司业务拓展&#xff0c;新增一个域名&#xff0c;但服务器资源有限&#xff0c;只能跟原有的网站共用同一台Nginx服务器。 也就是说两个网站的域名都指向同一台Nginx服务器…

WPF中DataGrid实现多选框功能

1. 效果图 2. Model建立 public class RstModelCheck : ObservableObject {//为了显示Head1和Head2.而且View中绑定属性而非字段&#xff0c;否则不能显示。public string? Name { get; set; } public bool PlatenAll {get > _platenAll;set{SetProperty(ref _platenAl…

MoonDream2微调指南【最小VLM】

在本指南中&#xff0c;我们将探讨如何使用计算机视觉数据集对完全开源的小型视觉语言模型 Moondream2 进行微调&#xff0c;以计数项目&#xff08;这是 GPT-4V 一直表现不一致的任务&#xff09;&#xff0c;并以一种可以依赖输出用于生产应用程序的方式进行微调。 视觉语言…

电力巡检穿戴式智能手环:让巡检不孤立无援

电力巡检穿戴式智能手环:让巡检不孤立无援 在电力巡检的广袤天地里中&#xff0c;电力工作人员他们身着工装&#xff0c;头戴安全帽&#xff0c;手持仪器&#xff0c;穿梭在高压线路与铁塔之间。他们的健康状态&#xff0c;直接关系到电力作业的安全与效率。如今&#xff0c;电…

先进电气技术 —— 控制理论中的“观测器”概述

一、背景 观测器在现代控制理论中的地位十分重要&#xff0c;它是实现系统状态估计的关键工具。观测器的发展历程可以从以下几个方面概述&#xff1a; 1. 起源与发展背景&#xff1a; 观测器的概念源于对系统状态信息的需求&#xff0c;特别是在只能获取部分或间接输出信息…

免费分享一套微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端) Java毕业设计…

VSCode注释模板配置(koroFileheader插件)

近期公司转远程开发&#xff0c;原本idea本地开发用得很丝滑&#xff0c;但使用idea client切换到远程开发&#xff0c;发现各种难受&#xff0c;于是只好探索新工具&#xff0c;py和cpp一直用vscode&#xff0c;于是也试试java&#xff0c;果然比idea client强不只一点点&…

小程序-滚动触底-页面列表数据无限加载

// index/index.vue <template> <!-- 自定义导航栏 --> <CustomNavbar /> <scroll-view scrolltolower"onScrolltolower" scroll-y class"scroll-view"> <!-- 猜你喜欢 --> <Guess ref"guessRef" /> </s…