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

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

39e65c50e9c4704b477a94d385512140.png

第一:EPIT定时器基本简介

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


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


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


     2、12位的分频值。


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


2ff6fc29966b99134f4655d2ba892377.png

各个部分的功能:    


     ①、这是个多路选择器,用来选择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定时器的处理方法,不同的芯片会有所差别,但是总体上,区别不大。

目录
相关文章
|
2月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
774 10
|
2月前
|
安全 Linux 数据安全/隐私保护
为Linux系统的普通账户授予sudo访问权限的过程
完成上述步骤后,你提升的用户就能够使用 `sudo`命令来执行管理员级别的操作,而无需切换到root用户。这是一种更加安全和便捷的权限管理方式,因为它能够留下完整的权限使用记录,并以最小权限的方式工作。需要注意的是,随意授予sudo权限可能会使系统暴露在风险之中,尤其是在用户不了解其所执行命令可能带来的后果的情况下。所以在配置sudo权限时,必须谨慎行事。
324 0
|
2月前
|
Ubuntu Linux 开发者
国产 Linux 发行版再添新成员,CutefishOS 系统简单体验
当然,系统生态构建过程并不简单,不过为了帮助国产操作系统优化生态圈,部分企业也开始用国产操作系统替代 Windows,我们相信肯定会有越来越多的精品软件登录 Linux 平台。
120 0
|
2月前
|
Ubuntu 安全 Linux
Linux系统入门指南:从零开始学习Linux
Shell脚本是一种强大的自动化工具,可以帮助您简化重复的任务或创建复杂的脚本程序。了解Shell脚本的基本语法和常用命令,以及编写和运行Shell脚本的步骤,将使您更高效地处理日常任务。
210 0
|
28天前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
104 16
|
20天前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
|
3月前
|
监控 Linux 网络安全
Linux命令大全:从入门到精通
日常使用的linux命令整理
669 13
|
4月前
|
Linux 网络安全 数据安全/隐私保护
使用Linux系统的mount命令挂载远程服务器的文件夹。
如此一来,你就完成了一次从你的Linux发车站到远程服务器文件夹的有趣旅行。在这个技术之旅中,你既探索了新地方,也学到了如何桥接不同系统之间的距离。
558 21
|
4月前
|
JSON 自然语言处理 Linux
linux命令—tree
tree是一款强大的Linux命令行工具,用于以树状结构递归展示目录和文件,直观呈现层级关系。支持多种功能,如过滤、排序、权限显示及格式化输出等。安装方法因系统而异常用场景包括:基础用法(显示当前或指定目录结构)、核心参数应用(如层级控制-L、隐藏文件显示-a、完整路径输出-f)以及进阶操作(如磁盘空间分析--du、结合grep过滤内容、生成JSON格式列表-J等)。此外,还可生成网站目录结构图并导出为HTML文件。注意事项:使用Tab键补全路径避免错误;超大目录建议限制遍历层数;脚本中推荐禁用统计信息以优化性能。更多详情可查阅手册mantree。
linux命令—tree
|
2月前
|
Linux 网络安全 开发工具
技术栈:这50条最常用的 Linux 命令你一定要会!
建议多在终端中实践,遇到不懂的命令就用 man 或 --help 了解详情!
398 0