ZYNQ UARTLITE学习小结

经过一天的踩坑和学习,大概理解了ZYNQ 中PS调用UARTLITE的IP核的用法。
记录一下坑点

  1. 最好用xil_printf打印,用printf打印有时候打印不出来。调试的时候都没有打印,弄的我怀疑人生。
  2. 轮询模式和中断模式的应用中,假如发送开启了中断模式,那么接收也必须开启中断模式,接收不能用轮询的模式。
    基本上都是参考xilinx的例程来的,只是在调试的过程中,尝试了一下发送中断,接收轮询的方式,结果踩到坑里,很久也没出来。
    轮询模式代码如下:
	Status = XUartLite_Initialize(UartLiteInstPtr, UartLiteDeviceId);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	Status = XUartLite_SelfTest(UartLiteInstPtr);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	for (Index = 0; Index < TEST_BUFFER_SIZE; Index++) {
		SendBuffer[Index] = Index;
		RecvBuffer[Index] = 0;
	}

	XUartLite_Send(UartLiteInstPtr, SendBuffer, TEST_BUFFER_SIZE);


	usleep(1000);
	xil_printf("So%d,%d ",TotalSentCount,cnttest);
	cnttest=0;
	usleep(1000);
	while (1) {
		ReceivedCount += XUartLite_Recv(UartLiteInstPtr,
							   RecvBuffer + ReceivedCount,
							   TEST_BUFFER_SIZE - ReceivedCount);
		if (ReceivedCount == TEST_BUFFER_SIZE) {
			for (Index = 0; Index < TEST_BUFFER_SIZE; Index++) {
				if(RecvBuffer[Index] == SendBuffer[Index]) {
					if(Index == TEST_BUFFER_SIZE-1)
						xil_printf("rcv successful,%d\r\n ",ReceivedCount);
				}
				else
					xil_printf("rcv[%d] fail\r\n",Index);
			}
			ReceivedCount = 0;
		}
	}

中断模式的代码如下:

Status = XUartLite_Initialize(UartLiteInstPtr, UartLiteDeviceId);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	Status = XUartLite_SelfTest(UartLiteInstPtr);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	Status = UartLiteSetupIntrSystem(IntcInstancePtr,
					 UartLiteInstPtr,
					 UartLiteIntrId);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	XUartLite_SetSendHandler(UartLiteInstPtr, UartLiteSendHandler,
							 UartLiteInstPtr);
	XUartLite_SetRecvHandler(UartLiteInstPtr, UartLiteRecvHandler,
							 UartLiteInstPtr);
	XUartLite_EnableInterrupt(UartLiteInstPtr);


	for (Index = 0; Index < TEST_BUFFER_SIZE; Index++) {
		SendBuffer[Index] = Index;
		RecvBuffer[Index] = 0;
	}

	XUartLite_Recv(UartLiteInstPtr, RecvBuffer, TEST_BUFFER_SIZE*2);
	XUartLite_Send(UartLiteInstPtr, SendBuffer, TEST_BUFFER_SIZE);

	while ((TotalSentCount != TEST_BUFFER_SIZE)) {
	}
	usleep(1000);
	xil_printf("So%d,%d ",TotalSentCount,cnttest);
	cnttest=0;
	usleep(1000);
	while (1) {

		sleep(1);
		xil_printf("R%d,%d\r\n ",ReceivedCount,cnttest);
		if (ReceivedCount == TEST_BUFFER_SIZE*2) {
			XUartLite_Recv(UartLiteInstPtr, RecvBuffer, TEST_BUFFER_SIZE*2);
			ReceivedCount = 0;
		}
	}
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值