当前位置: 首页 > news >正文

MicroBlaze软核开发(二):GPIO

实现功能:使用 MicroBlaze软核,配置GPIO用拨码开关控制LED灯

Vivado版本:2018.3

目录

引言

vivado部分:

一、配置GPIO

二、生成HDL文件编译

SDK部分:

一、导出硬件启动SDK

二、新建应用程序工程

三、编写程序代码

引言

        在“  MicroBlaze软核开发(一):Hello World  ”中通过串口打印 Hello World 的例子成功跑通了 Microblaze 软核,对相关设计步骤作了一个介绍。本文将基于上一节的工程,继续介绍如何使用 Microblaze 软核,配置GPIO,用4个拨码开关对应控制4个LED灯。 

vivado部分:

一、配置GPIO

       (1)点击添加按钮,搜索GPIO,双击 AXI GPIO 添加IP ,如图所示

        (2)双击GPIO模块进行配置:因为要实现4个拨码开关对应控制4个LED灯,所以LED为4位输出,拨码开关为4位输入;又因为后续输入输出需要分开设置通道,故将GPIO1通道作为LED灯的4位输出,将GPIO2通道作为拨码快关的4位输入。

        (3)点击“运行自动连接”,勾选全部点击OK

        (4)点击“自动布局”,最后得到电路如下,右下角为添加的gpio部分,这里把 GPIO 模块的通道1引脚命名为“gpio_led”,把通道2引脚命名为“gpio_switch” (后面会用到,注意!)

二、生成HDL文件编译

        这一部分和 “  MicroBlaze软核开发(一):Hello World  ” 中相同,不再赘述

        (1)到src栏右键设计块,生成HDL包装文件

        (2)依次进行:Run Synthesis 综合、Run implementation 部署 

        (3)再配置管脚:需要配置的管脚如图所示,根据开发板情况自行配置

        (4)最后 Generate Bitstream 生成比特流文件

SDK部分:

一、导出硬件启动SDK

         这一部分和 “  MicroBlaze软核开发(一):Hello World  ” 中相同,不再赘述

        (1)File -> Export -> Export Hardware 导出硬件: 注意勾选“Include bitstream”再导出

        (2)File -> Launch SDK 启动SDK:保持默认点击OK。

二、新建应用程序工程

        (1)因为是基于(一)的工程进行,会发现已有hello的工程,这里打开该工程 bsp 文件夹(Board Support Package文件夹,封装了特定硬件平台如开发板、FPGA等所需的软件支持)再打开 system.mss 文件,里面会根据 Vivado 内的软核设计提供驱动程序 (Vivado给添加了uart和gpio,可以发现它就提供了uart 和 gpio 的驱动程序的工程模板),选择axi_gpio 的工程创建。

        (2)选择axi_gpio 的工程模板,他一共提供4个模板,这里选最基本的第一个即可。

        (3)打开生成的模板工程的.C文件,可以看到模板功能是使用 AXI GPIO 驱动 LED 灯,
其中LED灯为GPIO通道1的第0位

        (4)先分析运行模板的代码:(SDK中按住Ctrl再点击函数可以跳转查看函数定义,直接烧录并运行该模板程序的现象是LED的第0位循环亮灭)

