XPS中断功能的使用---添加外部引脚作为中断输入引脚
1、 在XPS中添加中断的IP核,名为”xps_intc”。如下图:
2、 中断控制器的总线连接。在”Bus Interfaces”中,将”xps_intc”连接到PLB总线上。如图:
3、 中断控制器的端口连接。在”Ports”中,将”Irq”连接到microblaze核,添加两个外部引脚,
作为中断输入引脚,点击下图右上角红框,添加外部引脚,并选择方向和类型,这里方向选输入,类型选中断。
点击”xps_intc_0”的”Intr”,弹出中断连接对话框,如下图:
将添加的两个外部引脚,添加到中断连接,即这两个引脚作为外部中断输入的引脚。
引脚添加好后,在xparameters.h中,会找到与这两个引脚相关的定义,如下图:
4、 实现综合完后,在SDK下编写C语音程序;
(1) XIntc InterruptController;//声明中断控制器变量
(2) XIntc_Initialize(&InterruptController,XPAR_XPS_INTC_0_DEVICE_ID);//初始化中断控制器0
(3) XIntc_Connect(&InterruptController,XPAR_XPS_INTC_0_SYSTEM_EXTERNALPORT_0_0_INTR,(Xil_ExceptionHandler)Ext_intc_hander, (void *)0);//将中断与中断处理函数对应起来,这里用的外部中断引脚0
(4) XIntc_Enable(&InterruptController,XPAR_XPS_INTC_0_SYSTEM_EXTERNALPORT_0_0_INTR)//使能外部中断引脚0中断
(5) XIntc_Start(&InterruptController, XIN_REAL_MODE);//开始中断
(6) Xil_ExceptionInit();
(7) Xil_ExceptionRegisterHandler(XPAR_XPS_INTC_0_SYSTEM_EXTERNALPORT_0_0_INTR,(Xil_ExceptionHandler)Ext_intc_hander,&InterruptController);
(8) Xil_ExceptionEnable();
(9) void Ext_intc_hander(void);//中断处理函数
5、 注意实现代码中红色部分,一定要在xparameters.h中找到相对应的定义。
附录:简单实现程序
#include"xparameters.h"
#include"xstatus.h"
#include"xintc.h"
#include"xgpio.h"
#include"xil_exception.h"
XIntc InterruptController;
XGpio LEDs;
u8 count_a;
void Ext_intc_hander(void);//中断处理函数
int main()
{
XGpio_Initialize(&LEDs, XPAR_LEDS_DEVICE_ID);
XGpio_SetDataDirection(&LEDs, 1, 0x00);
XGpio_DiscreteWrite(&LEDs, 1, count_a);
XIntc_Initialize(&InterruptController,XPAR_XPS_INTC_0_DEVICE_ID);//初始化中断控制器
//将中断与中断处理函数对应起来,这里用的外部中断引脚0
XIntc_Connect(&InterruptController, XPAR_XPS_INTC_0_SYSTEM_EXTERNALPORT_0_0_INTR,
(Xil_ExceptionHandler)Ext_intc_hander, (void *)0);
//使能外部中断引脚0中断
XIntc_Enable(&InterruptController, XPAR_XPS_INTC_0_SYSTEM_EXTERNALPORT_0_0_INTR);
XIntc_Start(&InterruptController, XIN_REAL_MODE);
Xil_ExceptionInit();
Xil_ExceptionRegisterHandler(XPAR_XPS_INTC_0_SYSTEM_EXTERNALPORT_0_0_INTR,
(Xil_ExceptionHandler)Ext_intc_hander, &InterruptController);
Xil_ExceptionEnable();
return 0;
}
void Ext_intc_hander()
{
count_a = count_a + 1;
XGpio_DiscreteWrite(&LEDs, 1, count_a);
}