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

前言

        工具: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.rhkb.cn/news/477846.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【君正T31开发记录】8.了解rtsp协议及设计模式

前边搞定了驱动&#xff0c;先不着急直接上手撸应用层的代码&#xff0c;先了解一下大致要用到的东西。 设计PC端先用vlc rtsp暂时H264编码&#xff08;vlc好像不支持h265,这个后边我试试&#xff09;的视频流&#xff0c;先需要支持上rtsp server&#xff0c;了解rtsp协议是必…

渗透测试---shell(7)for循环2与while循环

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人与泷羽sec团队一律不承担一切后果 视频地址&#xff1a;泷羽--shell&a…

CLIP-Adapter: Better Vision-Language Models with Feature Adapters 论文解读

abstract 大规模对比视觉-语言预训练在视觉表示学习方面取得了显著进展。与传统的通过固定一组离散标签训练的视觉系统不同&#xff0c;(Radford et al., 2021) 引入了一种新范式&#xff0c;该范式在开放词汇环境中直接学习将图像与原始文本对齐。在下游任务中&#xff0c;通…

C++初阶(十五)--STL--list 的深度解析与全面应用

文章目录 一、头文件与基本概念 二、构造函数和析构函数 1.构造函数 2.析构函数 三、元素访问 front back 四、迭代器相关函数 begin end rebegin&#xff08;反向迭代器&#xff09; rend&#xff08;反向迭代器&#xff09; 五、容量相关函数 empty size max…

一个关于 CSS Modules 的陷阱

我在引用 less 文件样式的时候&#xff0c;发现 index.less .drag_upload {width: 100%;height: 90vh;padding: 20px; }index.jsx import React, { useState, useEffect } from react; import styles from ./index.less;export default ({ }) > {return (<div classNa…

基于STM32的智能家居电器控制系统

目录 引言环境准备 2.1 硬件准备 2.2 软件准备智能家居电器控制系统基础 3.1 控制系统架构 3.2 功能描述代码实现&#xff1a;实现智能家居电器控制系统 4.1 数据采集模块 4.2 控制逻辑与设备管理 4.3 通信与远程控制实现 4.4 用户界面与数据可视化应用场景&#xff1a;家庭自…

视觉经典神经网络与复现:深入解析与实践指南

目录 引言 经典视觉神经网络模型详解 1. LeNet-5&#xff1a;卷积神经网络的先驱 LeNet-5的关键特点&#xff1a; 2. AlexNet&#xff1a;深度学习的突破 AlexNet的关键特点&#xff1a; 3. VGGNet&#xff1a;深度与简洁的平衡 VGGNet的关键特点&#xff1a; 4. ResNe…

vue3【实战】响应式的登录界面

效果预览 WEB 端效果 移动端效果 技术方案 vue3 vite Element Plus VueRouter UnoCSS TS vueUse AutoImport 技术要点 响应式设计 移动端&#xff1a;图片切换为绝对定位&#xff0c;下移一层&#xff0c;成为背景图片 <el-imageclass"w-screen h-screen lt-md…

c语言的qsort函数理解与使用

介绍&#xff1a;qsort 函数是 C 标准库中用于排序的快速排序算法函数。它的用法非常灵活&#xff0c;可以对任意类型的元素进行排序&#xff0c;只要提供了比较函数即可。 qsort 函数原型及参数解释&#xff1a; void qsort ( void* base, //指向要排序的数组的首元素…

AIGC学习笔记(6)——AI大模型开发工程师

文章目录 AI大模型开发工程师005 OpenAI大模型案例实践1 AI 翻译助手需求分析项目起源市场价格和市场前景基于大模型的翻译软件核心功能设计 2 AI 翻译助手架构设计架构设计代码结构设计 3 AI 翻译助手核心功能文档解析文档操作PDF文档操作表格操作图片操作 Prompt封装 4 AI 翻…

《生成式 AI》课程 作业6 大语言模型(LLM)的训练微调 Fine Tuning -- part1