/***************************** Include Files 包含头文件 *********************************/
#include "xparameters.h" 
#include "xgpio.h"
#include "xil_printf.h"/************************** Constant Definitions 常量定义 *****************************/
#define LED 0x01     //LED的gpio的方向:第0位为1
#define GPIO_EXAMPLE_DEVICE_ID  XPAR_GPIO_0_DEVICE_ID //获取的GPIO设备ID
#define LED_DELAY    10000000 //用于延时计数
#define LED_CHANNEL  1        //LED的gpio通道设为通道1/************************** Variable Definitions 变量定义 ****************************/
XGpio Gpio; //实例化XGpio名为GPIO/********************************** Main 主函数  *************************************/
int main(void)
{int Status;volatile int Delay;/**** GPIO初始化 ****/Status = XGpio_Initialize(&Gpio, GPIO_EXAMPLE_DEVICE_ID);if (Status != XST_SUCCESS) {xil_printf("Gpio Initialization Failed\r\n");return XST_FAILURE;}XGpio_SetDataDirection(&Gpio, LED_CHANNEL, ~LED); //设置LED的gpio方向,这里取反则仅第0位0,即只有第0位为输出/**** LED循环闪烁 ****/while (1) {XGpio_DiscreteWrite(&Gpio, LED_CHANNEL, LED);   for (Delay = 0; Delay < LED_DELAY; Delay++);    //延时XGpio_DiscreteClear(&Gpio, LED_CHANNEL, LED);for (Delay = 0; Delay < LED_DELAY; Delay++);    //延时}return XST_SUCCESS;
}

 三、编写程序代码

        因为要实现4个拨码开关对应控制4个LED灯,所以代码需要进行修改:需要添加拨码开关GPIO的通道2,并将LED的GPIO设为通道1、方向设为输出;将switch的GPIO设为通道2、方向设为输入:

/**************************** Include Files 包含头文件 ********************************/
#include "xparameters.h"
#include "xgpio.h"
#include "xil_printf.h"/************************** Constant Definitions 常量定义 ****************************/
#define LED 0x00  //LED的gpio的方向:低四位全0表示,即全为输出
#define SW  0x0f  //switch的gpio的方向:低四位全1表示,即全为输出#define GPIO_EXAMPLE_DEVICE_ID  XPAR_GPIO_0_DEVICE_ID //获取GPIO设备ID(如果有两个GPIO模块需要再加一个ID,这里只有一个XPAR_GPIO_0模块)#define LED_CHANNEL 1 //LED的gpio通道为通道1
#define SW_CHANNEL  2 //switch的gpio通道为通道2/************************** Variable Definitions 变量定义 ****************************/
XGpio Gpio; //实例化XGpio名为GPIO
u32 data;   //定义u32类型变量data/********************************** Main 主函数  *************************************/
int main(void)
{/*** GPIO初始化 ***/int Status;Status = XGpio_Initialize(&Gpio, GPIO_EXAMPLE_DEVICE_ID);if (Status != XST_SUCCESS) {xil_printf("Gpio Initialization Failed\r\n");return XST_FAILURE;}XGpio_SetDataDirection(&Gpio, LED_CHANNEL, LED);   //设置LED通道的方向为输出XGpio_SetDataDirection(&Gpio, SW_CHANNEL, SW);     //设置Switch通道的方向为输入while (1) {data = XGpio_DiscreteRead(&Gpio, SW_CHANNEL);  //将switch的GPIO输入数据读取到dataXGpio_DiscreteWrite(&Gpio, LED_CHANNEL, data); //data数据输出给led的GPIO}return XST_SUCCESS;
}

        (6)修改结束进行烧录,再运行该程序。效果为4个拨码开关可以对应控制4个LED灯,到此GPIO的配置与简单使用介绍结束。

相关文章:

MicroBlaze软核开发(二):GPIO

实现功能&#xff1a;使用 MicroBlaze软核&#xff0c;配置GPIO用拨码开关控制LED灯 Vivado版本&#xff1a;2018.3 目录 引言 vivado部分&#xff1a; 一、配置GPIO 二、生成HDL文件编译 SDK部分&#xff1a; 一、导出硬件启动SDK 二、新建应用程序工程 三、编写程序代…...

threejs相机辅助对象cameraHelper

为指定相机创建一个辅助对象&#xff0c;显示这个相机的视锥。 想要在场景里面显示相机的视锥&#xff0c;需要创建两个相机。 举个例子&#xff0c;场景中有个相机A&#xff0c;想要显示相机A的视锥&#xff0c;那么需要一个相机B&#xff0c;把B放在A的后面&#xff0c;两个…...

Luma 视频生成 API 对接说明

