0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

剖析Zynq-7000系列全局定时器(GT)

FPGA开源工作室 来源:ZYNQ 作者:小默 2021-06-16 16:49 次阅读

每个 Cortex-A9 处理器都有自己的私有 32 位定时器和 32 位看门狗定时器,两个处理器共享一个全局 64 位定时器,这些定时器始终以 CPU 频率 (CPU_3x2x) 的 1/2 计时。

在系统层面,有一个 24 位看门狗定时器和两个 16 位三重定时器/计数器。

系统看门狗定时器的时钟频率为 CPU 频率 (CPU_1x) 的 1/4 或 1/6,或者可以由来自 MIO 引脚或来自 PL 的外部信号提供时钟。

两个三重定时器/计数器始终以 CPU 频率 (CPU_1x) 的 1/4 或 1/6 计时,用于计算来自 MIO 引脚或来自 PL 的信号脉冲的宽度。

下图显示了系统定时器的关系

本文重点说一下全局定时器。

全局定时器

全局定时器是一个 64 位的具有自动递增功能的递增计数器。

全局定时器是内存映射到与私有定时器相同的地址空间。

所有 Cortex-A9 处理器都可以访问全局定时器。

每个 Cortex-A9 处理器都有一个 64 位比较器,用于在全局定时器达到比较器值时声明一个私有中断。

计时

GTC 始终以 CPU 频率 (CPU_3x2x) 的 1/2 计时。

寄存器概述

有关GTC的注册概述如下表

411eb9ec-cac4-11eb-9e57-12bb97331649.png

全局定时器寄存器概述

怎么使用?

下面两个函数是在bsp standalone中的xtime_l.c中。

void XTime_SetTime(XTime Xtime_Global)

{

/* Disable Global Timer */

Xil_Out32((u32)GLOBAL_TMR_BASEADDR +(u32)GTIMER_CONTROL_OFFSET, (u32)0x0);

/* Updating Global Timer Counter Register */

Xil_Out32((u32)GLOBAL_TMR_BASEADDR +(u32)GTIMER_COUNTER_LOWER_OFFSET, (u32)Xtime_Global);

Xil_Out32((u32)GLOBAL_TMR_BASEADDR +(u32)GTIMER_COUNTER_UPPER_OFFSET,

(u32)((u32)(Xtime_Global》》32U)));

/* Enable Global Timer */

Xil_Out32((u32)GLOBAL_TMR_BASEADDR + (u32)GTIMER_CONTROL_OFFSET, (u32)0x1);

}

void XTime_GetTime(XTime *Xtime_Global)

{

u32 low;

u32 high;

/* Reading Global Timer Counter Register */

do

{

high = Xil_In32(GLOBAL_TMR_BASEADDR + GTIMER_COUNTER_UPPER_OFFSET);

low = Xil_In32(GLOBAL_TMR_BASEADDR + GTIMER_COUNTER_LOWER_OFFSET);

} while(Xil_In32(GLOBAL_TMR_BASEADDR + GTIMER_COUNTER_UPPER_OFFSET) != high);

*Xtime_Global = (((XTime) high) 《《 32U) | (XTime) low;

}

官方已经把全局定时器自动初始化好了,其频率为CPU频率的一半。

定义全局定时器的7个寄存器全部按照地址进行了宏定义,采用xil_io.h里的out32和in32两个函数进行读写操作:

#define Global_Timer_INTR XPAR_GLOBAL_TMR_INTR#define Global_Timer_Counter_Register0 XPAR_GLOBAL_TMR_BASEADDR+0x0U#define Global_Timer_Counter_Register1 XPAR_GLOBAL_TMR_BASEADDR+0x4U#define Global_Timer_Control_Register XPAR_GLOBAL_TMR_BASEADDR+0x8U#define Global_Timer_Interrupt_Status_Register XPAR_GLOBAL_TMR_BASEADDR+0xCU#define Comparator_Value_Register0 XPAR_GLOBAL_TMR_BASEADDR+0x10U#define Comparator_Value_Register1 XPAR_GLOBAL_TMR_BASEADDR+0x14U#define Auto_increment_Register XPAR_GLOBAL_TMR_BASEADDR+0x18U

