【FPGA-MicroBlaze】串口收发以及相关函数讲解

embedded/2024/11/29 4:36:05/

前言

        工具:Vivado2018.3及其所对应的SDK版本

        目前网上有许多MicroBlaze 的入门教程,比如下面的这个参考文章,用串口打印一个hello world。

        【FPGA】Xilinx MicroBlaze软核使用第一节:Hello World!_fpga软核microblaze-CSDN博客

        个人感觉这些文章的重合度极高,看多了也没有什么参考价值,且单单就串口打印而言,这个学会了也无法对我们实际工程产生多大的帮助。

个人工程

Vivado部分

        在我的工程里,时钟的复位我用的是低电平复位,并且我没有将复位信号进行引出,而是用了一个常数进行代替,该常数固定输出1,不对整个模块进行复位。将模块建立完成之后,Creat  HDL Wrapper,然后生成比特流文件,导出SDK即可。

         关于XDC文件可以根据自己板卡的引脚进行约定即可,我的XDC文件是这样的

set_property IOSTANDARD LVCMOS33 [get_ports clk_in]
set_property PACKAGE_PIN W19 [get_ports clk_in]set_property IOSTANDARD LVCMOS33 [get_ports uart_rxd]
set_property PACKAGE_PIN N2 [get_ports uart_rxd]
set_property IOSTANDARD LVCMOS33 [get_ports uart_txd]
set_property PACKAGE_PIN N5 [get_ports uart_txd]

SDK部分

        像大部分教程一样,建立一个Hello World工程,可以看到在system.mss中,有相关的几个例程可以进行参考。

        直接选择这个工程进行导入,查看例程。

         随后,对下述代码进行简单的分析。

        将该代码贴上,并且把不必要的注释进行删除。

#include "xparameters.h"
#include "xstatus.h"
#include "xuartlite.h"
#include "xil_printf.h"#define TEST_BUFFER_SIZE 16    /* 定义TEST_BUFFER_SIZE 的值为16 */int UartLitePolledExample(u16 DeviceId);    /* 定义函数 */XUartLite UartLite;		/* Instance of the UartLite Device */u8 SendBuffer[TEST_BUFFER_SIZE];	/* Buffer for Transmitting Data 发送数据的一个数组Buffer */
u8 RecvBuffer[TEST_BUFFER_SIZE];	/* Buffer for Receiving Data 接收数据的一个数组Buffer*//* 主函数的作用:将UartLitePolledExample(UARTLITE_DEVICE_ID) 的值返回给Status* 如果Status != XST_SUCCESS,则串口打印“Uartlite polled Example Failed\r\n”* 如果Status == XST_SUCCESS,则串口打印“Successfully ran Uartlite polled Example\r\n”*/
int main(void)
{int Status;/** Run the UartLite polled example, specify the Device ID that is* generated in xparameters.h*/Status = UartLitePolledExample(UARTLITE_DEVICE_ID);if (Status != XST_SUCCESS) {xil_printf("Uartlite polled Example Failed\r\n");return XST_FAILURE;}xil_printf("Successfully ran Uartlite polled Example\r\n");return XST_SUCCESS;}/* UartLitePolledExample函数的作用 */int UartLitePolledExample(u16 DeviceId)
{int Status;unsigned int SentCount;    /* 定义SentCount为一个无符号数 */unsigned int ReceivedCount = 0;    /* 定义ReceivedCount为一个无符号数,且初值为0 */int Index;/*初始化串口,若失败则返回XST_FAILURE,若成功则函数继续向下进行判断* Initialize the UartLite driver so that it is ready to use.*/Status = XUartLite_Initialize(&UartLite, DeviceId);if (Status != XST_SUCCESS) {return XST_FAILURE;}/*确定硬件平台已经成功建立* Perform a self-test to ensure that the hardware was built correctly.*/Status = XUartLite_SelfTest(&UartLite);if (Status != XST_SUCCESS) {return XST_FAILURE;}/*    for循环,SendBuffer[0] = 0,SendBuffer[1] = 1,...,SendBuffer[15] = 15;*        SendBuffer[0] = 0,SendBuffer[1] = 0,...,SendBuffer[15] = 0;* Initialize the send buffer bytes with a pattern to send and the* the receive buffer bytes to zero.*/for (Index = 0; Index < TEST_BUFFER_SIZE; Index++) {SendBuffer[Index] = Index;RecvBuffer[Index] = 0;}/*    用XUartLite_Send函数,将SendBuffer中的16个数据发送出去* Send the buffer through the UartLite waiting til the data can be sent* (block), if the specified number of bytes was not sent successfully,* then an error occurred.*/SentCount = XUartLite_Send(&UartLite, SendBuffer, TEST_BUFFER_SIZE);if (SentCount != TEST_BUFFER_SIZE) {return XST_FAILURE;}/*    while(1)进行判断,判断接收到的数据个数是否等于XUartLite_Send函数所发送的数据个数* Receive the number of bytes which is transfered.* Data may be received in fifo with some delay hence we continuously* check the receive fifo for valid data and update the receive buffer* accordingly.*/while (1) {ReceivedCount += XUartLite_Recv(&UartLite,RecvBuffer + ReceivedCount,TEST_BUFFER_SIZE - ReceivedCount);if (ReceivedCount == TEST_BUFFER_SIZE) {break;}}/*    for循环,判断接收到的数据是否等于发送的数据若失败则返回XST_FAILURE* Check the receive buffer data against the send buffer and verify the* data was correctly received.*/for (Index = 0; Index < TEST_BUFFER_SIZE; Index++) {if (SendBuffer[Index] != RecvBuffer[Index]) {return XST_FAILURE;}}return XST_SUCCESS;
}

        在上述SDK的软件程序正,用到了许多函数,如XUartLite_Initialize、XUartLite_SelfTest、 XUartLite_Send、XUartLite_Recv,这些函数都可以在SDK中按住ctrl键,查看其功能。

        比如进入XUartLite.h头文件中,就可以看到串口收发相关的函数调用了,还可以按住ctrl进一步查看其.c文件中的定义。

