ZYNQ:【1】深入理解PS端的TTC定时器(Part1:原理+官方案例讲解)

本文详细介绍了ZYNQ7020系统级芯片中的TTC定时器,包括其结构、功能、操作模式和编程模型。通过SDK分析,展示了如何建立工程,设置TTC定时器进行中断和PWM输出。文章还探讨了计数器的使能、停止、重启步骤以及中断处理,提供了编程示例,特别强调了TTC在安全模式和非安全模式下的工作,并讨论了事件定时器/脉宽计数器的操作。

碎碎念:好久不见,甚是想念!本期带来的是有关ZYNQ7020的内容,我们知道ZYNQ作为一款具有硬核的SOC,PS端很强大,可以更加便捷地实现一些算法验证。本文具体讲解一下里面的TTC定时器,之后发布的Part2将基于具体项目出发,实现PS端单核进行六路不等长占空比的PWM输出~

虽然最后对我自己毕业好像没有什么帮助QAQ,但是毕竟花费了一些时间阅读手册等内容,还是打算记录一下供大家参考。

目录

1 TTC原理分析

1.1 主要特点

1.2 结构框图

1.3 功能描述

1.3.1 操作模式

1.3.2 事件定时器/脉宽计数器(Event Timer)操作

1.4 寄存器概述

1.5 编程模型

1.5.1 计数器使能的步骤

1.5.2 计数器停止的步骤

1.5.3 计数器重启的步骤

1.5.4 事件计数器(脉宽计数器)使能的步骤

1.5.5 清除中断和确认的步骤

1.6 计数器时钟输入的选择

2 SDK分析

2.1 工程建立

2.2 案例分析

1.设置中断系统:SetupInterruptSystem()

2.设置Ticker定时器:SetupTicker() 

3.设置PWM定时器:SetupPWM()

4.逐渐修改占空比:WaitForDutyCycleFull()

5.停止计数器:XTtcPs_Stop()


1 TTC原理分析

这一部分我们直接按照UG585的思路,进行分析和介绍,由于原文的内容本身是英文理解起来还是需要一些经验(尽管更推荐去阅读原文部分)。

TTC包含了三个独立的定时器,分别是上图中的Timer/Clock 0、Timer/Clock 1、Timer/Clock 2。从左下角可以看到在PS端包含两个TTC,分别是TTC0和TTC1,因此两个TTC共包含6个独立的定时器。TTC控制器可以通过修改nic301_addr_region_ctrl_registers.security_apb [ttc1_apb]这个寄存器的位,来实现对于安全模式(secure mode)和非安全模式(non-secure mode)的切换。对于这两种模式的内容可以参考下面:

传送门

Secure mode and Non-secure mode:
这两种模式来源于ARM TrustZone技术,ARM在CPU的常规模式之外引入了一种称为“安全模式”的特殊CPU模式,建立了“安全世界”和“正常世界”之间的的概念。默认情况下,安全世界访问正常世界的所有状态,反之则不然。由于ARM基本使用的都是基于存储映射的结构,我的理解是通过这两种模式的分隔,来实现对于重要寄存器的保护。

1.1 主要特点

每个TTC有如下特点:

1.三个独立16位预分频器和16位的向上/向下计数器。(向上:0,1,2,3,4...  向下:9,8,7,6...)

2.可选的时钟源输入(内部PS总线时钟:CPU_1x,内部时钟:PL,外部时钟:MIO)

3.对于TTC内部每一个counter,都各自有一个中断

4.在一定间隔内的溢出中断,或者计数匹配到设定的值时会发出中断

5.产生波形输出,可以通过MIO或者PL(EMIO)

1.2 结构框图

通过上面的结构框图,对于TTC中第一个计数器Timer/Clock 0的时钟输入、波形输出信号的多路控制是通过slcr.MIO_PIN_xx寄存器实现的,默认情况下使用EMIO接口。

1.3 功能描述

每个预分频模块(Pre-scaler)都可以独立设置为使用PS内部总线时钟或者外部时钟(来自MIO或者PL)。对于外部时钟输入,通过使用SLCR寄存器来选择具体的信号输入。预分频模块可以将输入时钟在/2和/65536之间进行分频,当如分频寄存器为0的时候,会对时钟进行二分频,之后输出给后面的计数器。

计时器可以设置为增计数、减计数,并且通过设置间隔寄存器的值,可以控制计数的范围。同时可以比较三个匹配寄存器的值和计数器(一个TTC包含3个计数器Counter和3组匹配寄存器)的值,产生中断信号。

中断模块组合了各种类型的中断:计数器间隔中断(Interval Interrupt)、计数器匹配中断(Match Interrupt)、计数器溢出中断(Overflow Interrupt)、事件计时器溢出。每种类型都可以单独启用。

1.3.1 操作模式

一个TTC中的每个计数器模块,都可以独立编程,并以以下两种模式中的任何一种运行。

间隔模式(Interval mode):

通过修改计数器控制寄存器(Counter Control register)的DEC位,可以控制计数器的计数方向是+1还是-1。通过修改间隔计数器(Interval mode)的值可以控制计数的范围是0到间隔计数器的值。当计数值经过0的时候,会产生一个计数器间隔中断(Interval Interrupt)。当计数器的值等于匹配计数器(Match register)值的时候,会产生一个匹配中断(Match Interrupt)。

溢出模式(Overflow mode):

计数器在0x0000和0xFFFF之间连续的+1或者-1变化,并通过修改计数器控制寄存器的DEC位来控制计数的方向。当计数值经过0的时候,会产生一个溢出中断(Overflow Interrupt)。当计数器的值等于匹配计数器值的时候,会产生一个匹配中断。

1.3.2 事件定时器/脉宽计数器(Event Timer)操作

从名字脉宽计数器,可以推断出其功能是对外部输入信号的脉宽进行测量,原理有一些类似电机差分编码器的M法测速。

事件定时器内部有一个对用户不可见的16位内部计数器(Internal Counter),该计数器被CPU_1x的时钟控制,其满足如下两个条件:

1.当外部脉冲的非计数阶段,被重置为0

2.在外部脉冲的计数阶段,开始增加

修改事件定时器控制内部计数器的行为,主要通过三个位来控制:

1 E_En bit 使能位,等于0时,将内部计数器复位到0,并停止计数

2 E_Lo bit 指定外部脉冲的计数相位

3 E_Ov bit 指定如何处理当内部计数器溢出时,如何处理。

     当为0的时候,溢出导致E_En置为0;

当为1的时候,溢出导致内部计数器继续循环计数;

在另一个寄存器的控制下,可以决定溢出时是否产生中断(而与E_Ov bit本身的值无关)。

当外部计数脉冲的计数相位结束的时候,会使用内部计数器的非零计数值对事件寄存器(Event Register)的值进行更新。因此,这个值展示了外部脉冲的宽度。由于内部计数器被CPU_1x的时钟控制,因此脉冲宽度是由CPU_1x的时钟周期数来衡量的。

当外部计数脉冲的计数相位阶段,如果内部计数器由于溢出被重置为0,那么事件寄存器将不会被更新,并保持上次非溢出计数操作的旧值。

1.4 寄存器概述

功能

名称

概述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlexYiWang

不要打赏,想要一个赞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值