在使用vitis(2020.2)对7020进行编程的时候,初始化了两个uartlite中断,但是初始化完成后,发现只能使用uartlite1,uartlite0进不到中断。

以下是错误代码

void UserUartliteInit(void)
{
	UserUartliteValueInit();

	UartLiteIntrInit(&IntcInstance0,
					&UartLite0,
					XPAR_UARTLITE_0_DEVICE_ID,
					XPAR_FABRIC_UARTLITE_0_VEC_ID,
					Uartlite0SendHandler,
					Uartlite0RecvHandler);
	UartLiteIntrInit(&IntcInstance1,
					&UartLite1,
					XPAR_UARTLITE_1_DEVICE_ID,
					XPAR_FABRIC_UARTLITE_1_VEC_ID,
					Uartlite1SendHandler,
					Uartlite1RecvHandler);

	XUartLite_Recv(&UartLite0, ImuRs422.RecvBuf, 1);
	XUartLite_Recv(&UartLite1, ServoRs422.RecvBuf, 1);

}

int UartLiteIntrInit(XScuGic *IntcInstancePtr,XUartLite *InstancePtr,u16 DeviceId,u16 UartLiteIntrId,void *SendHandler,void *RecvHandler)
{
	int Status;

	Status = XUartLite_Initialize(InstancePtr, DeviceId);//uartlite0初始化
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
		xil_printf("XUartLite_SelfTest failure.\r\n");
	}

	Status = XUartLite_SelfTest(InstancePtr);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
		xil_printf("XUartLite_SelfTest failure.\r\n");
	}


	Status = SetupInterruptSystem(IntcInstancePtr,InstancePtr,UartLiteIntrId);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
		xil_printf("XUartLite_SelfTest failure.\r\n");
	}

	xil_printf("XUartLite_Interrupt ok.\r\n");

	//设置回调函数
	XUartLite_SetSendHandler(InstancePtr, SendHandler, InstancePtr);

	XUartLite_SetRecvHandler(InstancePtr, RecvHandler, InstancePtr);

	XUartLite_EnableInterrupt(InstancePtr);

	return XST_SUCCESS;
}

这样初始化就会导致只能运行一个uartlite的中断,原因是中断实例不能初始化两次,相当于使用了最后一次初始化的中断实例。

解决方法:

初始化了两次中断实例,导致使用的时候只能使用最后初始化的那个,所以需要初始化一个IntcInstance实例,将IntcInstance0,IntcInstance1都修改为IntcInstance,然后clean project再build project,一定要clean。

更多推荐