Luma 视频生成 API 对接说明 随着 AI 的应用变广&#xff0c;各类 AI 程序已逐渐普及。AI 已逐渐深入到人们的工作生活方方面面。而 AI 涉及的行业也越来越多&#xff0c;从最初的写作&#xff0c;到医疗教育&#xff0c;再到现在的视频。 Luma 是一个专业高质量的视频生成平…...

服务器数据恢复—EVA存储硬盘磁头和盘片损坏离线的数据恢复案例

服务器存储数据恢复环境&故障&#xff1a; 一台HP EVA存储中有23块硬盘&#xff0c;挂接到一台windows server操作系统的服务器。 EVA存储上有三个硬盘指示灯亮黄灯&#xff0c;此刻存储还能正常使用。管理员在更换硬盘的过程中&#xff0c;又出现一块硬盘对应的指示灯亮黄…...

【Python】深入探索Python类型检查:掌握 `typing` 模块的高级用法

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着代码复杂度的增加,类型安全性在现代开发中变得尤为重要。Python自3.5引入类型提示(type hints),为开发者提供了静态类型检查的能力,而typing模块则是这一系统的核心。本篇文章深入研究Python的类型提示及…...

Android学习15--charger

1 概述 最近正好在做关机充电这个&#xff0c;就详细看看吧。还是本着保密的原则&#xff0c;项目里的代码也不能直接用&#xff0c;这里就用的Github的。https://github.com/aosp-mirror 具体位置是&#xff1a;https://github.com/aosp-mirror/platform_system_core/tree/mai…...

顶会新宠!KAN-LSTM完美融合新方案

2024深度学习发论文&模型涨点之——KANLSTM KAN-LSTM混合预测模型是一种结合了自注意力机制&#xff08;KAN, Key-attention network&#xff09;和长短时记忆网络&#xff08;LSTM&#xff09;的深度学习模型&#xff0c;主要用于序列数据的预测任务&#xff0c;如时间序…...

JS中对象的浅拷贝,深拷贝和引用

JS中对象的浅拷贝&#xff0c;深拷贝和引用 浅拷贝和深拷贝的区别主要在于它们如何处理引用类型的数据&#xff08;如数组和对象&#xff09;&#xff0c;而引用简而言之就是换了个变量名。 浅拷贝 引用&#xff1a;浅拷贝只复制对象的第一层属性&#xff0c;对于嵌套的对象或…...

思普企业运营平台 idsCheck Sql注入漏洞复现

0x01 产品描述: ‌思普企业运营平台‌是由贵阳思普信息技术有限公司自主研发的国内首款投融建管营云服务平台——...

FSWIND脉动风-风载时程生成器软件下载、安装及注册

1、软件下载 点击文末超链接下载 2、软件安装 以下操作&#xff0c;若被电脑杀毒软件提示风险&#xff0c;请加入白名单&#xff0c;软件无任何病毒和后台&#xff0c;请放心使用&#xff01; 1&#xff09;双击Fswind_setup.exe&#xff0c;启动安装程序 2&#xff09;、点…...

spring通过RequestContextHolder获取HttpServletRequest对象

1.获取HttpServletRequest对象方法&#xff1a; public static HttpServletRequest getRequest() {ServletRequestAttributes attributes ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes());assert attributes ! null;return attributes.getRequest(…...

STM32编码器接口及编码器测速模板代码

编码器是什么&#xff1f; 编码器是一种将角位移或者角速度转换成一连串电数字脉冲的旋转式传感 器&#xff0c;我们可以通过编码器测量到底位移或者速度信息。编码器从输出数据类型上 分&#xff0c;可以分为增量式编码器和绝对式编码器。 从编码器检测原理上来分&#xff0…...

qt QNetworkAccessManager详解

1、概述 QNetworkAccessManager是QtNetwork模块中的一个核心类&#xff0c;它允许应用程序发送网络请求并接收响应。该类是网络通信的基石&#xff0c;提供了一种方便的方式来处理常见的网络协议&#xff0c;如HTTP、HTTPS等。QNetworkAccessManager对象持有其发送的请求的通用…...

