LINUX驱动开发#9——定时器

定时器

EPIT定时器

EPIT (Enhanced Periodic Interrupt Timer):增强的周期中断定时器,只用来完成周期性中断定时的,仅此一项功能。输入捕获、PWM 输出等这些功能,由其它的外设来完成。

EPIT 定时器有如下特点:

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

set-and-forget 模式

  • 此模式下 EPIT 的计数器从加载寄存器 EPITx_LR 中获取初始值,不能直接向计数器寄存器写入数据。不管什么时候,只要计数器计数到 0,那么就会从加载寄存器 EPITx_LR 中重新加载数据到计数器中,周而复始。

free-running 模式

  • 当计数器计数到0以后会重新从0XFFFFFFFF开始计数,并不是从加载寄存器EPITx_LR中获取数据。
配置步骤

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 的翻转。

GPT定时器

GPT(General Purpose Timer)通用定时器

  • GPT 定时器是一个 32 位向上定时器(也就是从 0X00000000 开始向上递增计数),GPT 定时器也可以跟一个值进行比较,当计数器值和这个值相等的话就发生比较事件,产生比较中断。

GPT 定时器特性如下:

  • 一个可选时钟源的 32 位向上计数器
  • 两个输入捕获通道,可以设置触发方式
  • 三个输出比较通道,可以设置输出模式
  • 可以生成捕获中断、比较中断和溢出中断
  • 计数器可以运行在重新启动(restart)或(自由运行)free-run 模式
结构框图
  1. 此部分为 GPT 定时器的时钟源,前面已经说过了,本章例程选择 ipg_clk 作为 GPT 定时器时钟源。
  2. 此部分为 12 位分频器,对时钟源进行分频处理,可设置 0~4095,分别对应 1~4096 分频。
  3. 经过分频的时钟源进入到 GPT 定时器内部 32 位计数器。
  4. 这两部分是 GPT 的两路输入捕获通道
  5. 此部分为输出比较寄存器,一共有三路输出比较,因此有三个输出比较寄存器,输出比较1寄存器是 32 位的。
  6. 此部分位输出比较中断,三路输出比较中断,当计数器里面的值和输出比较寄存器里面的比较值相等就会触发输出比较中断。
工作模式

**重新启动(restart)模式:**当 GPTx_CR(x=1,2)寄存器的 FRR 位清零的时候 GPT 工作在此模式。在此模式下,当计数值和比较寄存器中的值相等的话计数值就会清零,然后重新从0X00000000 开始向上计数,只有比较通道 1 才有此模式!向比较通道 1 的比较寄存器写入任何数据都会复位 GPT 计数器。对于其他两路比较通道(通道 2 和 3),当发生比较事件以后不会复位计数器。

自由运行(free-run)模式:当 GPTx_CR(x=1,2)寄存器的 FRR 位置 1 时候 GPT 工作在此模式下,此模式适用于所有三个比较通道,当比较事件发生以后并不会复位计数器,而是继续计数,直到计数值为 0XFFFFFFFF,然后重新回滚到 0X00000000。

相关推荐
森G2 小时前
七、04ledc-sdk--------makefile有变化
linux·c语言·arm开发·c++·ubuntu
驱动探索者2 小时前
linux mailbox 学习
linux·学习·算法
酉鬼女又兒3 小时前
每天一个Linux命令_printf
linux·运维·服务器
Trouvaille ~3 小时前
TCP Socket编程实战(三):线程池优化与TCP编程最佳实践
linux·运维·服务器·网络·c++·网络协议·tcp/ip
June`3 小时前
高并发网络框架:Reactor模式深度解析
linux·服务器·c++
Hello_Embed4 小时前
libmodbus 移植 STM32(USB 串口后端篇)
笔记·stm32·单片机·嵌入式·freertos·libmodbus
生活很暖很治愈4 小时前
Linux——孤儿进程&进程调度&大O(1)调度
linux·服务器·ubuntu
HalvmånEver5 小时前
Linux:线程同步
linux·运维·服务器·线程·同步
Zach_yuan5 小时前
自定义协议:实现网络计算器
linux·服务器·开发语言·网络