当前位置: 首页 > 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;
}

相关文章:

11. EPIC定时器

11. EPIC定时器 EPIT定时器简介EPIT定时器结构分析EPIT 定时器相关寄存器EPITx_CREPITx_SREPITx_LR 加载寄存器EPITx_CMPR 比较寄存器EPITx_CNR 计数寄存器 EPIT 配置步骤 例程代码编写bsp_epittimer.hbsp_epittimer.cmain.c EPIT定时器简介 EPIT定时器是增强的周期中断定时器…...

git-bash配置代理

git-bash命令提交执行命令: "git push origin main"时发生错误: “$ git push origin main fatal: unable to access ‘https://github.com/satadriver/locust_server.git/’: Failed to connect to github.com port 443 after 21035 ms: Couldn’t connect to serve…...

【ElasticSearch系列-07】ES的开发场景和索引分片的设置及优化

ElasticSearch系列整体栏目 内容链接地址【一】ElasticSearch下载和安装https://zhenghuisheng.blog.csdn.net/article/details/129260827【二】ElasticSearch概念和基本操作https://blog.csdn.net/zhenghuishengq/article/details/134121631【三】ElasticSearch的高级查询Quer…...

JavaWeb Day09 Mybatis-基础操作02-XML映射文件动态SQL

目录 Mybatis动态SQL介绍​编辑 一、案例 ①Mapper层 ②测试类 ③EmpMapper.xml ④结果​ 二、标签 &#xff08;一&#xff09;if where标签 ​①EmpMapper.xml ②案例 ③总结 &#xff08;二&#xff09;foreach标签 ①SQL语句 ②Mapper层 ③EmpMapper.xml ④…...

CV学习基础

脸部检测是基于图像的明暗变化模式进行判断&#xff0c;需要将图像先进行灰度化处理 马赛克处理需先将图像缩小然后夸大回原尺寸。 保存训练好的算法用joblib 进行以下操作时已经使用cv2.cvtColor()完成了灰度化 图像平滑化&#xff08;模糊处理&#xff09;&#xff1a;cv…...

设计模式之禅之设计模式-原型模式

设计模式之禅之设计模式-原型模式 一&#xff1a;原型模式的定义 ​ 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 ​ 原型模式(Prototype Pattern)的简单程度仅次于单例模式和迭代器模式。正是由于简单,使用的场景才非常地多。 ​ 原型模式的核心是一…...

Spring的循环依赖问题

文章目录 1.什么是循环依赖2.代码演示3.分析问题4.问题解决5.Spring循环依赖6. 疑问点6.1 为什么需要三级缓存6.2 没有三级缓存能解决吗&#xff1f;6.3 三级缓存分别什么作用 1.什么是循环依赖 上图是循环依赖的三种情况&#xff0c;虽然方式有点不一样&#xff0c;但是循环依…...

RT-DETR算法改进:更换损失函数DIoU损失函数,提升RT-DETR检测精度

💡本篇内容:RT-DETR算法改进:更换损失函数DIoU损失函数 💡本博客 改进源代码改进 适用于 RT-DETR目标检测算法(ultralytics项目版本) 按步骤操作运行改进后的代码即可🚀🚀🚀 💡改进 RT-DETR 目标检测算法专属 文章目录 一、DIoU理论部分 + 最新 RT-DETR算法…...

【ICE】2:基于webrtc的 ice session设计及实现

工厂函数:CreateICESession_t 外部声明,sdk内部实现。创建IICESession :外部可见,内部也可见 /// Factory function prototype. How you get this factory will depend on how you are linking with /// this code. typedef IICESession *( *CreateICESession_t )( const…...

Vue组件传

跟禹神学vue--总结 1 父组件给子组件传递参数--props传参 &#xff08;1&#xff09;父组件中准备好数据 data() {return {todos:[{id:001,title:01,done:true},{id:002,title:02,done:false},{id:003,title:03,done:true}]} } &#xff08;2&#xff09;父组件中引入子组件…...