接下来进行全局定时器的初始化和中断函数绑定:

GT_Write_Reg(Global_Timer_Control_Register,0);//停止全局定时器

GT_Write_Reg(Global_Timer_Counter_Register0,0);//清空计数器低32位

GT_Write_Reg(Global_Timer_Counter_Register1,0);//清空计数器高32位

GT_Write_Reg(Global_Timer_Interrupt_Status_Register,1);//清除中断标志位

GT_Write_Reg(Comparator_Value_Register0,TIMER_LOAD_VALUE);//加载比较器低32位

GT_Write_Reg(Comparator_Value_Register1,0);//加载比较器高32位

GT_Write_Reg(Auto_increment_Register,TIMER_LOAD_VALUE);//加载递增寄存器数值

Status = XScuGic_Connect(IntcInstancePtr, Global_Timer_INTR,

(Xil_ExceptionHandler)TimerIntrHandler,

0);//绑定全局定时器中断服务函数

if (Status != XST_SUCCESS)

{

return Status;

}

XScuGic_InterruptMaptoCpu(IntcInstancePtr,1,Global_Timer_INTR);//将27号全局定时器中断映射到CPU1

XScuGic_Enable(IntcInstancePtr, Global_Timer_INTR);//打开全局定时器中断(27号)

主程序中打开全局定时器开始计时

GT_Write_Reg(Global_Timer_Control_Register,//启动全局定时器

Auto_Increment_Bit|IRQ_Enable_Bit|Comp_Enable_Bit|Timer_Enable_Bit);

总结

全局定时器一共7个寄存器,打开SDK再想看看对应的BSP文档时就会发现还是很复杂的。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18202

    浏览量

    221915
  • 寄存器
    +关注

    关注

    30

    文章

    5020

    浏览量

    117608
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10409

    浏览量

    206452
  • 计数器
    +关注

    关注

    32

    文章

    2120

    浏览量

    92884
  • 定时器
    +关注

    关注

    23

    文章

    3143

    浏览量

    111999

原文标题:Zynq-7000系列全局定时器(GT)详解

