AXI Timerを2個使うテスト

ブロックダイアグラム

Timer1のみのコード

#include <stdio.h>
#include "platform.h"
#include "xil_types.h"
#include "xtmrctr.h"
#include "xparameters.h"
#include "xil_io.h"
#include "xil_exception.h"
#include "xscugic.h"
#include <stdbool.h>

XScuGic InterruptController; /* Instance of the Interrupt Controller */
static XScuGic_Config *GicConfig;/* The configuration parameters of the controller */
void Timer_InterruptHandler(void *data, u8 TmrCtrNumber)
{
	print(" Interrupt acknowledged\n\r");
	XTmrCtr_Stop(data,TmrCtrNumber);
	XTmrCtr_Reset(data,TmrCtrNumber);
	XTmrCtr_Start(data,TmrCtrNumber);
}

int SetUpInterruptSystem(XScuGic *XScuGicInstancePtr)
{
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
			(Xil_ExceptionHandler) XScuGic_InterruptHandler,
			XScuGicInstancePtr);
	Xil_ExceptionEnable();
	return XST_SUCCESS;
}
int ScuGicInterrupt_Init(u16 DeviceId,XTmrCtr *TimerInstancePtr)
{
	int Status;
	GicConfig = XScuGic_LookupConfig(DeviceId);
	if (NULL == GicConfig) {
		return XST_FAILURE;
	}
	Status = XScuGic_CfgInitialize(&InterruptController, GicConfig,
			GicConfig->CpuBaseAddress);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	Status = SetUpInterruptSystem(&InterruptController);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	Status = XScuGic_Connect(&InterruptController,
			XPAR_FABRIC_AXI_TIMER_0_INTERRUPT_INTR,
			(Xil_ExceptionHandler)XTmrCtr_InterruptHandler,
			(void *)TimerInstancePtr);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	XScuGic_Enable(&InterruptController, XPAR_FABRIC_AXI_TIMER_0_INTERRUPT_INTR);
	return XST_SUCCESS;
}
int main()
{

	XTmrCtr TimerInstancePtr;
	int xStatus;

	print("##### Application Starts #####\n\r");
	print("\r\n");
	xStatus = XTmrCtr_Initialize(&TimerInstancePtr,XPAR_AXI_TIMER_0_DEVICE_ID);
	if(XST_SUCCESS != xStatus)
		print("TIMER INIT FAILED \n\r");

	XTmrCtr_SetHandler(&TimerInstancePtr,
			Timer_InterruptHandler,
			&TimerInstancePtr);

	XTmrCtr_SetResetValue(&TimerInstancePtr,
			0, //Change with generic value
			0xf8000000);

	XTmrCtr_SetOptions(&TimerInstancePtr,
			XPAR_AXI_TIMER_0_DEVICE_ID,
			(XTC_INT_MODE_OPTION | XTC_AUTO_RELOAD_OPTION ));

	xStatus=ScuGicInterrupt_Init(XPAR_PS7_SCUGIC_0_DEVICE_ID,&TimerInstancePtr);
	if(XST_SUCCESS != xStatus)
		print(" :( SCUGIC INIT FAILED \n\r");

	XTmrCtr_Start(&TimerInstancePtr,0);
	print("timer start \n\r");

	print("Wait for the Timer interrupt to tigger \r\n");
	print("########################################\r\n");
	print(" \r\n");

	while(1)
	{
	}
	cleanup_platform();
	return 0;
}

Timer2のみのコード

変更箇所
1. XTmrCtr_SetResetValue

XTmrCtr_SetResetValue(&TimerInstancePtr,
			1, //Change with generic value
			0xf8000000);

の1はTimer2のこと(Timer1: 0, Timer2: 1)

2. XTmrCtr_Start

XTmrCtr_Start(&TimerInstancePtr,1);

の1は同じくTimer2のこと

#include <stdio.h>
#include "platform.h"
#include "xil_types.h"
#include "xtmrctr.h"
#include "xparameters.h"
#include "xil_io.h"
#include "xil_exception.h"
#include "xscugic.h"
#include <stdbool.h>

