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
实现功能:使用 MicroBlaze软核,配置GPIO用拨码开关控制LED灯 Vivado版本:2018.3 目录 引言 vivado部分: 一、配置GPIO 二、生成HDL文件编译 SDK部分: 一、导出硬件启动SDK 二、新建应用程序工程 三、编写程序代…...

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

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

服务器数据恢复—EVA存储硬盘磁头和盘片损坏离线的数据恢复案例
服务器存储数据恢复环境&故障: 一台HP EVA存储中有23块硬盘,挂接到一台windows server操作系统的服务器。 EVA存储上有三个硬盘指示灯亮黄灯,此刻存储还能正常使用。管理员在更换硬盘的过程中,又出现一块硬盘对应的指示灯亮黄…...
【Python】深入探索Python类型检查:掌握 `typing` 模块的高级用法
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着代码复杂度的增加,类型安全性在现代开发中变得尤为重要。Python自3.5引入类型提示(type hints),为开发者提供了静态类型检查的能力,而typing模块则是这一系统的核心。本篇文章深入研究Python的类型提示及…...

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

顶会新宠!KAN-LSTM完美融合新方案
2024深度学习发论文&模型涨点之——KANLSTM KAN-LSTM混合预测模型是一种结合了自注意力机制(KAN, Key-attention network)和长短时记忆网络(LSTM)的深度学习模型,主要用于序列数据的预测任务,如时间序…...
JS中对象的浅拷贝,深拷贝和引用
JS中对象的浅拷贝,深拷贝和引用 浅拷贝和深拷贝的区别主要在于它们如何处理引用类型的数据(如数组和对象),而引用简而言之就是换了个变量名。 浅拷贝 引用:浅拷贝只复制对象的第一层属性,对于嵌套的对象或…...
思普企业运营平台 idsCheck Sql注入漏洞复现
0x01 产品描述: 思普企业运营平台是由贵阳思普信息技术有限公司自主研发的国内首款投融建管营云服务平台——...

FSWIND脉动风-风载时程生成器软件下载、安装及注册
1、软件下载 点击文末超链接下载 2、软件安装 以下操作,若被电脑杀毒软件提示风险,请加入白名单,软件无任何病毒和后台,请放心使用! 1)双击Fswind_setup.exe,启动安装程序 2)、点…...
spring通过RequestContextHolder获取HttpServletRequest对象
1.获取HttpServletRequest对象方法: public static HttpServletRequest getRequest() {ServletRequestAttributes attributes ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes());assert attributes ! null;return attributes.getRequest(…...

STM32编码器接口及编码器测速模板代码
编码器是什么? 编码器是一种将角位移或者角速度转换成一连串电数字脉冲的旋转式传感 器,我们可以通过编码器测量到底位移或者速度信息。编码器从输出数据类型上 分,可以分为增量式编码器和绝对式编码器。 从编码器检测原理上来分࿰…...

qt QNetworkAccessManager详解
1、概述 QNetworkAccessManager是QtNetwork模块中的一个核心类,它允许应用程序发送网络请求并接收响应。该类是网络通信的基石,提供了一种方便的方式来处理常见的网络协议,如HTTP、HTTPS等。QNetworkAccessManager对象持有其发送的请求的通用…...
部署 Vue 前端项目到 Linux
看看怎么把一个 Vue 3 项目部署到 Linux 服务器上。准备好你的咖啡,让我们愉快地度过这段部署时光! 前期准备 确保你已经在本地构建了 Vue 3 项目,并生成了 dist 文件夹。 npm run build构建完成后,你将看到一个新鲜出炉的 dis…...

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

文本域设置高度 加上文字限制并show出来:
文本域设置高度 :rows"4" 加上文字限制并show出来: maxlength"30" show-word-limit 效果: <el-form-item label"产品备注" prop"remark"><el-input v-model"form.remark" type"textarea"…...
深入浅出:Gin框架-简介与API开发入门
深入浅出:Gin框架-简介与API开发入门 引言 Gin框架是基于Go语言的HTTP Web框架,凭借其简单易用、性能卓越和丰富的功能,成为构建高性能Web应用的理想选择。本文将深入浅出地介绍Gin框架的基础知识,并通过一个简单的案例…...
MySQL各种锁详解
什么是锁? 1.1 锁的解释 计算机协调多个进程或线程并发访问某一资源的机制。 1.2 锁的重要性 在数据库中,除传统计算资源(CPU、RAM、I/O等)的争抢,数据也是一种供多用户共享的资源。 如何保证数据并发访问的一致性&…...

海外的bug-hunters,不一样的403bypass
一种绕过403的新技术,跟大家分享一下。研究HTTP协议已经有一段时间了。发现HTTP协议的1.0版本可以绕过403。于是开始对lyncdiscover.microsoft.com域做FUZZ并且发现了几个403Forbidden的文件。 (访问fsip.svc为403) 在经过尝试后࿰…...

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

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...

【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...