基于ZYNQ-7000开发板的调试系列(5)

本文是基于ZYNQ-7000开发板调试系列的第五篇,重点介绍了如何利用TTC模块开启中断控制两组不同频率的流水灯。通过修改Block设计,启用TTC0和TTC1,并编写PS程序实现中断功能。文章详细讲解了TTC的初始化、配置和中断处理函数。
摘要由CSDN通过智能技术生成

程序中断(2)

这一部分是基于基于ZYNQ-7000开发板的调试系列(4)继续展开的,主要的部分是需要两个定时器开启中断开始。这一部分主要是需要使用TTC,完成2组流水灯的同时工作,两组的频率也不一致。TTC Block Diagram
[参考自ZYNQ7000 TRM (Page.245-249)]
TTC可以完成的工作比较多,其实TTC的使用是可以控制GPIO的占空比。这个的最简单的使用例程就是做一个呼吸灯。但是需要使用到PL的PWM,这里就先不涉及这一部分的内容了。
[参考自ZYNQ进阶之路8–PS端实现EMIO TTC PWM输出(与PL端PWM联合使用)]

1. 修改Block

1. 修改ZYNQ7 Processing System

ZYNQ7 Processing System
其实这里主要就是需要把TTC0和TTC1打开,这里提供的EMIO是可以向外输出波形的,这里可以并不需要,所以这里可以不用向外提供接口。具体的Diagram图大概是这个样子的。Diagram
然后这里就没有其他需要修改的部分了,这里生成Bitstream即可。

2. 编写PS程序

这一部分的程序编写其实和上一部分几乎是一致的,和上一部分最大的不同就是TTC的使能和控制。
其中,引入必须引入的库:

#include "xttcps.h"

然后是关于TTC的函数:

  1. 初始化
XTtcPs_Config *XTtcPs_LookupConfig(
	u16 DeviceId
);
s32 XTtcPs_CfgInitialize(
	XTtcPs *InstancePtr,
    XTtcPs_Config * ConfigPtr, 
    u32 EffectiveAddr
);
  1. 定时器配置
s32 XTtcPs_SetOptions(
	XTtcPs *InstancePtr, 
	u32 Options
); //关于TTC的模式配置
void XTtcPs_CalcIntervalFromFreq(
	XTtcPs *InstancePtr, 
	u32 Freq,
	XInterval *Interval, 
	u8 *Prescaler
); //通过用户给定的频率计算分频和间隔的数值,并赋值到指定的地址上
void XTtcPs_SetInterval(
	XTtcPs *InstancePtr;
	XInterval interval
); // 该函数实质上就是往寄存器里写入值
void XTtcPs_SetPrescaler(
	XTtcPs *InstancePtr, 
	u8 PrescalerValue
); // 该函数按照指定的分频向寄存器内写入值
void XTtcPs_EnableInterrupts(
	XTtcPs *InstancePtr, 
	u32 InterruptMask
); // 该函数实质上就是往寄存器里写入值,使能TTC中断

定时器开始

XTtcPs_Start(
	XTtcPs *InstancePtr
); // 该函数实质上就是往寄存器里写入值,开始计数

中断内函数

u32 XTtcPs_GetInterruptStatus(
	XTtcPs *InstancePtr
); // 检测是否已经触发了中断
void XTtcPs_ClearInterruptStatus(
	XTtcPs *InstancePtr,
	u32 statusEvent
); // 如果触发中断,该部分解除中断

其余部分和上一部分几乎一致。程序如下:

#include "xparameters.h"
#include "xgpio.h"
#include "xgpiops.h"

#include "xttcps.h"
#include "xstatus.h"
#include "xscugic.h"
#include "xil_exception.h"

#define PS_GIC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID

#define LEDG1_INTR_ID XPAR_XTTCPS_0_INTR
#define LEDG2_INTR_ID XPAR_XTTCPS_3_INTR