XScuGic InterruptController; /* Instance of the Interrupt Controller */
static XScuGic_Config *GicConfig;/* The configuration parameters of the controller */
void Timer_InterruptHandler(void *data, u8 TmrCtrNumber)
{
	print(" Interrupt acknowledged\n\r");
	XTmrCtr_Stop(data,TmrCtrNumber);
	XTmrCtr_Reset(data,TmrCtrNumber);
	XTmrCtr_Start(data,TmrCtrNumber);
}

int SetUpInterruptSystem(XScuGic *XScuGicInstancePtr)
{
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
			(Xil_ExceptionHandler) XScuGic_InterruptHandler,
			XScuGicInstancePtr);
	Xil_ExceptionEnable();
	return XST_SUCCESS;
}
int ScuGicInterrupt_Init(u16 DeviceId,XTmrCtr *TimerInstancePtr)
{
	int Status;
	GicConfig = XScuGic_LookupConfig(DeviceId);
	if (NULL == GicConfig) {
		return XST_FAILURE;
	}
	Status = XScuGic_CfgInitialize(&InterruptController, GicConfig,
			GicConfig->CpuBaseAddress);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	Status = SetUpInterruptSystem(&InterruptController);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	Status = XScuGic_Connect(&InterruptController,
			XPAR_FABRIC_AXI_TIMER_1_INTERRUPT_INTR,
			(Xil_ExceptionHandler)XTmrCtr_InterruptHandler,
			(void *)TimerInstancePtr);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	XScuGic_Enable(&InterruptController, XPAR_FABRIC_AXI_TIMER_1_INTERRUPT_INTR);
	return XST_SUCCESS;
}
int main()
{

	XTmrCtr TimerInstancePtr;
	int xStatus;

	print("##### Application Starts #####\n\r");
	print("\r\n");
	xStatus = XTmrCtr_Initialize(&TimerInstancePtr,XPAR_AXI_TIMER_1_DEVICE_ID);
	if(XST_SUCCESS != xStatus)
		print("TIMER INIT FAILED \n\r");

	XTmrCtr_SetHandler(&TimerInstancePtr,
			Timer_InterruptHandler,
			&TimerInstancePtr);

	XTmrCtr_SetResetValue(&TimerInstancePtr,
			1, //Change with generic value
			0xf8000000);

	XTmrCtr_SetOptions(&TimerInstancePtr,
			XPAR_AXI_TIMER_1_DEVICE_ID,
			(XTC_INT_MODE_OPTION | XTC_AUTO_RELOAD_OPTION ));

	xStatus=ScuGicInterrupt_Init(XPAR_PS7_SCUGIC_0_DEVICE_ID,&TimerInstancePtr);
	if(XST_SUCCESS != xStatus)
		print(" :( SCUGIC INIT FAILED \n\r");

	XTmrCtr_Start(&TimerInstancePtr,1);
	print("timer start \n\r");

	print("Wait for the Timer interrupt to tigger \r\n");
	print("########################################\r\n");
	print(" \r\n");

	while(1)
	{
	}
	cleanup_platform();
	return 0;
}

両者を共存させたコード

ポイント:SCU-GICに接続するInterruptControllerは1つ。TimerInstancePtrはそれぞれのタイマーに対して2つ用意する。

#include <stdio.h>
#include "platform.h"
#include "xil_types.h"
#include "xtmrctr.h"
#include "xparameters.h"
#include "xil_io.h"
#include "xil_exception.h"
#include "xscugic.h"
#include <stdbool.h>

XScuGic InterruptController; /* Instance of the Interrupt Controller */
XTmrCtr TimerInstancePtr;
XTmrCtr TimerInstancePtr2;

static XScuGic_Config *GicConfig;/* The configuration parameters of the controller */
void Timer_InterruptHandler(void *data, u8 TmrCtrNumber)
{
	print(" Interrupt acknowledged\n\r");
}
void Timer_InterruptHandler2(void *data, u8 TmrCtrNumber)
{
	print(" Interrupt 2 acknowledged\n\r");
}