文章出处:【微信号:leezym0317,微信公众号:FPGA开源工作室】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    简谈Xilinx Zynq-7000嵌入式系统设计与实现

    今天给大侠带来简谈Xilinx Zynq-7000嵌入式系统设计与实现,话不多说,上货。 Xilinx的ZYNQ系列FPGA是二种看上去对立面的思想的融合,ARM处理的串行执
    发表于 04-10 16:00

    定时器在STEP 7V5.x及STEP 7(TIA Portal)的不同处理步骤

    基于STEP 5的兼容性,仍然可以使用STEP7 S5定时器与计数器,定时器和计数器是全局的且基于编号寻址,当启动定时器/计数器时,需要预定义"值范围"及"精度"模式以决定
    的头像 发表于 04-07 11:35 246次阅读
    <b class='flag-5'>定时器</b>在STEP 7V5.x及STEP 7(TIA Portal)的不同处理步骤

    定时器会阻塞线程吗 定时器指令有哪几种

    定时器会阻塞线程吗 定时器指令有哪几种  定时器一般不会阻塞线程,但具体是否会阻塞取决于所使用的定时器实现方式和使用方式。 定时器指令可以分
    的头像 发表于 12-19 14:03 484次阅读

    用于千兆位收发器应用的全数字VCXO替代品(7系列/Zynq-7000)

    电子发烧友网站提供《用于千兆位收发器应用的全数字VCXO替代品(7系列/Zynq-7000).pdf》资料免费下载
    发表于 09-14 11:43 0次下载
    用于千兆位收发器应用的全数字VCXO替代品(7<b class='flag-5'>系列</b>/<b class='flag-5'>Zynq-7000</b>)

    Zynq-7000 SoC的安全启动应用说明

    电子发烧友网站提供《Zynq-7000 SoC的安全启动应用说明.pdf》资料免费下载
    发表于 09-13 11:46 1次下载
    <b class='flag-5'>Zynq-7000</b> SoC的安全启动应用说明

    Zynq-7000 SoC:嵌入式设计教程

    电子发烧友网站提供《Zynq-7000 SoC:嵌入式设计教程.pdf》资料免费下载
    发表于 09-13 09:20 3次下载
    <b class='flag-5'>Zynq-7000</b> SoC:嵌入式设计教程

    STM32 TIM—基本定时器

    STM32F4xx系列控制器有共有14个TIM定时器。其中2个高级控制定时器TIM1和TIM8、10 个通用定时器TIM2TIM5和TIM9TIM14、 2个基本
    的头像 发表于 07-22 17:05 3268次阅读
    STM32 TIM—基本<b class='flag-5'>定时器</b>

    STM32定时器(二)定时器中断

    常规定时器:基本定时器TIM6&TIM7)、通用定时器(TIM2~TIM5,TIM9~TIM14)、高级定时器(TIM1&TIM8)
    的头像 发表于 07-21 14:54 1801次阅读
    STM32<b class='flag-5'>定时器</b>(二)<b class='flag-5'>定时器</b>中断

    《基于“矿板”低成本学习Zynq系列》之八-定时器等外设测试

    前面我们测试了DDR,片上memory,这一篇继续测试片上外设,定时器等,以确认SOC是否正常。
    的头像 发表于 07-20 09:02 495次阅读
    《基于“矿板”低成本学习<b class='flag-5'>Zynq</b><b class='flag-5'>系列</b>》之八-<b class='flag-5'>定时器</b>等外设测试

    Xilinx ZYNQ UltraScale+系列产品介绍

    Zynq UltraScale+MPSoC是Xilinx推出的第二代多处理SoC系统,它在第一代Zynq-7000的基础上进行了全面升级。
    的头像 发表于 06-09 10:07 1745次阅读
    Xilinx <b class='flag-5'>ZYNQ</b> UltraScale+<b class='flag-5'>系列</b>产品介绍

    什么是软件定时器?软件定时器的实现原理

    软件定时器是用程序模拟出来的定时器,可以由一个硬件定时器模拟出成千上万个软件定时器,这样程序在需要使用较多定时器的时候就不会受限于硬件资源的
    的头像 发表于 05-23 17:05 1789次阅读

    CKS32F4xx系列产品的定时器使用-基本特征和定时操作

    这一课我们将介绍CKS32F4XX系列产品的定时器使用,CKS32F4XX的定时器功能十分强大,包含2个高级控制定时器,8个普通定时器,2个
    的头像 发表于 05-19 09:18 537次阅读
    CKS32F4xx<b class='flag-5'>系列</b>产品的<b class='flag-5'>定时器</b>使用-基本特征和<b class='flag-5'>定时</b>操作

    剖析STM32-定时器3

    定时器作为微控制器不可缺少的外设,在STM32中也是如此。相信不少初学者学到定时器的时候对STM32的学习热情就大打折扣甚至想要放弃了,因为这一部分知识确实比较复杂。但是,如果你在之前对GPIO、串口通信、外部中断的学习中把这些外设掌握了的话,学习这个新知识并不难。
    的头像 发表于 04-21 15:14 1650次阅读
    <b class='flag-5'>剖析</b>STM32-<b class='flag-5'>定时器</b>3

    剖析STM32-定时器2

    定时器作为微控制器不可缺少的外设,在STM32中也是如此。相信不少初学者学到定时器的时候对STM32的学习热情就大打折扣甚至想要放弃了,因为这一部分知识确实比较复杂。但是,如果你在之前对GPIO、串口通信、外部中断的学习中把这些外设掌握了的话,学习这个新知识并不难。
    的头像 发表于 04-21 15:14 903次阅读

    剖析STM32-定时器1

    定时器作为微控制器不可缺少的外设,在STM32中也是如此。相信不少初学者学到定时器的时候对STM32的学习热情就大打折扣甚至想要放弃了,因为这一部分知识确实比较复杂。但是,如果你在之前对GPIO、串口通信、外部中断的学习中把这些外设掌握了的话,学习这个新知识并不难。
    的头像 发表于 04-21 15:14 1364次阅读
    <b class='flag-5'>剖析</b>STM32-<b class='flag-5'>定时器</b>1