轻量封装WebGPU渲染系统示例<25>- 颜色附件数据更新替换(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/ColorAttachmentReplace.ts 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下: const rttTex0 { diffuse: { uuid: rtt0, rttTexture: {} } }; c…...

c语言练习第11周(1~5)

数列 1 1 2 3 5 8 13 21 ... 被称为斐波纳数列。 输入若干个正整数N&#xff0c;输出这个序列的前 N 项的和。 题干数列 1 1 2 3 5 8 13 21 ... 被称为斐波纳数列。 输入若干个正整数N&#xff0c;输出这个序列的前 N 项的和。输入样例3 5 4 1输出样例…...

阿里云国际站服务器如何升级内存容量?

阿里云服务器是阿里云供给的计算服务&#xff0c;它具有高效安稳、可扩展性强等特色&#xff0c;适用于各种应用环境。在运用阿里云服务器的过程中&#xff0c;或许会遇到内存容量缺乏的状况&#xff0c;这时候就需求晋级内存容量。那么&#xff0c;阿里云服务器怎么晋级内存容…...

神经网络(第二周)

一、简介 1.1 需求预测示例 1.1.1 逻辑回归算法 根据价格预测商品是否畅销。特征&#xff1a;T恤的价格&#xff1b;分类&#xff1a;销售量高1/销售量低0&#xff1b;使用逻辑回归算法进行分类&#xff0c;拟合效果如下图所示&#xff1a; 1.1.2 神经元和神经网络 将逻辑回…...

《网络协议》04. 应用层(DNS DHCP HTTP)

title: 《网络协议》04. 应用层&#xff08;DNS & DHCP & HTTP&#xff09; date: 2022-09-05 14:28:22 updated: 2023-11-12 06:55:52 categories: 学习记录&#xff1a;网络协议 excerpt: 应用层、DNS、DHCP、HTTP&#xff08;URI & URL&#xff0c;ABNF&#xf…...

springboot自己添加的配置文件没有绿色叶子问题

在IntelliJ IDEA中&#xff0c;不同文件类型通常会有不同的图标&#xff0c;以便更容易识别它们。如果您的自己添加的 .properties 文件和项目中自动生成的 .properties 文件显示不同的图标&#xff0c;这可能是因为它们被识别为不同的文件类型。 通常情况下&#xff0c;Intel…...

【Java】定时任务 - Timer/TimerTask 源码原理解析

一、背景及使用 日常实现各种服务端系统时&#xff0c;我们一定会有一些定时任务的需求。比如会议提前半小时自动提醒&#xff0c;异步任务定时/周期执行等。那么如何去实现这样的一个定时任务系统呢&#xff1f; Java JDK提供的Timer类就是一个很好的工具&#xff0c;通过简单…...

SAP ABAP基础语法-Excel上传(十)

EXCEL BDS模板上传及赋值 上传模板事务代码&#xff1a;OAER l 功能代码&#xff1a;向EXCEL模板中写入数据示例代码如下 REPORT ZEXCEL_DOI. “doi type pools TYPE-POOLS: soi. *SAP Desktop Office Integration Interfaces DATA: container TYPE REF TO cl_gui_custom_c…...

记录一次某某虚拟机的逆向

导语 学了一段时间的XPosed&#xff0c;发现XPosed真的好强&#xff0c;只要技术强&#xff0c;什么操作都能实现... 这次主要记录一下我对这款应用的逆向思路 apk检查 使用MT管理器检查apk的加壳情况 发现是某数字的免费版本 直接使用frida-dexdump 脱下来后备用 应用分…...

upload-labs关卡7(基于黑名单的空格绕过)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第七关通关思路1、看源代码2、空格绕过3、检查文件是否成功上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚未授权的网站做渗透测试…...

告别在线转换!用PowerShell+FFmpeg批量把FLAC无损转成ALAC(附完整脚本)

打造高效音频工作流&#xff1a;PowerShellFFmpeg批量转换FLAC到ALAC全攻略 每次整理音乐库时&#xff0c;最头疼的就是格式兼容性问题。上周我帮朋友迁移他的2000多首FLAC音乐到苹果设备&#xff0c;原本打算用在线转换工具&#xff0c;结果光是上传就花了整整一天——这还不算…...

OpenClaw模型配置详解:Kimi-VL-A3B-Thinking多模态接口接入

OpenClaw模型配置详解&#xff1a;Kimi-VL-A3B-Thinking多模态接口接入 1. 为什么选择Kimi-VL-A3B-Thinking 去年我在尝试构建一个自动化内容处理工作流时&#xff0c;发现市面上大多数模型对图文混合内容的理解能力有限。直到偶然在开发者社区看到Kimi-VL-A3B-Thining的评测…...

JS中彻底删除JSON对象组成的数组中的元素

在 JS 中&#xff0c;对于某个由 JSON 对象组成的数组&#xff0c;例如&#xff1a;var test [{ "a": "1", "b": "2" }, { "a": "3", "b": "4" }, { "a": "5", "b…...

1.3 开发环境搭建(West工具、Zephyr SDK、CMake)

001、开篇:为什么选择Zephyr RTOS与现代嵌入式开发工具链? 上周深夜调试一块STM32H7板子,串口突然吐出两行乱码后彻底静默。示波器抓供电正常,JTAG连上发现程序卡在某个静态数组初始化里——内存管理配置对不上芯片的实际SRAM分区。这种问题在传统RTOS环境里至少要翻半天手…...

别让格式毁掉你的毕业论文!Paperxie AI 排版:3 分钟复刻学校官方标准

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AIPPThttps://www.paperxie.cn/format/typesettinghttps://www.paperxie.cn/format/typesetting 一、 本科生的痛&#xff1a;论文写完了&#xff0c;格式却能逼疯人 毕业论文的终极考验&#xff0c;从来都…...

AI 编程的“三重境界”:从会用工具到驾驭智能,你在哪一层?

文章目录一、为什么需要理解 AI 编程的层次&#xff1f;1.1 一个常见的困惑1.2 三重境界概述二、第一层&#xff1a;工具使用者2.1 这一层的典型表现2.2 第一层的痛点2.3 如何突破到第二层&#xff1f;三、第二层&#xff1a;协作伙伴3.1 这一层的典型表现3.2 第二层的核心能力…...

电商运营自动化:OpenClaw+Phi-3-vision实现竞品图文分析

电商运营自动化&#xff1a;OpenClawPhi-3-vision实现竞品图文分析 1. 为什么需要自动化竞品分析 作为个人电商卖家&#xff0c;我每天要花大量时间手动收集竞品信息&#xff1a;截图商品页面、记录价格变化、对比卖点描述。这种重复劳动不仅效率低下&#xff0c;还容易遗漏关…...

C# 13主构造函数到底怎么用:从语法糖到IL底层,3步写出零反射、零冗余的生产级代码

第一章&#xff1a;C# 13主构造函数到底怎么用&#xff1a;从语法糖到IL底层&#xff0c;3步写出零反射、零冗余的生产级代码 C# 13 的主构造函数&#xff08;Primary Constructors&#xff09;并非简单的语法糖&#xff0c;而是编译器在类型声明阶段就完成参数绑定与字段初始化…...

Kotoba-Whisper日语优化模型在Faster-Whisper-GUI中的适配分析

Kotoba-Whisper日语优化模型在Faster-Whisper-GUI中的适配分析 【免费下载链接】faster-whisper-GUI faster_whisper GUI with PySide6 项目地址: https://gitcode.com/gh_mirrors/fa/faster-whisper-GUI 问题引入&#xff1a;日语语音识别的效率与兼容性挑战 在语音识…...

AI时代新型的项目管理应该是什么样的?商

AI训练存储选型的演进路线 第一阶段&#xff1a;单机直连时代 早期的深度学习数据集较小&#xff0c;模型训练通常在单台服务器或单张GPU卡上完成。此时直接将数据存储在训练机器的本地NVMe SSD/HDD上。 其优势在于IO延迟最低&#xff0c;吞吐量极高&#xff0c;也就是“数据离…...