ZYNQ-定时器中断

通过定时器产生中断,每200ms控制PS LED灯亮灭。

block design和之前的GPIO-MIO配置一致。

代码设计:

#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"
#include "xscugic.h"
#include "xil_exception.h"
#include <xil_printf.h>
#include "xplatform_info.h"
#include "xscutimer.h"

#define GPIO_DEVICE_ID		XPAR_XGPIOPS_0_DEVICE_ID
#define INTC_DEVICE_ID		XPAR_SCUGIC_SINGLE_DEVICE_ID
//GPIO的中断号:XPAR_XGPIOPS_0_INTR,即52
#define TIMER_DEVICE_ID		XPAR_XSCUTIMER_0_DEVICE_ID
#define MIO_LED            0 //MIO 0
#define TIMER_IRPT_INTR		XPAR_SCUTIMER_INTR
// UG585手册中设定的私有定时器的频率是1/2的CPU频率 = 333.3333435Mhz  计数0.2s,则计数器:0.2*333.3333435=3F940AC
#define TIMER_LOAD_VALUE	0x3F940AC  //0.2s

//定义变量
XGpioPs Gpio;  //GPIO器件的驱动实例
XScuGic Intc;  //GIC器件的驱动实例
XScuTimer Timer;	/* Cortex A9 Scu Private Timer Instance */

void mio_init(XGpioPs *gpio_ptr);
void timer_init(XScuTimer *timer_ptr);
void timer_intr_setup(XScuGic *intr_ptr,XScuTimer *timer_ptr);
void timer_intr_handler(void *CallBackRef);

int main(){
	xil_printf("SCU Timer Interrupt Example Test \r\n");

	//GPIO MIO初始化和配置
	mio_init(&Gpio);
	//定时器的初始化和配置
	timer_init(&Timer);
	//定时器中断的初始化和配置
	timer_intr_setup(&Intc,&Timer);
	//开启定时器
	XScuTimer_Start(&Timer);
	return 0;
}

void mio_init(XGpioPs *gpio_ptr)
{
		XGpioPs_Config *ConfigPtr;
		//对GPIO进行初始化(两步)    /* Initialize the GPIO driver. */
		//第一步:根据器件ID去查找器件的配置信息
		ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
		//第二步:对GPIO的驱动进行初始化
		XGpioPs_CfgInitialize(gpio_ptr, ConfigPtr,ConfigPtr->BaseAddr);
		//设置引脚的方向,0为输入,1为输出
		XGpioPs_SetDirectionPin(gpio_ptr, MIO_LED, 1);

		//设置输出使能,1:使能输出,0:不使能输出
		XGpioPs_SetOutputEnablePin(gpio_ptr, MIO_LED, 1);
}

//定时器的初始化和配置
void timer_init(XScuTimer *timer_ptr)
{
	XScuTimer_Config *ConfigPtr;
	//根据定时器器件ID来查找器件的配置信息
	ConfigPtr = XScuTimer_LookupConfig(TIMER_DEVICE_ID);
	//对定时器的驱动进行初始化
	XScuTimer_CfgInitialize(timer_ptr, ConfigPtr,
						ConfigPtr->BaseAddr);
	//对定时器进行配置
	//1.使能自动重新装载模式
	XScuTimer_EnableAutoReload(timer_ptr);
	//2.配置定时器的装载值(初始值
	XScuTimer_LoadTimer(timer_ptr, TIMER_LOAD_VALUE);
};

void timer_intr_setup(XScuGic *intr_ptr,XScuTimer *timer_ptr)
{
		XScuGic_Config *IntcConfig;
		//根据中断控制器(GIC)的器件ID来查找配置信息
		IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
		//根据查找到的配置信息初始化中断控制器(GIC)
		XScuGic_CfgInitialize(intr_ptr, IntcConfig,
						IntcConfig->CpuBaseAddress);

		//异常初始化(初始化ARM处理器异常句柄)
		Xil_ExceptionInit();
		//注册中断请求异常的处理程序
		Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
					(Xil_ExceptionHandler)XScuGic_InterruptHandler,
					intr_ptr);
	    //使能处理器的中断
		Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);

		//关联定时器中断处理程序
		XScuGic_Connect(intr_ptr, TIMER_IRPT_INTR,
					(Xil_ExceptionHandler)timer_intr_handler,
					(void *)timer_ptr);
		//使能GIC的定时器中断
		XScuGic_Enable(intr_ptr, TIMER_IRPT_INTR);
		//使能定时器的中断
		XScuTimer_EnableInterrupt(timer_ptr);
};


//定时器中断处理函数
void timer_intr_handler(void *CallBackRef)
{
	static u8 led_state = 0;
	XScuTimer *timer_ptr = (XScuTimer *) CallBackRef;

	if(led_state == 0)
		led_state = 1;
	else
		led_state = 0;
	//向GPIO MIO写入led_state
	XGpioPs_WritePin(&Gpio, MIO_LED, led_state);
	//清除定时器的中断
	XScuTimer_ClearInterruptStatus(timer_ptr);
}

上板验证:成功执行中断打印信息,用于显示定时器中断的LED灯以200ms的时间间隔进行闪烁

关于程序在线调试的运用:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值