Linux系统中裸机定时器的基本原理

news2025/7/19 6:47:30

   大家好,今天的话主要和大家聊一聊,如何使用定时器,完成精准的定时功能实现​。

目录

第一​:EPIT定时器基本简介

​第二:EPIT的基本配置

​第三:代码的具体实现


第一​:EPIT定时器基本简介

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

      EPIT是一个32位定时器,在处理的时候提供精准的定时中断,软件使能以后EPIT就会开始运行,EPIT定时器有如下特点​:

      1、时钟源可选的32位向下计数器​。

      2、12位的分频值​。

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

​各个部分的功能:    

      ①、这是个多路选择器,用来选择EPIT定时器的时钟源,EPIT 共有 3 个时钟源可选择, ipg_clk、ipg_clk_32k 和 ipg_clk_highfreq。

      ②、这是一个 12 位的分频器,负责对时钟源进行分频,12 位对应的值是 0~4095,对应着 1~4096 分频。

      ③、经过分频的时钟进入到 EPIT 内部,在 EPIT 内部有三个重要的寄存器:计数寄存器 (EPIT_CNR)、加载寄存器(EPIT_LR)和比较寄存器(EPIT_CMPR),这三个寄存器都是 32 位的。 EPIT 是一个向下计数器,也就是说给它一个初值,它就会从这个给定的初值开始递减,直到减 为 0,计数寄存器里面保存的就是当前的计数值。如果 EPIT 工作在 set-and-forget 模式下,当计数寄存器里面的值减少到 0,EPIT 就会重新从加载寄存器读取数值到计数寄存器里面,重新开 始向下计数。比较寄存器里面保存的数值用于和计数寄存器里面的计数值比较,如果相等的话 就会产生一个比较事件。

       ④、比较器。 

      ⑤、EPIT 可以设置引脚输出,如果设置了的话就会通过指定的引脚输出信号。

       ⑥、产生比较中断,也就是定时中断。

​第二:EPIT的基本配置

     1、设置 EPIT1 的时钟源 设置寄存器 EPIT1_CR 寄存器的 CLKSRC(bit25:24)位,选择 EPIT1 的时钟源。

         2、设置分频值 设置寄存器 EPIT1_CR 寄存器的 PRESCALAR(bit15:4)位,设置分频值。 

        3、设置工作模式 设置寄存器 EPIT1_CR 的 RLD(bit3)位,设置 EPTI1 的工作模式。

       4、设置计数器的初始值来源 设置寄存器 EPIT1_CR 的 ENMOD(bit1)位,设置计数器的初始值来源。

      5、使能比较中断 我们要使用到比较中断,因此需要设置寄存器 EPIT1_CR 的 OCIEN(bit2)位,使能比较中 断。

       6、设置加载值和比较值 设置寄存器 EPIT1_LR 中的加载值和寄存器 EPIT1_CMPR 中的比较值,通过这两个寄存器 就可以决定定时器的中断周期。

        7、EPIT1 中断设置和中断服务函数编写 使能 GIC 中对应的 EPIT1 中断,注册中断服务函数,如果需要的话还可以设置中断优先 级。最后编写中断服务函数。

        8、使能 EPIT1 定时器 配置好 EPIT1 以后就可以使能 EPIT1 了,通过寄存器 EPIT1_CR 的 EN(bit0)位来设置。 通过以上几步我们就配置好 EPIT 了,通过 EPIT 的比较中断来实现 LED0 的翻转。

​第三:代码的具体实现

 #include "bsp_epittimer.h" #include "bsp_int.h" #include "bsp_led.h" /* * @description : 初始化 EPIT 定时器. * EPIT 定时器是 32 位向下计数器,时钟源使用 ipg=66Mhz  * @param – frac : 分频值,范围为 0~4095,分别对应 1~4096 分频。 * @param - value : 倒计数值。 * @return : 无 */ void epit1_init(unsigned int frac, unsigned int value){ if(frac > 0XFFF) frac = 0XFFF; EPIT1->CR = 0; /* 先清零 CR 寄存器 */ /* * CR 寄存器: * bit25:24 01 时钟源选择 Peripheral clock=66MHz * bit15:4 frac 分频值 * bit3: 1 当计数器到 0 的话从 LR 重新加载数值 * bit2: 1 比较中断使能 * bit1: 1 初始计数值来源于 LR 寄存器值 * bit0: 0 先关闭 EPIT1 */ EPIT1->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 */ } /* * @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; /* 清除中断标志位 */}