#define LED1_INTR_DEVICE_ID XPAR_XTTCPS_0_DEVICE_ID
#define LED2_INTR_DEVICE_ID XPAR_XTTCPS_3_DEVICE_ID

#define LED1_FREQ_HZ	2
#define LED2_FREQ_HZ 	3

#define PL_GPIO_DEVICE_ID XPAR_GPIO_0_DEVICE_ID
#define PS_GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID

#define PL_LED_CHANNEL 1
#define PL_KEY_CHANNEL 2

#define PS_BANK XGPIOPS_BANK0

#define PL_LED0 0x01
#define PL_LED1 0x02
#define PL_LED2 0x04
#define PL_LED3 0x08
#define PL_LED4 0x10

#define PS_LED0 0x09
#define PS_LED1 0x00

typedef struct {
   
	u32 OutputHz;	/* Output frequency */
	XInterval Interval;	/* Interval value */
	u8 Prescaler;	/* Prescaler value */
	u16 Options;	/* Option settings */
} TmrCntrSetup;

volatile u8 led_status = 0x00;
volatile u8 state1;
volatile u8 state2;

volatile u8 plLed;
volatile u8 psLed;

XGpio plGpio;
XGpioPs psGpio;

XTtcPs psTimer1;
XTtcPs psTimer2;

XScuGic	psGic;

static TmrCntrSetup timer1Setup = {
   LED1_FREQ_HZ, 0, 0, 0};
static TmrCntrSetup timer2Setup = {
   LED2_FREQ_HZ, 0, 
在使用外部时钟源的情况下,需要在Vitis中编写应用程序并指定使用外部时钟源的相关信息。具体步骤如下: 1. 打开Vitis,创建一个新的工程。 2. 在工程中添加TTC定时器IP核,并配置外部时钟源。 3. 在工程中创建一个新的应用程序项目。 4. 在应用程序中包含TTC定时器的头文件,例如: ```c #include "xttcps.h" ``` 5. 声明TTC定时器的相关变量,例如: ```c XTtcPs Timer; XTtcPs_Config *Config; ``` 6. 在应用程序中初始化TTC定时器并指定使用外部时钟源,例如: ```c Config = XTtcPs_LookupConfig(XPAR_XTTCPS_0_DEVICE_ID); XTtcPs_CfgInitialize(&Timer, Config, Config->BaseAddress); XTtcPs_SetOptions(&Timer, XTTCPS_OPTION_EXTERNAL_CLK); ``` 在上述代码中,`XTtcPs_LookupConfig`函数用于查找TTC定时器的配置信息,`XTtcPs_CfgInitialize`函数用于初始化TTC定时器,`XTtcPs_SetOptions`函数用于指定使用外部时钟源。 7. 在应用程序中使用TTC定时器进行定时操作,例如: ```c XTtcPs_SetInterval(&Timer, 100000000); // 设置定时器的周期为100000000个时钟周期 XTtcPs_Start(&Timer); // 启动定时器 while(1) { if(XTtcPs_IsExpired(&Timer)) { // 检查定时器是否到期 // 定时器到期后执行的操作 XTtcPs_ClearInterruptStatus(&Timer, XTTCPS_IXR_INTERVAL_MASK); // 清除定时器中断标志位 XTtcPs_Restart(&Timer); // 重新启动定时器 } } ``` 在上述代码中,`XTtcPs_SetInterval`函数用于设置定时器的周期,`XTtcPs_Start`函数用于启动定时器,`XTtcPs_IsExpired`函数用于检查定时器是否到期,`XTtcPs_ClearInterruptStatus`函数用于清除定时器中断标志位,`XTtcPs_Restart`函数用于重新启动定时器。 通过以上步骤,可以在Vitis中编写应用程序并指定使用外部时钟源。需要注意的是,在使用外部时钟源时,需要确保外部时钟的频率与TTC定时器的配置一致,以确保定时器能够正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值