运行程序上板验证

        右键工程,Run As--Run Configurations..中,设置复位。

 终端显示


http://www.ppmy.cn/embedded/141357.html

相关文章

基于事件驱动的业务规则模型设计

在现代数字化运营中&#xff0c;企业需要通过高效且灵活的系统来应对日益复杂的业务需求和用户期望。事件驱动的业务规则模型通过实时响应业务事件并执行预定义规则&#xff0c;实现积分发放、优惠券触发、分佣处理、流程审批等任务的自动化和智能化&#xff0c;从而为企业提升…

解读 Keep-Alive:CSDN 项目实例分析

Keep-Alive的理解 Keep-Alive 是一种网络通信中的机制,目的是保持一个持久的连接,在多个请求之间复用这个连接,而不是每次请求都重新建立新的连接。这个机制通常应用于HTTP协议中,称为 HTTP Keep-Alive(也叫 HTTP持久连接),它使得在客户端与服务器之间的通信过程中,能…

C++多线程——线程

1、线程与进程 进程是一个具有独立功能程序的运行实体&#xff0c;如某一个程序&#xff0c;运行时便产生一个进程&#xff1b;通常一个进程包含一个或多个线程。普通C程序多是只含有一个线程的进程&#xff0c;但是大多数情况下遇到的是多线程的进程。 线程与进程都是操作系统…

微信小程序全局配置:TabBar与页面配置详解

微信小程序全局配置:TabBar与页面配置详解 引言 随着移动互联网的迅猛发展,微信小程序作为一种新兴的应用形式,因其便捷性和丰富的功能而受到广泛欢迎。在小程序的开发过程中,全局配置是非常重要的一环,尤其是tabBar和页面的配置。本文将深入探讨微信小程序的全局配置,…

51单片机从入门到精通:理论与实践指南入门篇(三)

上一节博客给大家基本介绍了51单片机 51单片机从入门到精通&#xff1a;理论与实践指南入门篇&#xff08;二&#xff09; https://blog.csdn.net/speaking_me/article/details/144068159?spm1001.2014.3001.5501 那么这节课就来介绍——花样流水灯的实现 花样流水灯电路设…

TCP/IP网络编程-C++(上)

TCP/IP网络编程-C &#xff08;上&#xff09; 一、基于TCP的服务端/客户端1、server端代码2、client端代码3、socket() 函数3.1、函数原型3.2、参数解析3.2.1、协议族&#xff08;domain参数&#xff09;3.2.2、套接字类型&#xff08;type参数&#xff09;3.2.3、最终使用的协…

【C++】string类练习

test1:反转字母 给你一个字符串 s &#xff0c;根据下述规则反转字符串&#xff1a; 所有非英文字母保留在原有位置。所有英文字母&#xff08;小写或大写&#xff09;位置反转。 返回反转后的 s 。 示例 1&#xff1a; 输入&#xff1a;s "ab-cd" 输出&#xff1a;…

微知-lspci访问到指定的PCIe设备的几种方式?(lspci -s bus;lspci -d devices)

通过bdf号查看 -s &#xff08;bus&#xff09; lspci -s 03:00.0通过vendor id或者device id等设备查看 -d &#xff08;device&#xff09; lspci -d 15b3: #这里是vendor号&#xff0c;所以在前面 lspci -d :1021 #这里是设备号&#xff0c;所以要:在前vendorid和deviceid…