ZYNQ PL-PS中断

硬件:Xilinx Zynq-7000 SoC ZC706

版本:vivado2015.4

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

硬件:两个按键连接中断对应的GPIO,具体看xdc约束文件。

PL部分

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

连接图

约束

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;
}

实验结果

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值