int SetUpInterruptSystem(XScuGic *XScuGicInstancePtr)
{
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
			(Xil_ExceptionHandler) XScuGic_InterruptHandler,
			XScuGicInstancePtr);
	Xil_ExceptionEnable();
	return XST_SUCCESS;
}
int ScuGicInterrupt_Init(u16 DeviceId,XTmrCtr *TimerInstancePtr,XTmrCtr *TimerInstancePtr2)
{
	int Status;
	GicConfig = XScuGic_LookupConfig(DeviceId);
	if (NULL == GicConfig) {
		return XST_FAILURE;
	}
	Status = XScuGic_CfgInitialize(&InterruptController, GicConfig,
			GicConfig->CpuBaseAddress);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	Status = SetUpInterruptSystem(&InterruptController);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	Status = XScuGic_Connect(&InterruptController,
			XPAR_FABRIC_AXI_TIMER_0_INTERRUPT_INTR,
			(Xil_ExceptionHandler)XTmrCtr_InterruptHandler,
			(void *)TimerInstancePtr);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	Status = XScuGic_Connect(&InterruptController,
			XPAR_FABRIC_AXI_TIMER_1_INTERRUPT_INTR,
			(Xil_ExceptionHandler)XTmrCtr_InterruptHandler,
			(void *)TimerInstancePtr2);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	XScuGic_Enable(&InterruptController, XPAR_FABRIC_AXI_TIMER_0_INTERRUPT_INTR);
	XScuGic_Enable(&InterruptController, XPAR_FABRIC_AXI_TIMER_1_INTERRUPT_INTR);
	return XST_SUCCESS;
}

int main()
{

	int xStatus;

	print("##### Application Starts #####\n\r");
	print("\r\n");
	xStatus = XTmrCtr_Initialize(&TimerInstancePtr,XPAR_AXI_TIMER_0_DEVICE_ID);
	if(XST_SUCCESS != xStatus)
		print("TIMER INIT FAILED \n\r");
	xStatus = XTmrCtr_Initialize(&TimerInstancePtr2,XPAR_AXI_TIMER_1_DEVICE_ID);
	if(XST_SUCCESS != xStatus)
		print("TIMER INIT FAILED \n\r");

	XTmrCtr_SetHandler(&TimerInstancePtr,
			Timer_InterruptHandler,
			&TimerInstancePtr);
	XTmrCtr_SetHandler(&TimerInstancePtr2,
			Timer_InterruptHandler2,
			&TimerInstancePtr2);

	XTmrCtr_SetResetValue(&TimerInstancePtr,
			0, //Change with generic value
			0xf8000000);
	XTmrCtr_SetResetValue(&TimerInstancePtr2,
			1, //Change with generic value
			0xf8000000);

	XTmrCtr_SetOptions(&TimerInstancePtr,
			XPAR_AXI_TIMER_0_DEVICE_ID,
			(XTC_INT_MODE_OPTION | XTC_AUTO_RELOAD_OPTION ));
	XTmrCtr_SetOptions(&TimerInstancePtr2,
			XPAR_AXI_TIMER_1_DEVICE_ID,
			(XTC_INT_MODE_OPTION | XTC_AUTO_RELOAD_OPTION ));

	xStatus=ScuGicInterrupt_Init(XPAR_PS7_SCUGIC_0_DEVICE_ID,&TimerInstancePtr, &TimerInstancePtr2);
	if(XST_SUCCESS != xStatus)
		print(" :( SCUGIC INIT FAILED \n\r");

	XTmrCtr_Start(&TimerInstancePtr,0);
	print("timer start \n\r");
	XTmrCtr_Start(&TimerInstancePtr2,1);
	print("timer2 start \n\r");

	print("Wait for the Timer interrupt to tigger \r\n");
	print("########################################\r\n");
	print(" \r\n");

	while(1)
	{
	}
	cleanup_platform();
	return 0;
}