一、BD框图设计
该部分设计直接采用第二章当中的GPIO设计即可,第一章的HelloWorld也可以
二、设计代码如下
1.初始化Uart、发送函数和接收函数
注:代码为本人通过学习FPGA奇哥系列网课进行自主编写
代码如下(示例):
Uart.c文件
#include "uart.h"
u32 UartInit(XUartPs *UartPtr, u16 DeviceId, u32 BaudRate, u32 LoopTrue){
int Status;
XUartPs_Config *Config;
/*
* Initialize the UART driver so that it's ready to use.
* Look up the configuration in the config table, then initialize it.
*/
//查找设备ID
Config = XUartPs_LookupConfig(DeviceId);
if (NULL == Config) {
return XST_FAILURE;
}
//初始化Uart
Status = XUartPs_CfgInitialize(UartPtr, Config, Config->BaseAddress);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
//设置波特率
XUartPs_SetBaudRate(UartPtr, BaudRate);
//设置回环模式
if(LoopTrue)
XUartPs_SetOperMode(UartPtr, XUARTPS_OPER_MODE_LOCAL_LOOP);
else
XUartPs_SetOperMode(UartPtr, XUARTPS_OPER_MODE_NORMAL);
}
/*发送数据函数,
* UartPtr为Uart控制器结构体
* BufferPtr为发送数据指针,指向需要发送的数据,通常为一个数组
* NumBytes表示发送数据长度
* XUartPs_IsSending(UartPtr)返回值为1表示当前正在发数据
* */
u32 UartSendData(XUartPs *UartPtr, u8 *BufferPtr, u32 NumBytes){
while(XUartPs_IsSending(UartPtr));
XUartPs_Send(UartPtr,BufferPtr,NumBytes);
return XST_SUCCESS;
}
/*接收数据函数,
* UartPtr为Uart控制器结构体
* BufferPtr为接收缓冲区指针,通常为一个数组,也就是通过该指针将接收到的数据一个个放入数组当中
* NumBytes表示缓存区(即接收数据的数组)长度
* StrLen表示接收数据长度
* * RecvCnt接收数据计数器,直到接收数据长度到达StrLen才结束接收
* */
u32 UartRecvData(XUartPs *UartPtr,u8 *BufferPtr,u32 NumBytes,u32 StrLen){
u32 RecvCnt = 0;
while(RecvCnt < StrLen)
RecvCnt += XUartPs_Recv(UartPtr, BufferPtr+RecvCnt, NumBytes);
return XST_SUCCESS;
}
Uart.h文件
#include "xuartps.h"
#include "xil_types.h"
#include "xil_assert.h"
#include "xstatus.h"
#include "xuartps_hw.h"
#include "xplatform_info.h"
#include "xil_printf.h"
#include "xparameters.h"
u32 UartInit(XUartPs *UartPtr, u16 DeviceId, u32 BaudRate, u32 LoopTrue);
u32 UartSendData(XUartPs *UartPtr, u8 *BufferPtr, u32 NumBytes);
u32 UartRecvData(XUartPs *UartPtr,u8 *BufferPtr,u32 NumBytes,u32 StrLen);
main.c
#include "main.h"
XUartPs PsUartCtrl;
u8 UartRecBuf[100];//接收buffer区,长度100
u32 UartSendLen = 0;
int main(){
UartInit(&PsUartCtrl, XPAR_PS7_UART_1_DEVICE_ID, 9600, 0);
while(1){
/*接收主机发送的长度为10byte长度的数据,然后在回环发送给主机*/
UartRecvData(&PsUartCtrl,UartRecBuf,100,10);
UartSendLen = strlen(UartRecBuf);
UartSendData(&PsUartCtrl, UartRecBuf, UartSendLen);
}
}
main.h
#include "uart.h"
#include "string.h"
总结
连接主机和ZYNQ板卡,通过串口助手发送10byte数据,同时也可以观察到板卡返回的相同的数据。
当一次性发10byte数据时板卡会立刻返回相同的数据,当一次只发送01,即1byte时,需要发送十次之后,板卡才会跳出接收函数当中的while循环,同时返回10个01。