ZYNQ AXI_Timer 中断
REVIEW
关于ZYNQ中断: ZYNQ PS_GPIO中断-CSDN博客 ZYNQ AXI_GPIO_INT-CSDN博客 ZYNQ 定时器中断-CSDN博客
在一些应用场景中,可能需要使用到多个定时器,除了选择使用 PS 侧其他定时器外,也可以使用 PL 侧逻辑定时器。
|
1. 今日摸鱼任务
创建并使用AXI_TIMER, 定时器1:1s MIO7(PS_LED)闪烁 定时器2:0.5s EMIO54(PL_LED)闪烁 |
小梅哥教材: 03_【裸机教程】基于C编程的Zynq裸机程序设计与应用教程v2.4.5.pdf 第七章 基于AXI Timer的定时器中断实验(没用串口) |
2. AXI_Timer 核
AXI Timer IP 核,全称为
AXI Timer/Counter
,是一个
32/64 位定时器模块,可连接到
AXI4-Lite
接口。通过计数值以及接入
axi_timer 的计数时钟周期,可以在
PS
内取得比较精确的计时。
(单个32位,级联64位)
结构框图如下图:
|
AXI4-Lite Interface
:
AXI4 Lite
接口模块实现
AXI4 Lite 从接口,用于访问内存映射定时器寄存器。
|
Timer Register
:为每个定时器
/
计数器实现一组
32 位寄存器。
这组寄存器包含加载寄存器、定时器/计数器寄存器和控制/状态寄存器。
|
32-bit Counter
:定时器
/
计数器模块有两个
32 位计数器。
每个计数器可配置为递增/递减计数,并可使用加载寄存器中的值加载。
|
Interrupt Counter
:中断控制模块,根据工作模式生成单个中断。
|
Pulse Width Modulation (PWM):
PWM 模块生成具有指定频率和占空比的脉冲信号
PWM0
。
使用定时器 0 用于 PWM0 周期,定时器 1 用于PWM0 输出宽度。
|
3. AXI_Timer 寄存器
3.1 寄存器一览 |
3.2 控制/状态寄存器 0 (TCSR0) |
31-12 保留 11 CASC 使能定时器的级联模式 1启用级联模式,做低32位。 10 ENALL 使能所有定时器 1 写入该位将设置 ENALL、ENT0(TCSR0)和 ENT1(TCSR1)。 0 写入此寄存器将清除 ENALL,但对 ENT0 和 ENT1 没有影响。 9 PWMA0 使能定时器 0 的脉宽调制 PWM 模式,MDT0(TCSR0)和 MDT1(TCSR1)必须为 0。 8 T0INT 定时器 0 中断 捕获模式且定时器已使能,则此位表示已发生捕获。 生成模式,则该位表示计数器已翻转。必须通过写入1来清除。 7 ENT0 使能定时器 0 0禁用定时器(计数器停止) 1使能定时器(计数器运行) 6 ENIT0 使能定时器 0 的中断 使能此定时器中断信号的断言。对 TCSR0 中的中断标志 (T0INT)没有影响。 0禁用中断信号 1使能中断信号 5 LOAD0 加载定时器 0 1使用 TLR0 中的值加载计时器 与 ENT0 位一起清除 4 ARHT0 自动重新加载/保持定时器 0 生成模式时,该位确定计数器是重新加载生成值并继续运行还是保持在终止值。 在捕获模式下,该位确定新的捕获触发器覆盖或保留先前捕获的值。 0保持计数器或捕获值。在提供外部捕获之前,必须读取TLR0。 1重新加载生成值或覆盖捕获值。 3 CAPT0 使能外部捕获触发器定时器 2 GENT0 使能外部生成信号定时器 0 1 UDT0 递增/递减计数定时器 0递增 1递减 0 MDT0 定时器 0 模式 0生成模式 1捕获模式 |
3.3 加载寄存器(TLR0 和 TLR1) 32b |
Timer/Counter Load Register
计数器宽度配置为小于 32
位时,加载寄存器值在
TLR0
和
TLR1 中右对齐。
最低有效计数器位始终映射到加载寄存器的
bit0
。
级联模式下,
TLR0
具有生成值的最低有效
32
位,而
TLR1 在生成模式下应具有生成值的最高有效位。
|
3.4 定时器/计数器寄存器(TCR0 和 TCR1)32b |
Timer/Counter Register
计数器宽度配置为小于
32
位时,计数值在
TCR0
和
TCR1
中右对齐。
在级联模式下,
TCR0
具有
64
位计数器中最低有效位的 32 位,
TCR1
具有最高有效位。
|
3.5 控制/状态寄存器 1(TCSR1) |
与TCSR0相比,减少了第11位 其他功能与其对应 |
4. 工作模式
3.1 生成模式 |
在生成模式下,会将加载寄存器(Load Register)中的值加载到计数器中。当计数器使能时,根据定时器控制状态寄存器(TCSR
)中向上
/
向下(UDT)位,递增/减计数。在计数器进位转换时,计数器停止或重新加载生成值,并在达到超时值后,按照 TCSR
中自动重新加载
/保持(
ARHT)位的选择继续计数。定时器中断状态(TINT
)
如果使能,则
GenerateOut
信号在一个时钟周期内被驱动为
1
。
如果使能,当达到超时值时,定时器的中断信号被驱动为1。通过向定时器中断寄存器写入
1 来清除中断。使用此模式生成具有指定间隔的重复中断或外部信号。
|
3.2 捕获模式 |
在捕获模式下,当外部捕获信号时,计数器的值存储在加载寄存器中。检测到捕获事件时,也会在 TCSR
中设置
TINT
位。根据
TCSR
中
UDT
位的选
择,计数器可配置为该模式的递增或递减计数器。自动重新加载
/
保持(ARHT)位控制在清除前一个
TINT标志之前,是否用新的捕捉值覆盖捕捉值。使用此模 式对外部事件进行时间标记,同时生成中断。
|
3.3 脉宽调制模式 |
在脉宽调制(PWM
)模式下,两个定时器
/计数器成对使用,以产生具有指定频率和占空因数的输出信号(
PWM0
)。定时器
0
设置周期,定时器
1 设置PWM0
输出的高电平时间。
|
3.4 级联模式 |
在级联模式下,两个定时器/
计数器级联为单个
64
定时器
/计数器。级联计数器可以在生成和捕获模式下工作。
TCSR0 用作级联计数器的控制和状态寄存器。在此模式下,
TCSR1 被忽略。
当需超过 32
位宽的定时器
/计数器时,使用此模式。级联操作需要将定时器
0
和定时器
1
成对使用。定时器
1
的计数事件是定时器
0
从全
1
翻转到全
0,反之亦然。
|
5. Block Design
AXI_TIMER保持默认设置 |
6. SDK
PS_GPIO、 SCU_GIC |
ZYNQ PS_GPIO中断-CSDN博客 |
AXI_TIMER.h |
#ifndef AXI_Timer_AXI_Timer_H_ #include "xscutimer.h"
//这里计算值,需选择 XTC_DOWN_COUNT_OPTION 配置为向下计数(默认为向上计数) extern XTmrCtr AXI_Timer0; //定时器实例 void AXI_Timer_Init(XTmrCtr *TmrCtrInstPtr,uint16_t DevId); #endif /* AXI_Timer_AXI_Timer_H_ */ |
AXI_TIMER.c |
/** #include "AXI_TIMER.h"
/** //设置重装载值,这个值在计数器启动时被载入 //启动计数器 void AXI_Timer0_IRQ_Handler(void *CallBackRef, u8 TmrCtrNum) |
main.c |
//系统头文件 //Xilinx头文件 #include "AXI_TIMER.h"
#define PL_LED (54+0) int main(void) //初始化 PS 端 GPIO } } |
每次检测到定时标志,LED翻转
摸鱼结束~