AXI Timer IP核使用说明

AXI Timer是提供定时技术功能的集成IP核,具有时间生成、事件捕获、产生PWM波以及产生中断的功能,下面具体讲述Timer IP核的使用说明。

1 Timer组成结构

Timer定时器计数器的组成结构框图如图所示:
在这里插入图片描述
主要有4部分组成

1 定时寄存器:包含2个状态/控制寄存器,加载寄存器;
2计数器:2个32位计数器;
3 中断;
4 PWM波形产生。

Timer可以配置的应用模式有:

1 生成模式;
2 捕获模式;
3 PWM脉宽调制模式;
4 级联模式。

1 生成模式

生成模式下,设置加载寄存器 (load register)为初始值,递增或者递减计数,计数值溢出后,依据定时器控制寄存器(TCSR)中的自动重载/保持(ARHT)位执行重新加载 load regster寄存器中的值或者保持不变。如果TCSR中的TINIT中断使能为1,则产生一个中断,generate out一个周期置位1,需要手动清除中断标志,

2 捕获模式

外部捕获触发(capture trig)置位1时,计数器加载 load regieter,根据TCSR寄存器的递增递减标志 UDT 相应计数,同时中断标志TINT置位1,捕获模式标定时间同时产生一个中断。

3 PWM模式

用于产生PWM波形,计数器0产生脉宽周期,计数器产生占空比,两者共同产生PWM。

4 级联模式

级联模式下,两个32位计数器合并为一个64位的计数器。可用于时间生成和事件捕获模式,由TSCR0寄存器控制。

5 中断

中断的使能位是TCSR中的ENIT位,ENIT控制中断的使能和禁用。中断状态位TINT不能写入,其根据计数值自动置位。

2 接口资源

AXI Timer IP核接口资源如下所示:

接口输入输出描述
s_axi_aclk输入时钟
s_axi_aresetn输入复位
s_axi_*输入axi总线
capture trig0输入捕获模式下的输入
capture trig1输入捕获模式下的输入(级联模式下,不使用)
freeze输入
generate out0输出当计数值为全0(递减)或者全1(递增)时,置位一个周期
generate out1输出当计数值为全0(递减)或者全1(递增)时,置位一个周期
interrupt输出中断使能下,产生中断信号
pwm0输出PWM输出

Timer使用时需要根据功能配置相应模式,需要配置寄存器,Timer寄存器的地址空间如下所示:

寄存器地址寄存器名称描述
0hTCSR0Timer 0 控制/状态寄存器
04hTLR0Timer 0 加载寄存器
08hTCR0Timer 0 计数寄存器
0Ch-0FhRSVD保留
10hTCSR1Timer 1 控制/状态寄存器
14hTLR1Timer 1 加载寄存器
18hTCR1Timer 1 计数寄存器
1Ch-1FhRSVD保留

下面详细介绍个寄存器含义

1 控制/状态寄存器0(TCSR0)

TCSR0寄存器对应位表示含义如下图所示:
在这里插入图片描述
相应含义如下:

bit位名称访问类型描述
31 - 12ReservedN/A保留
11CASC读/写0表示非级联模式,1表示级联模式
级联模式下,load register0表示低32位值,load register1表示高32位值
需要在使能定时/计数前使能CASC 位
10ENALL读/写使能time0和time1
0对定时器没有影响,值1会使能ENALL、ENT0和ENT1
9PWMA0读/写0不使能PWM,1使能PWM,
PWM模式需要time0如何timer1共同使用,
PWM模式下,MDT0和MDT1必须为0,C_GEN0_ASSERT和C_GEN1_ASSERT必须为1
8T0INT读/写中断产生标志
写0没有任何影响,写1表示清除中断标志
7ENT0读/写0不使能timer0,1使能timer0
6ENIT0读/写0禁止中断,1使能中断
5LOAD0读/写0不加载TLR0值,1加载TLR0值,设置该值时,需要将ENT0 位清0
4ARHT0读/写重载/保持选择,0保持,1表示重载
3CAPT0读/写0 不使能外部事件捕获,1使能外部事件捕获
2GENT0读/写0 不使能外部事件生成,1使能外部事件生成
1UDT0读/写递增递减计数选择,0递增计算。1递减计数
0MDT0读/写模式选择,0表示生成模式,1表示捕获模式

2 Load Register (TLR0 and TLR1)加载寄存器

计数时预先加载的值。

3 Timer/Counter Register (TCR0 and TCR1)计数计数器

计数时,计数的寄存器

4 控制/状态寄存器0 1 (TCSR1)

TCSR1寄存器相应位表示含义如下图所示:
在这里插入图片描述

TCSR1寄存器和TCSR0寄存器唯一差别是,没有CASC 标志位,级联模式的选择使用TCSR0即可,不需要再使用标志位。

使用说明该

1生成模式

1) 启动是,第一步将LOAD置位1,加载TLR中的值,ARTH自动加载或者保持位0或者1,LOAD置位是同样操作。ENT置位1时,计数器从TLR中的值开始递增或者递减,因此在ENT置位1之前或者同时,置位LOAD为1;
2) 如果ARTH置位1,则在递增下从全1转换到全0或者递减下从全0转换到全1,自动加载TLR中值。
如果GENT使能,则产生一个时钟周期的高脉冲;
3) 如果ARTH置位0,则在递增下从全1转换到全0或者递减下从全0转换到全1,当前值保持。
如果GENT使能,则产生一个时钟周期的高脉冲;
4) 如果设置为递减计数,则计数周期为
定时周期 = (TLRx + 2) * AXI_CLOCK_PERIOD
5) 如果设置为递增计数,则计数周期为
定时周期 = (MAX_COUNT - TLRx + 2) * AXI_CLOCK_PERIOD