​    总结:EPIT定时器的处理方法,不同的芯片会有所差别,但是总体上,区别不大​。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【UE4】引擎配置文件原理学习笔记

刚好遇到一个ini加载的优化。趁此机会记录学习一下UE引擎的config文件层级结构和读取流程 文章目录两个问题层级结构文件读取流程初始化流程文件读取流程文件的写入配置文件内容和GConfig结构两个问题 在看项目目录结构的时候&#xff0c;有没有这样的疑问&#xff1a; 为什么…

喜报!泛睿云国家版权局颁发的软件著作权证书

近日,泛睿云自主研发的泛睿云计算服务平台V1.0,通过中国人民共和国国家版权局权威授权,获得了计算机软件著作权登记证书,这是对泛睿云实力和研发水平的充分肯定。 软件著作权是企业核心自主知识产权,是企业的“无形资产”,是企业科技的生命力和价值所在,国家权威部门的认证将使…

微信群裂变文案微信群裂变软件

看过前几篇文章的&#xff0c;想必多多少少都清楚微信群裂变以及朋友圈裂变能够带来的巨大能量&#xff1a;低成本获客&#xff0c;高质量传播。那今天就来分享微信群以及微信朋友圈裂变话术&#xff0c;满满都是干货&#xff0c;新手一定要看仔细咯。今天的内容主要讲的有三点…

亲测有效!咳嗽3秒检测新冠的小·程·序;开源啦!超全的AI创作工具网站;谷歌乳腺癌AI筛查进入临床实践;根据文字生成音乐 | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f4e2; 『Thinkit声音识别』亲测有效&#xff01;新冠病毒咳嗽声检测小程序 一款名为“Thinkit声音识别”的微信小程序&#xff0c;实现通过声音识别新冠…

c#入门-可为空的注释上下文

null 一个经典的问题&#xff0c;字符串的“”和null有什么区别。 string s null; string s2 ""; Console.WriteLine(s); Console.WriteLine(s2);虽然看起来&#xff0c;他们都没有储存实际数据。 区别在于&#xff0c;“”相当于买了0个月饼。别人发了个空盒子过…

编译原理:词法分析

参考视频&#xff1a;方舟编译技术入门与实战 以及 西交冯博琴老师的相关视频 编译的过程包括 词法分析&#xff08;分析程序符号&#xff09;、语法分析&#xff08;分析语法单位&#xff09;、中间代码生成、代码优化和目标代码生成。该架构自1960s之后基本未变。 一、编译过…

FFMPEG读取本地文件推流到RTMP服务器!

前言&#xff1a; 今天我们再来分享一个开源代码项目&#xff0c;这个代码项目是通过读取本地的TS文件&#xff0c;然后推流到RTMP服务器上面。一、项目框图和运行效果&#xff1a; 1.1.项目的框图&#xff1a;1.2.运行效果&#xff1a;二、模块的讲解&#xff1a; 2.1.初始化文…

做了6年的软件测试了,想提升一下自己,学一下自动化测试,但是没有方向,怎么办?

前言 最后后台一位粉丝和我说做了6年的功能测试&#xff0c;在职场没有突破涨薪&#xff0c;陷入了一个迷茫的境地&#xff0c;想学自动化测试但是又不知道从哪里入手&#xff01;&#xff01;&#xff01;今天静姐就带这位粉丝盘一盘自动化测试如何进阶&#xff1f;&#xff…

Python OpenCV 单目相机标定、坐标转换相关代码(包括鱼眼相机)

前言 本文不讲原理&#xff0c;只关注代码&#xff0c;有很多博客是讲原理的&#xff0c;但是代码最多到畸变矫正就结束了&#xff0c;实际上就是到 OpenCV 官方示例涉及的部分。   在官方示例中使用黑白棋盘格求解了相机的内外参和畸变系数&#xff0c;并对图像做了畸变矫正…

多态实现原理

