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