2 捕获模式

1) 捕获信号可以设置为低有效或者高有效;
2) 捕获信号有效时,计数器中的值写入TLR中,称为捕获值;
3) 如果ARTH位为0,则TLR保持捕获值直到读取捕获值,捕获值未读取,则下一捕获信号触发时,丢到捕获值;
4) 如果ARTH置位为1,则捕获信号发生,TLR寄存器更新捕获值,不论之前捕获值是否已经读取;
5) 计数模式可以配置为递增模式或者递减模式;

3 PWM

1) PWM模式下,TCSR0和TCSR1的MDT为必须为0,表示生成模式,PWMA0位必须为1表示当前是PWM模式;
2) TCSR0和TCSR1中的GENT位必须置位为1;
3) generate out信号必须为高有效;
4) 计数模式可以配置为递增模式或者递减模式;
5) PWM的周期由TLR0中加载值确定,高电平周期由TLR1中加载值确定;
当配置为递增计数时

PWM周期 = (MAX_COUNT - TLR0 + 2) * AXI_CLOCK_PERIOD
高电平周期= (MAX_COUNT - TLR1 + 2) * AXI_CLOCK_PERIOD
当配置为递减计数时
PWM周期 = (TLR0 + 2) * AXI_CLOCK_PERIOD
高电平周期 = (TLR1 + 2) * AXI_CLOCK_PERIOD

4 级联模式

级联模式下,TCSR0作为控制/状态寄存器,TCSR1不起作用。
1) enable_timer2使能,表示使用级联模式;
2) 定时器的宽度设置为32,表示应用到每个定时器的宽度;
3) 使用到TLR0和TLR1,其中TLR1表示高32位,TLR0表示低32位;
4) TCSR0,generate out0,capture trig0有效,且TCSR0中的CASC位置位1,需要在ENT置位前为1,此时TCSR1,generate out1,capture trig1无效;
5) 如果设置为递减计数,则计数周期为
定时周期 = (TLRx + 4) * AXI_CLOCK_PERIOD
如果设置为递增计数,则计数周期为
定时周期 = (MAX_COUNT - TLRx + 4) * AXI_CLOCK_PERIOD

5 中断

1) 中断在中断发生时,且定时器使能后产生,产生高电平信号;
2) 具有两个定时器,中断信号或运算产生,如果检测到中断信号,轮询TCSR中的TINT位确定中断源;
3) TCSR中的TINT位写1清除中断,写0不起作用;
4) 级联模式下,只用定时器0中断有效。

4 AXI Timer IP核使用

AXI Timer IP核配置界面如下图所示:

在这里插入图片描述
经过上述介绍,AXI Timer IP核的配置可以说很简单。
1) Width of timer/counter 定时计数器的宽度,根据需要选择8、16或者32;
2) Active state of Capture Trigger 选择为低有效或者高有效;
3) Active state of Generate Out Singal选择为低有效或者高有效;
定时器2的配置和定时器1配置相同,根据需要选择相应配置。
以上为AXI Timer IP核使用说明。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个参考的 MicroBlaze 软核 AXI Timer IP 核精确微秒级延时函数的示例代码: ```c #include "xparameters.h" #include "xtmrctr.h" #define TIMER_DEVICE_ID XPAR_AXI_TIMER_0_DEVICE_ID #define TIMER_LOAD_VALUE 9999 // 设置定时器计数器的最大值 static XTmrCtr Timer; // 定时器实例 void delay_us(u32 us) { u32 tCount = 0; // 定时器计数器 u32 tDelta = 0; // 计算微秒延时的差值 u32 tTicks = 0; // 计算微秒延时的时钟周期数 XTmrCtr_Initialize(&Timer, TIMER_DEVICE_ID); // 初始化定时器 tDelta = (us * XPAR_CPU_CORE_CLOCK_FREQ_HZ) / 1000000; // 计算微秒延时的差值 tTicks = tDelta / (TIMER_LOAD_VALUE + 1); // 计算微秒延时的时钟周期数 XTmrCtr_SetLoadReg(Timer.BaseAddress, 0, TIMER_LOAD_VALUE); // 设置定时器计数器的最大值 XTmrCtr_LoadTimerCounterReg(Timer.BaseAddress, 0); // 重置定时器计数器 while (tCount < tTicks) { // 循环等待计时器计数 if (XTmrCtr_IsExpired(Timer.BaseAddress, 0)) { // 如果计时器计数溢出 tCount++; // 增加计数器计数 XTmrCtr_LoadTimerCounterReg(Timer.BaseAddress, 0); // 重置计时器计数器 } } } ``` 该函数接受一个以微秒为单位的参数,会在给定的时间内阻塞程序执行。函数内部使用 MicroBlaze 软核的 AXI Timer IP 核进行计时,并根据计时器的时钟频率和计时器计数器的最大值计算出微秒延时的差值和时钟周期数。然后,在一个循环中,该函数会等待计时器计数达到预设的时钟周期数,以实现精确的微秒级延时。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值