学习Java的时候就已经学习了多态但是对于多态的原理还是不是很明白所以写下这篇文章来记录一下 如果后面有新的理解也继续添加到本页面 什么是多态 多态是面向对象编程里面的概念&#xff0c;一个接口的多种实现不同的实现方式&#xff0c;即为多态 这里的接口不应理解得太死板…

国考省考行测:关联词分析法,转折,总结,条件,递进,并列,各种关联词的典型词语和重点在哪

国考省考行测&#xff1a;关联词分析法&#xff0c;转折&#xff0c;总结&#xff0c;条件&#xff0c;递进&#xff0c;并列&#xff0c;各种关联词的典型词语和重点在哪 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&a…

Twitter营销你需要做的细节

优化首页 1. 塑造品牌形象 品牌对于企业来说是一种无形的价值&#xff0c;所以在任何平台上都要注意加深品牌印象&#xff0c;在推特上也是一样的&#xff0c;比如一样的logo&#xff0c;让访问过你网站的人一眼就认出你来。这样&#xff0c;品牌的不断深入&#xff0c;才能让…

如何用mac搭建本地svn服务器(如何将mac变成版本管理服务器)

前言 一、搭建本地svn服务器 1.建立代码库 2.配置文件修改 3.启动本地svn服务 二、搭建过程中常见问题 如果Mac os升级到10.0以上&#xff0c;自带的svn不支持了怎么办 三、mac本地使用svn软件管理svn库 cornerstone3安装 四、使用Cornerstone会存在的问题 Mac打开应用提示已损…

硬件 RAID 与软件 RAID 之间的区别

独立磁盘冗余阵列 &#xff08;RAID&#xff09; 是一种将多个物理驱动器组合到一个单元中的虚拟磁盘技术。这是一种通过使用多个驱动器来提高存储介质的性能和可靠性的方法。驱动器配置为在磁盘之间划分数据以分配负载&#xff0c;或者复制数据以确保在磁盘发生故障后可以恢复…

Oauth2.0实现单点登录的原理流程,这次总该懂了!

单点登录是多域名企业站点流行的登录方式。本文以现实生活场景辅助理解&#xff0c;力争彻底理清 OAuth2.0 实现单点登录的原理流程。同时总结了权限控制的实现方案&#xff0c;及其在微服务架构中的应用。 1 什么是单点登录 1.1 多点登录 传统的多点登录系统中&#xff0c;…

正大国际期货:外盘期货恒指八大交易法则!

现在比较流行的期货并不算多&#xff0c;主流的就是恒指期货、美原油期货和黄金期货还有德指期货、道指、铜、天然气等等&#xff0c;恒指期货是最适合亚洲人投资的期货品种&#xff0c;现在国内很多投资人也会选择恒指期货入手。那么投资者要遵循哪些法则才可能在期货市场中获…

安装虚拟机以及linux(Centos 7)系统

背景&#xff1a;模拟部署系统至Linux服务器上并运行 下载VMware Workstation Pro并激活&#xff0c;自行百度下载。 打开虚拟机“创建新的虚拟机” 然后选择自定义&#xff0c;选择好后点击下一步 直接下一步 稍后安装操作系统 客户机操作系统选择Linux&#xff0c;版本选择…

element集成第三方icon图标

引言 集成阿里图标库 进入阿里icon&#xff0c;新建项目 选择一个自己喜欢的icon库&#xff0c;将里面的图标加入购物车中 因为没有批量导入购物车&#xff0c;所以一般情况下需要一个一个去点&#xff0c;太浪费时间&#xff0c;那么请在控制台输入以下代码&#xff0c;批量…

Spring 中 @Bean 注解流程分析

代码案例 现在 SpringBoot、SpringCloud 基本上都是通过 Bean 注解来将组件交给 Spring 管理&#xff0c;所以对 Bean 的流程应该要有所了解。 这里先定义一个 Blue 的实体类&#xff0c;如下&#xff1a; public class Blue { }然后定义一个入口类&#xff0c;通过 Bean 注…

rocketMq介绍和安装

rocketMq介绍和安装 Mq介绍 MQ&#xff1a;MessageQueue&#xff0c;消息队列。 队列&#xff0c;是一种FIFO 先进先出的数据结构。消息由生产者发送到MQ进行排队&#xff0c;然后按原来的顺序交由消息的消费者进行处理。 QQ和微信就是典型的MQ。 MQ的作用 主要有以下三个…