部署 Vue 前端项目到 Linux

看看怎么把一个 Vue 3 项目部署到 Linux 服务器上。准备好你的咖啡&#xff0c;让我们愉快地度过这段部署时光&#xff01; 前期准备 确保你已经在本地构建了 Vue 3 项目&#xff0c;并生成了 dist 文件夹。 npm run build构建完成后&#xff0c;你将看到一个新鲜出炉的 dis…...

数据分析:探索数据背后的秘密与挑战

在当今这个数据驱动的时代&#xff0c;数据分析已成为各行各业不可或缺的一部分。从市场营销到金融风控&#xff0c;从医疗健康到智能制造&#xff0c;数据分析为企业决策提供了强有力的支持。然而&#xff0c;尽管其重要性日益凸显&#xff0c;数据分析的过程并非一帆风顺&…...

文本域设置高度 加上文字限制并show出来:

文本域设置高度 :rows"4" 加上文字限制并show出来&#xff1a; maxlength"30" show-word-limit 效果: <el-form-item label"产品备注" prop"remark"><el-input v-model"form.remark" type"textarea"…...

深入浅出:Gin框架-简介与API开发入门

深入浅出&#xff1a;Gin框架-简介与API开发入门 引言 Gin框架是基于Go语言的HTTP Web框架&#xff0c;凭借其简单易用、性能卓越和丰富的功能&#xff0c;成为构建高性能Web应用的理想选择。本文将深入浅出地介绍Gin框架的基础知识&#xff0c;并通过一个简单的案例&#xf…...

MySQL各种锁详解

什么是锁&#xff1f; 1.1 锁的解释 计算机协调多个进程或线程并发访问某一资源的机制。 1.2 锁的重要性 在数据库中&#xff0c;除传统计算资源&#xff08;CPU、RAM、I/O等&#xff09;的争抢&#xff0c;数据也是一种供多用户共享的资源。 如何保证数据并发访问的一致性&…...

海外的bug-hunters,不一样的403bypass

一种绕过403的新技术&#xff0c;跟大家分享一下。研究HTTP协议已经有一段时间了。发现HTTP协议的1.0版本可以绕过403。于是开始对lyncdiscover.microsoft.com域做FUZZ并且发现了几个403Forbidden的文件。 &#xff08;访问fsip.svc为403&#xff09; 在经过尝试后&#xff0…...

React 组件中 State 的定义、使用及正确更新方式

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容React 组件中 State 的定义、使用及正确更新方式 前言 在 React 应用开发中&#xff0c;state …...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

2025-05-08-deepseek本地化部署

title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek&#xff1a;小白也能轻松搞定&#xff01; 如何给本地部署的 DeepSeek 投喂数据&#xff0c;让他更懂你 [实验目的]&#xff1a;理解系统架构与原…...

机器学习复习3--模型评估

误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异称为&#xff1a;误差&#xff08;error&#xff09;。 误差定义&#xff1a; ①在训练集上的误差称为训练误差&#xff08;training error&#xff09;或经验误差&#xff08;empirical error&#x…...

在ubuntu等linux系统上申请https证书

使用 Certbot 自动申请 安装 Certbot Certbot 是 Let’s Encrypt 官方推荐的自动化工具&#xff0c;支持多种操作系统和服务器环境。 在 Ubuntu/Debian 上&#xff1a; sudo apt update sudo apt install certbot申请证书 纯手动方式&#xff08;不自动配置&#xff09;&…...

视觉slam--框架

视觉里程计的框架 传感器 VO--front end VO的缺点 后端--back end 后端对什么数据进行优化 利用什么数据进行优化的 后端是怎么进行优化的 回环检测 建图 建图是指构建地图的过程。 构建的地图是点云地图还是什么信息的地图&#xff1f; 建图并没有一个固定的形式和算法…...