sdk例程:PS串口中断接收文件,pingpong buffer - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki

程序

说明,这个程序目前可以运行,但还有点bug。主要是数量好像不对。


#include "ACZ702_Lib/COMMON.h"
#include "xil_cache.h"

#define LENGTH 142560
#define ONE_TIME_LENGTH (LENGTH/10)
//uint8_t Receive_Buffer[LENGTH+ONE_TIME_LENGTH];

#define BUFFER_SIZE 512 // 每个缓冲区的大小
#define NUM_BUFFERS 2 // 缓冲区数量
#define TOTAL_SIZE (BUFFER_SIZE * NUM_BUFFERS) // 总数据大小

uint8_t Receive_Buffer[NUM_BUFFERS][BUFFER_SIZE];
uint8_t *Buffer1 = Receive_Buffer[0]; // 第一个接收缓冲区
uint8_t *Buffer2 = Receive_Buffer[1]; // 第二个接收缓冲区


static u32 file_bytes;
static u32 remain_bytes;
int main(void)
{
	uint8_t Data[10];
	uint32_t Timeout;
	uint8_t i;
	Xil_DCacheDisable();

	//开启通用中断控制器
	ScuGic_Init();

	//初始化AXI_UART
	PS_UART_Init(&UartPs1,XPAR_PS7_UART_0_DEVICE_ID, XUARTPS_OPER_MODE_NORMAL, 115200);

	//初始化AXI_UART中断
	PS_UART_Intr_Init(&UartPs1, PS_UART0_IRQ_ID, 8, (void *)PS_UART0_IRQ_Handler);

	//UART发送
	PS_Uart_SendString(&UartPs1,"Pleas input file bytes:\n");

	//等待上一轮发送完成
	while(!Send_All_Flag);
	Send_All_Flag = 0;

//	static u32 file_bytes;
	scanf("%d", &file_bytes);
	xil_printf("file bytes=%d\n", file_bytes);



//	static u32 remain_bytes;
	remain_bytes=file_bytes;
	/*第一次接收到的全部是0,直接丢掉*/
	PS_Uart_RecvData(&UartPs1, Buffer1, BUFFER_SIZE);
	while(!(Recv_All_Flag));
	Recv_All_Flag=0;

	/*现在开始正式接收*/
	/*初始需要先接收一次*/
	PS_Uart_RecvData(&UartPs1, Buffer1, BUFFER_SIZE);
	while(!(Recv_All_Flag));
	Recv_All_Flag=0;

	/*然后才能tx和rx并行进行*/
	u8* rxBuffer =Buffer2;
	u8* txBuffer = Buffer1;
	while(remain_bytes > BUFFER_SIZE) {
		PS_Uart_RecvData(&UartPs1, rxBuffer, BUFFER_SIZE);
		XUartPs_Send(&UartPs1, txBuffer, BUFFER_SIZE);

		while(!(Recv_All_Flag && Send_All_Flag));
		Recv_All_Flag=0;
		Send_All_Flag=0;

		rxBuffer = (rxBuffer == Buffer1) ? Buffer2 : Buffer1;
		txBuffer = (rxBuffer == Buffer1) ? Buffer1 : Buffer2;
		remain_bytes-=BUFFER_SIZE;
	}

	/*循环跳出时候,rxBuffer只完成了接收,但还没有被发送。在这里发送*/
	XUartPs_Send(&UartPs1, rxBuffer, BUFFER_SIZE);
	while(!(Send_All_Flag));
	Send_All_Flag=0;
	remain_bytes-=BUFFER_SIZE;

	/*如果还有剩下的,那么单独处理*/
	if(remain_bytes){
		PS_Uart_RecvData(&UartPs1, rxBuffer, remain_bytes);
		while(!(Recv_All_Flag));
		Recv_All_Flag=0;

		XUartPs_Send(&UartPs1, rxBuffer, remain_bytes);
		while(!(Send_All_Flag));
		Send_All_Flag=0;
	}

	//xil_printf("rev_finish\n");

	return 0;
}