硬件:Xilinx Zynq-7000 SoC ZC706

版本:vivado2015.4

目的:PL触发中断,PS做中断处理

PL部分

添加两个中断源,一个普通中断,一个FIQ中断,对应中断号为61和28

ZYNQ PL-PS中断

连接图

ZYNQ PL-PS中断

约束

set_property PACKAGE_PIN AK25  [get_ports {SW1[0]}]
set_property IOSTANDARD LVCMOS18 [get_ports {SW1[0]}]

set_property PACKAGE_PIN R27  [get_ports {SW2[0]}]
set_property IOSTANDARD LVCMOS18 [get_ports {SW2[0]}]

 PS部分

注册一个普通中断和一个快速中断,普通中断设置为上升沿触发

#include <stdio.h>
#include "xscugic.h"
#include "xil_exception.h"
#include "xgpiops.h"
#include "xil_printf.h"
XGpioPs Gpio;

#define KEY_INT_ID 61
#define CPU_BASEADDR		XPAR_SCUGIC_CPU_BASEADDR

XScuGic ScuGic;
void irq_handler(void * data) {
	u32 id;
	id = XScuGic_ReadReg(CPU_BASEADDR, XSCUGIC_INT_ACK_OFFSET);
	id = id & XSCUGIC_ACK_INTID_MASK;
	xil_printf("irq ocurr,id:%d\n", id);
	XScuGic_WriteReg(CPU_BASEADDR, XSCUGIC_EOI_OFFSET, id);

}

void fiq_request(void) {
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_FIQ_INT,
			(Xil_ExceptionHandler) irq_handler, (void *) 2);

	Xil_ExceptionEnableMask(XIL_EXCEPTION_ALL);
}

void normal_irq_request() {

	XScuGic_Config* pScuGicCfg;
	pScuGicCfg = XScuGic_LookupConfig(XPAR_SCUGIC_SINGLE_DEVICE_ID);
	XScuGic_CfgInitialize(&ScuGic, pScuGicCfg, pScuGicCfg->CpuBaseAddress);
	XScuGic_Connect(&ScuGic, KEY_INT_ID, (Xil_ExceptionHandler) irq_handler, 0);
	XScuGic_SetPriorityTriggerType(&ScuGic, KEY_INT_ID, 0xA0, 3);
	XScuGic_Enable(&ScuGic, KEY_INT_ID);

	Xil_ExceptionInit();
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
			(Xil_ExceptionHandler) irq_handler, &ScuGic);

	Xil_ExceptionEnable();


}

int main(void) {
	xil_printf("PL int test\n\r");
	normal_irq_request();
	fiq_request();
	while (1);
	return 0;
}

实验结果

按下按键得到相应的中断响应

相关文章: