【ARM学习笔记】ARM Cortex -A7 EPIT定时器
发布日期:2021-05-14 16:25:24 浏览次数:20 分类:精选文章

本文共 2400 字,大约阅读时间需要 8 分钟。

ARM Cortex-A7 EPIT 定时器简述

定时器特点

ARM Cortex-A7 的 EPIT(嵌入式定时器/中断定时器) 是一种功能强大的周期性定时器,主要用途是处理系统中需要定期执行的任务。它具有以下主要特点:

  • 时钟源可选23位向下计数器:支持多个时钟源,可.triplexe选择 Peripheral clock、高频参考 clock(32 kHz)或外部 32 kHz 旁端器源。
  • 12位分频值支持:能设置最多 4096 次分频。
  • 事件触发中断机制:在计数器值与设定值相等时触发中断。
  • 可现场设置计数器值:支持即使编程计数器的当前值。
  • 低功耗模式与调试模式支持:在低功耗模式下仍能通过编程使计数器保持活跃状态。
  • 原理分析

    结构分析

    EPIT 定时器内部包含多路选择器、预分频器、以及一系列寄存器。这些组件共同构成其核心计时功能。

  • 多路选择器

    • 可选时钟源
      • Peripheral clock:由时钟控制模块 CCM 提供的系统时钟。
      • Low-frequency 32 kHz clock:外部引入的晶振 clock。
      • High-frequency clock:由 CCM 提供的高性能时钟。
  • 12位预分频器

    • 用于将系统时钟进一步分频,以适应不同定时需求。
  • 寄存器组件

    • Counter Register(32位):用于存储当前计数器值。
    • Load Register(32位):在 set-and-forget 工作模式下,存储计数器的初始值,供计数器恢复时使用。
    • Compare Register(32位):用于定义计数器触发比较事件的设置值。
    • Counter比较器:负责检测计数器与比较值的变化,触发中断事件。
    • 引脚配置器:定义输出引脚的功能。
    • SR 寄存器:存储中断事件标志位,用于通知主控制器定时器事件发生。
  • 工作模式

    EPIT 定时器支持两种工作模式:

  • Set-and-forget模式

    • 初始化时,计数器直接从 Load Register 获取初始值,并开始递减至零。
    • 到达零值后,自动从 Load Register 重新获取初始值,继续运转。
    • 该模式通常用于需要长时间循环的任务,例如定期任务调度。
  • Free-running模式

    • 计数器在触发后继续递减至零后会自动在高位处重新置零(如 Likely 0xFFFF_FFFF),然后重新开始计数。
    • 该模式适用于突然事件检测,如周期性拍摄或实时数据采集。
  • 寄存器配置

    EPIT 控制寄存器(CR)

    属性 属性说明 示例配置
    CLKSRC 时钟源选择 10(高频时钟)
    PRESCALAR 预分频值(12位) 0x00FF
    RLD 工作模式控制位 1(Set-and-forget)
    OCIEN 比较中断使能位 1
    ENMOD 初始值源控制位 0(保持当前值)
    EN 定时器使能位 1

    中断寄存器(SR)

    • 只有最低有效位(OCIF)用于告知是否有比较事件。

    溢出时间计算

    通过以下公式计算 EPIT 定时器的溢出周期:

    [ \text{溢出时间} = \frac{(\text{分频值} + 1) \times \text{装载值}}{\text{时钟频率}} ]

    这是一个通用公式,需结合具体硬件参数进行调整。

    配置流程

  • 选择时钟源
    • 通过 CLKSRC 寄存器选择 Peripheral clock、高频 clock 或外部 32 kHz clock。
  • 预分频设置
    • 调整 PRESCALAR 寄存器,设置适当的分频值。
  • 设置工作模式
    • 根据需求选择 Set-and-forget 或 Free-running 模式。
  • 定义初始计数值
    • 使用 ENMOD 寄存器控制初始值的来源。
  • 配置比较值和中断
    • 设置 Compare Register 定时器触发条件。
    • 激活比较中断使能位。
  • 设置引脚功能
    • 定义 EPIT 定时器输出引脚的功能,配置中断翻转模式。
  • 使能 FMC 初始器
    • 调整 FMC 寄存器,完成定时器配置后计数器恢复。
  • 编写中断服务函数
    • 定义中断响应函数,执行相应的操作。
  • 实现过程

    以控制 LED �灯灭为例:

    • EPIT 定时器负责定期切换 LED 状态。
    • 通过 Set-and-forget 模式,EPIT 定时器会根据 Load Register 的值周期性地触发中断。
    • 在中断服务函数中,切换 LED 状态并清除中断标签。

    代码编写

    void epit1_init(unsigned int frac, unsigned int value)
    {
    EPIT1->CR = 0;
    EPIT1->LR = value;
    EPIT1->CMPR = 0;
    GIC_EnableIRQ(EPIT1_IRQn);
    system_register_irqhandler(EPIT1_IRQn, (system_irq_handler_t)epit1_irqhandler, NULL);
    EPIT1->CR |= (1 << 0);
    }
    void epit1_irqhandler(void)
    {
    static unsigned char state = 0;
    state = !state;
    if (EPIT1->SR & (1 << 0))
    {
    led_switch(LED0, state);
    }
    EPIT1->SR |= (1 << 0);
    }

    编译烧录

    将所有代码文件汇总,使用任意标准编译工具进行编译和烧录,即可完成 EPIT 定时器的配置和测试。

    总结

    通过以上配置流程,EPIT 定时器可轻松完成周期性任务任务需求,支持多种工作模式和灵活配置,适用于嵌入式系统中的各种实时控制需求。

    上一篇:C++判断两个立方体是否相等(全局函数和成员变量)
    下一篇:【转载学习】四大通信接口协议的神解释

    发表评论

    最新留言

    留言是一种美德,欢迎回访!
    [***.207.175.100]2025年04月09日 12时05分53秒