4 - AXI GPIO按键控制LED实验
文章目录
- 1 实验任务
- 2 系统框图
- 3 软件设计
1 实验任务
本实验任务是通过调用PL端AXI GPIO IP核,使用中断机制,实现PL端按键控制 PS端LED的功能。
2 系统框图

3 软件设计
注意事项:
- AXI GPIO IP核是双沿触发中断,不可设置;
- AXI GPIO IP核的中断使能和中断状态都是以通道为单位。
/***************************** Include Files ********************************/
#include <stdio.h>
#include "xil_exception.h"
#include "xparameters.h"
#include "xgpiops.h"
#include "xgpio.h"
#include "xscugic.h"
#include "xstatus.h"
#include "sleep.h"
/************************** Constant Definitions ****************************/
#define PSGPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
#define AXIGPIO_DEVICE_ID XPAR_GPIO_0_DEVICE_ID
#define INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID#define AXIGPIO_INTR_ID XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR#define PS_LED0_GPIO_PIN 0
#define AXIGPIO_CHANNEL1 0x1
/**************************** Type Definitions ******************************//***************** Macros (Inline Functions) Definitions ********************//************************** Function Prototypes *****************************/
int PsGpioInit(XGpioPs* PsGpioInstPtr);
int AxiGpioInit(XGpio* AxiGpioInstPtr);
int SetupIntrSystem(XScuGic* IntcInstPtr, XGpio* AxiGpioInstPtr, u16 AxiGpioIntrId);
void AxiGpioIntrHandler(void *CallBackRef);
/************************** Variable Definitions ****************************/
XGpioPs PsGpioInst;
XGpio AxiGpioInst;
XScuGic IntcInst;u32 KeyPress = 0;
/****************************************************************************/int PsGpioInit(XGpioPs* PsGpioInstPtr)
{//int Status;XGpioPs_Config* PsGpioConfigPtr;//PsGpioConfigPtr = XGpioPs_LookupConfig(PSGPIO_DEVICE_ID);Status = XGpioPs_CfgInitialize(PsGpioInstPtr, PsGpioConfigPtr, PsGpioConfigPtr->BaseAddr);if (Status != XST_SUCCESS) {return XST_FAILURE;}// 设置输出XGpioPs_SetDirectionPin(PsGpioInstPtr, PS_LED0_GPIO_PIN, 1);// 使能输出XGpioPs_SetOutputEnablePin(PsGpioInstPtr, PS_LED0_GPIO_PIN, 1);//return XST_SUCCESS;
}int AxiGpioInit(XGpio* AxiGpioInstPtr)
{//int Status;XGpio_Config* AxiGpioConfigPtr;//AxiGpioConfigPtr = XGpio_LookupConfig(AXIGPIO_DEVICE_ID);Status = XGpio_CfgInitialize(AxiGpioInstPtr, AxiGpioConfigPtr, AxiGpioConfigPtr->BaseAddress);if (Status != XST_SUCCESS) {return XST_FAILURE;}// 设置输入XGpio_SetDataDirection(AxiGpioInstPtr, AXIGPIO_CHANNEL1, 0x1);// 使能中断XGpio_InterruptEnable(AxiGpioInstPtr, XGPIO_IR_CH1_MASK);XGpio_InterruptGlobalEnable(AxiGpioInstPtr);//return XST_SUCCESS;
}/** 如何设置AXI GPIO引脚方向** XGpio gpio_instance;* int channel = 1; // 假设使用通道1* int bit_to_change = 3; // 假设要修改第3位** // 初始化GPIO* XGpio_Initialize(&gpio_instance, XPAR_XGPIOPS_0_DEVICE_ID);** // 读取当前方向寄存器的值* u32 current_direction = XGpio_GetDataDirection(&gpio_instance, channel);*
// 将第3位设置为输出(0)* u32 new_direction_output = current_direction & ~(1 << bit_to_change);* XGpio_SetDataDirection(&gpio_instance, channel, new_direction_output);** // 将第3位设置为输入(1)* u32 new_direction_input = current_direction | (1 << bit_to_change);* XGpio_SetDataDirection(&gpio_instance, channel, new_direction_input);**/int SetupIntrSystem(XScuGic* IntcInstPtr, XGpio* AxiGpioInstPtr, u16 AxiGpioIntrId)
{//int Status;XScuGic_Config* IntcConfigPtr;// step1. 初始化中断控制器GICIntcConfigPtr= XScuGic_LookupConfig(INTC_DEVICE_ID);if (NULL == IntcConfigPtr) {return XST_FAILURE;}Status = XScuGic_CfgInitialize(IntcInstPtr, IntcConfigPtr, IntcConfigPtr->CpuBaseAddress);if (Status != XST_SUCCESS) {return XST_FAILURE;}// step2. 在处理器中初始化异常处理功能Xil_ExceptionInit();// step3. 在处理器中为IRQ中断异常注册处理程序Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, IntcInstPtr);// step4. 在处理器中使能IRQ中断异常Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);// step5. 在GIC中为外设注册中断处理程序// XScuGic_Connect函数将中断源(Int_Id)与中断处理程序(Handler)关联起来;当中断发生时,GIC会调用中断处理程序来处理中断Status = XScuGic_Connect(IntcInstPtr, AxiGpioIntrId, (Xil_ExceptionHandler)AxiGpioIntrHandler, (void *)AxiGpioInstPtr);if (Status != XST_SUCCESS) {return XST_FAILURE;}// step6. 在GIC中设置外设中断的优先级和触发类型XScuGic_SetPriorityTriggerType(IntcInstPtr, AxiGpioIntrId, 0xA0, 0x1);// step7. 在GIC中使能外设中断XScuGic_Enable(IntcInstPtr, AxiGpioIntrId);//return XST_SUCCESS;
}void AxiGpioIntrHandler(void *CallBackRef)
{//XGpio* AxiGpioInstPtr = (XGpio*)CallBackRef;u32 IntrStatus;//IntrStatus = XGpio_InterruptGetStatus(AxiGpioInstPtr);if (IntrStatus==1){// 禁用中断XGpio_InterruptDisable(AxiGpioInstPtr, XGPIO_IR_CH1_MASK);printf("Interrupt Detected.\n");KeyPress = 1;}//return;
}int main()
{//int Status;u32 LedValue;u32 KeyValue;//printf("AXI GPIO Interrupt Control LED Test\n");//Status = PsGpioInit(&PsGpioInst);if (Status == XST_FAILURE) {printf("PS GPIO Init Failed.\n");}//Status = AxiGpioInit(&AxiGpioInst);if (Status == XST_FAILURE) {printf("AXI GPIO Init Failed.\n");}//Status = SetupIntrSystem(&IntcInst, &AxiGpioInst, AXIGPIO_INTR_ID);if (Status == XST_FAILURE) {printf("Setup Interrupt System Failed.\n");}//while(1){if (KeyPress==1){usleep(200000);KeyValue = XGpio_DiscreteRead(&AxiGpioInst, AXIGPIO_CHANNEL1);if ((KeyValue & (1 << 0)) == 0) {LedValue = ~XGpioPs_ReadPin(&PsGpioInst, PS_LED0_GPIO_PIN);XGpioPs_WritePin(&PsGpioInst, PS_LED0_GPIO_PIN, LedValue);}KeyPress = 0;XGpio_InterruptClear(&AxiGpioInst, XGPIO_IR_CH1_MASK);XGpio_InterruptEnable(&AxiGpioInst, XGPIO_IR_CH1_MASK);}}//return 0;
}
相关文章:
4 - AXI GPIO按键控制LED实验
文章目录 1 实验任务2 系统框图3 软件设计 1 实验任务 本实验任务是通过调用PL端AXI GPIO IP核,使用中断机制,实现PL端按键控制 PS端LED的功能。 2 系统框图 3 软件设计 注意事项: AXI GPIO IP核是双沿触发中断,不可设置&…...
题海拾贝:扫雷
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞,关注! 1、题…...
Deepseek本地部署小实践(c盘)
目录 前言 一、安装ollama 二、打开终端执行run 三、可视化 前言 小鲸鱼出来以后看到很多大佬本地部署AI,自己也想试一试,第一次部署AI,选了一个简单的办法,实践一下,写得比较粗糙。 一、安装ollama 先简单的介绍…...
详细解析d3dx9_27.dll丢失怎么办?如何快速修复d3dx9_27.dll
运行程序时提示“d3dx9_27.dll文件缺失”,通常由DirectX组件损坏或文件丢失引起。此问题可通过系统化修复方法解决,无需重装系统或软件。下文将详细说明具体步骤及注意事项。 一.d3dx9_27.dll缺失问题的本质解析 当系统提示“d3dx9_27.dll丢失”时&…...
【LeetCode刷题之路】leetcode155.最小栈
LeetCode刷题记录 🌐 我的博客主页:iiiiiankor🎯 如果你觉得我的内容对你有帮助,不妨点个赞👍、留个评论✍,或者收藏⭐,让我们一起进步!📝 专栏系列:LeetCode…...
矩阵乘积态简介
定义 矩阵乘积态(Matrix Product State, MPS)是一种用于表示量子多体系统的强大工具,特别是在一维系统中。MPS 是一种张量网络状态,它通过将全局量子态分解为一系列局部张量的乘积来有效地表示量子态。 注释: 量子态表…...
Oracle数据库分区自动删除
说明: 该存储过程部署后,设置成定时任务,每天执行。 每次执行删除partition_position 2的分区,删除之后,partition_position 3的分区会前移到partition_position 为 2; CREATE OR REPLACE PROCEDURE BILL_CENT_JI…...
华三交换机S5560 NQA测试
文章目录 NQA配置介绍实验说明 NQA配置介绍 NQA配置 nqa entry admin testtype icmp-echo //配置NQA类型destination ip 10.1.0.1 //配置探测的目的IPsource ip 10.1.0.2 //配置探测的源IPfrequency 6000 //配置探测的时间history-record enable //历史探测记录…...
Vue全局变量的定义和使用,创建 Store变量、读取、修改
在VUE中,当需要各js、各页面都能读写的全局变量时,可以用store变量,从定义到使用的方法如下 一.定义变量,例:我们定一个全局变量gxh 找到 vue的/ src/ store路径, 在 modules文件夹下创建文件gvar.js 在…...
基于Docker的前端环境管理:从开发环境到生产部署的实现方案
# 基于Docker的前端环境管理:从开发环境到生产部署的实现方案 简介及前端开发环境挑战 简介 是一种容器化平台,可以将应用程序及其依赖项打包为一个容器,提供一种轻量级、可移植的环境。它能够简化开发、部署和运维的流程,提高…...
单片机延时函数怎么写规范?
我们以前在开发产品的时候,肯定会碰到一些延时需求,比如常见的LED闪烁,按键消抖,控制IO口输出时序等等。 别小看延时,这个小问题,想做好,甚至要考虑到程序架构层面。 在开发板上,可能…...
数据结构 1-2 线性表的链式存储-链表
1 原理 顺序表的缺点: 插入和删除移动大量元素数组的大小不好控制占用一大段连续的存储空间,造成很多碎片 链表规避了上述顺序表缺点 逻辑上相邻的两个元素在物理位置上不相邻 头结点 L:头指针 头指针:链表中第一个结点的存储…...
vue2版本elementUI的table分页实现多选逻辑
1. 需求 我们需要在表格页上实现多选要求,该表格支持分页逻辑。 2. 认识属性 表格属性 参数说明类型可选值默认值data显示的数据array——row-key行数据的 Key,用来优化 Table 的渲染;在使用 reserve-selection 功能与显示树形数据时&…...
比特信噪比与信噪比SNR的换算公式
在无线通信系统中,比特信噪比与信噪比(SNR,通常指符号信噪比Es/N0)的换算: 核心公式 E b N 0 SNR R ⋅ log 2 M \boxed{ \frac{E_b}{N_0} \frac{\text{SNR}}{R \cdot \log_2 M} } N0EbR⋅log2MSNR 或…...
设计模式-解释器模式、装饰器模式
解释器模式 定义 给分析对象定义一个语言,并定义语言的文法表示,再设计一个解释器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口,该接口解释一个特定的上下文。 类图 …...
C++初阶——简单实现list
目录 1、前言 2、List.h 3、Test.cpp 1、前言 1. 简单实现std::list,重点:迭代器,类模板,运算符重载。 2. 并不是,所有的类,都需要深拷贝,像迭代器类模板,只是用别的类的资源&am…...
linux 命令+相关配置记录(持续更新...)
linux 命令记录相关配置记录 磁盘切换 cd D:#这里表示切换到D盘查看wsl 安装的linux 子系统 wsl --list -vwsl 卸载 linux 子系统 wsl --unregister -xxx # xxx 表示子系统的名字备份Linux 子系统 导出 wsl --export xxx yyy # xxx 表示子系统的名字 yyy 表示压…...
【PDF预览】使用iframe实现pdf文件预览,加盖章
使用iframe实现pdf文件预览,以及在pdf上添加水印。另外还包括批注、打印、下载、缩放、分页等功能 <iframesrc"http://static.shanhuxueyuan.com/test.pdf"width"100%"height"100%"frameborder"0"></iframe>&l…...
网络运维学习笔记(DeepSeek优化版)002网工初级(HCIA-Datacom与CCNA-EI)子网划分与协议解析
文章目录 子网划分与协议解析1. VLSM与CIDR技术解析1.1 VLSM(Variable Length Subnetwork Mask,可变长子网掩码)1.2 CIDR(Classless Inter-Domain Routing,无类域间路由) 2. 子网划分方法与计算2.1 常规划分…...
在线骑行|基于SpringBoot的在线骑行网站设计与实现(源码+数据库+文档)
在线骑行网站系统 目录 基于SpringBoot的在线骑行设计与实现 一、前言 二、系统设计 三、系统功能设计 5.1用户信息管理 5.2 路线攻略管理 5.3路线类型管理 5.4新闻赛事管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取…...
BUUCTF-Web方向21-25wp
目录 [HCTF 2018]admin弱口令session伪造 [MRCTF2020]你传你🐎呢[护网杯 2018]easy_tornado[ZJCTF 2019]NiZhuanSiWei[MRCTF2020]Ez_bypass第一层第二层 [HCTF 2018]admin 打开环境,有三处提示,一个跳转链接,一个登录注册&#x…...
软考——WWW与HTTP
1.万维网(world wide web) 是一个规模巨大的、可以资源互联的资料空间。由URL进行定位,通过HTTP协议传送给使用者,又由HTML来进行文件的展现。 它的主要组成部分是:URL、HTTP、HTML。 (1)URL…...
GO 进行编译时插桩,实现零码注入
Go 编译时插桩 Go 语言的编译时插桩是一种在编译阶段自动注入监控代码的技术,目的是在不修改业务代码的情况下,实现对应用程序的监控和追踪。 基本原理 Go 编译时插桩的核心思想是通过在编译过程中对源代码进行分析和修改,将监控代码注入到…...
为人工智能驱动的交通研究增强路面传感器数据采集
论文标题 英文标题:Enhancing Pavement Sensor Data Harvesting for AI-Driven Transportation Studies 中文标题:为人工智能驱动的交通研究增强路面传感器数据采集 作者信息 Manish Kumar Krishne Gowda Purdue University, 465 Northwestern Avenue,…...
unordered_set和unordered_map的使用
Hello,今天我来为大家介绍一下前几年才刚刚新出的两个容器——unordered_map和unordered_set,这两个容器属于是map系列和set系列中的一种,和map/set不同的是它们的底层,map/set的底层是红黑树,而unordered_map/unorder…...
【实体类】分层设计
【实体类】分层设计 【一】实体类的PO、VO、DO、DAO、BO、DTO、POJO有什么区别【1】PO(Persistent Object)【2】VO(View Object)【3】DO(Domain Object)【4】DAO(Data Access Object)…...
【无人集群系列---无人机集群编队算法】
【无人集群系列---无人机集群编队算法】 一、核心目标二、主流编队控制方法1. 领航-跟随法(Leader-Follower)2. 虚拟结构法(Virtual Structure)3. 行为法(Behavior-Based)4. 人工势场法(Artific…...
C语言基本知识------指针(4)
1. 回调函数是什么? 回调函数就是⼀个通过函数指针调用的函数。 如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数。 void qsort(void base,//指针…...
深度学习pytorch之19种优化算法(optimizer)解析
提示:有谬误请指正 摘要 本博客详细介绍了多种常见的深度学习优化算法,包括经典的LBFGS 、Rprop 、Adagrad、RMSprop 、Adadelta 、ASGD 、Adamax、Adam、AdamW、NAdam、RAdam以及SparseAdam等,通过对这些算法的公式和参数说明进行详细解析…...
使用 BFS 解决 最短路问题
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: 优选算法专题 目录 1926.迷宫中离入口最近的出口 433.最小基因变化 127.单词接龙 675.为高尔夫比赛砍树 1926.迷宫中离入口最近的出口 题…...