资料来自李宏毅老师《生成式 AI》课程&#xff0c;如有侵权请通知下线 Introduction to Generative AI 2024 Spring 该文档主要介绍了国立台湾大学&#xff08;NTU&#xff09;2024 年春季 “生成式人工智能&#xff08;GenAI&#xff09;” 课程的作业 5&#xff08;GenAI HW…

cangjie (仓颉) vscode环境搭建

sdk下载 下载中心-仓颉编程语言官网 可选择半年更新版&#xff0c;不用申请。目前版本&#xff1a;0.53.13 &#xff0c;选择不同平台压缩包下载解压到任意位置即可 补充下载&#xff0c;vscode插件解压后&#xff0c;在vscode扩展中选择从vsix安装&#xff0c;安装后新增名为…

微信小程序全局配置:导航栏、下拉刷新与上拉触底设置教程

微信小程序全局配置:导航栏、下拉刷新与上拉触底设置教程 引言 微信小程序作为一种新兴的轻量级应用,凭借其便捷性和丰富的功能受到了广泛的欢迎。在开发小程序的过程中,合理配置全局属性是提升用户体验的关键。本文将深入探讨小程序的全局配置中的window选项,重点介绍导…

CPU命名那些事

一、Intel CPU命名 1. 命名结构 Intel CPU 的命名通常包含以下几个部分&#xff1a; 品牌 产品线 系列 代数 具体型号 后缀 例如&#xff1a;Intel Core i7-13700K 2. 各部分含义 品牌 Intel&#xff1a;表示厂商&#xff08;几乎所有命名中都有&#xff09;。不同品…

【C++笔记】数据结构进阶之二叉搜索树(BSTree)

【C笔记】数据结构进阶之二叉搜索树(BSTree) &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】数据结构进阶之二叉搜索树(BSTree)前言一.二叉搜索树的概念二.二叉搜索树的性能分析三.二叉搜索树的实现3.1二叉树的中序…

无线图传下的低延迟视频传输播放技术探讨

技术背景 无线图传技术即无线图像传输技术&#xff0c;是指不用布线&#xff08;线缆&#xff09;利用无线电波来传输图像数据的技术。 一、工作原理 无线图传技术主要涉及图像采集、编码、调制、发射、接收、解调、解码和图像显示等环节。 图像采集&#xff1a;通过摄像头…

Linux的开发工具(三)

条件编译 预处理本质&#xff1a;对代码进行裁剪 像网易云音乐有vip和普通用户&#xff0c;可以通过条件编译来&#xff0c;这样只用写一份代码&#xff0c;也只用维护一份代码&#xff0c;是vip就走vip代码&#xff0c;不是就普通用户代码&#xff0c;条件编译来动态裁剪。 …

VSCode 汉化教程【简洁易懂】

VSCode【下载】【安装】【汉化】【配置C环境&#xff08;超快&#xff09;】&#xff08;Windows环境&#xff09;-CSDN博客 我们安装完成后默认是英文界面。 找到插件选项卡&#xff0c;搜索“Chinese”&#xff0c;找到简体&#xff08;更具你的需要&#xff09;&#xff08;…

Ubuntu下的Doxygen+VScode实现C/C++接口文档自动生成

Ubuntu下的DoxygenVScode实现C/C接口文档自动生成 1、 Doxygen简介 Doxygen 是一个由 C 编写的、开源的、跨平台的文档生成系统。最初主要用于生成 C 库的 API 文档&#xff0c;但目前又添加了对 C、C#、Java、Python、Fortran、PHP 等语言的支持。其从源代码中提取注释&…

Linux网络——网络层

网络层的作用&#xff1a;在复杂的网络环境中确定一个合适的路径。 一.IP协议 IP存在的意义&#xff1a;IP地址提供一种能力&#xff0c;使得数据能够从主机B跨网络、可靠的送至主机A。 1.协议头格式 能够看出IP协议的格式与TCP协议存在很多相似之处&#xff0c;同样拥有4为首…