ZYNQ学习第三章-UART控制器


一、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。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顺子学不会FPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值