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

news/2024/11/25 13:12:58/

前言

        工具: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/news/1549826.html

相关文章

[Redis#0] iredis: linux上redis超好用的环境配置

目录 Features 特征 Install 安装 Pip Brew Linux的 Download Binary 下载 Binary Usage 用法 Using DSN 使用 DSN Change The Default Prompt更改默认提示 Configuration 配置 Keys Development 发展 Release Strategy 发布策略 Setup Environment 设置环境 De…

go-zero(九) 自定义拦截器

go-zero 拦截器 有时我们需要在处理请求的过程中添加一些额外的逻辑&#xff0c;比如身份验证、日志记录、请求限流、性能监控等&#xff0c;这些都可以通过拦截器实现。go zero可以设置多个拦截器 一、 服务端拦截器 服务端拦截器用于处理传入的 RPC 请求&#xff0c;可以在…

操作系统进程和线程——针对实习面试

目录 操作系统进程和线程什么是进程和线程&#xff1f;进程和线程的区别&#xff1f;进程有哪些状态&#xff1f;什么是线程安全&#xff1f;如何实现线程安全&#xff1f;什么是线程安全&#xff1f;如何实现线程安全&#xff1f; 进程间的通信有哪几种方式&#xff1f;什么是…

微信小程序开发指南:从基础到进阶

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;微信小程序篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来微信小程序篇专栏内容:微信小程序开发指南&#xff1a;从基础到进阶 前言 随着移动互联网的快速发展&…

归并排序与逆序对问题(C语言版)

一、引言 归并排序是一种高效且稳定的排序方法&#xff0c;而逆序对问题是算法领域的一个经典问题&#xff0c;本文教大家如何实现归并排序&#xff0c;以及如何使用归并排序去结果逆序对问题 二、归并排序 归并排序思想 分解&#xff1a;将待排序的数组分成两半&#xff0c…

社交电商专业赋能高校教育与产业协同发展:定制开发AI智能名片及2+1链动商城小程序的创新驱动

摘要&#xff1a;本文围绕社交电商有望成为高校常态专业这一趋势展开深入探讨&#xff0c;剖析国家政策认可下其学科发展前景&#xff0c;着重阐述在专业建设进程中面临的师资短缺及实践教学难题。通过引入定制开发AI智能名片与21链动商城小程序&#xff0c;探究如何借助这些新…

实现可视化大屏的适配,并且解决缩放导致的事件偏移问题

项目上有一个大屏是根据UI的设计稿&#xff0c;已经将宽高固定了&#xff0c;现在要求做适配&#xff0c;这里推荐两款用过的适配插件。 1、v-scale-screen 组件库地址&#xff1a;https://www.npmjs.com/package/v-scale-screen?activeTabreadme v-scale-screen这个插件利…

K8s 下通过prometheus监控 nginx

k8s 下有两个版本的nginx ingress 分别是 ingress nginx 以及 nginx ingress Ingress-nginx 与 Nginx-ingress - LeoZhanggg - 博客园 这里我讨论的是 nginx ingress Nginx Ingress 使用Prometheus 导出数据 nginx ingress 本身支持通过支持这个提供prometheus 格式的…