AXI GPIO 同意通道混合输入输出中断控制

#KEY
set_property IOSTANDARD LVCMOS18 [get_ports {AXI_GPIO_KEY_tri_io[0]}]
set_property PACKAGE_PIN J13 [get_ports {AXI_GPIO_KEY_tri_io[0]}] 
set_property IOSTANDARD LVCMOS18 [get_ports {AXI_GPIO_KEY_tri_io[1]}]
set_property PACKAGE_PIN H13 [get_ports {AXI_GPIO_KEY_tri_io[1]}]#LED
set_property IOSTANDARD LVCMOS18 [get_ports {AXI_GPIO_KEY_tri_io[2]}]
set_property PACKAGE_PIN U21 [get_ports {AXI_GPIO_KEY_tri_io[2]}]
set_property IOSTANDARD LVCMOS18 [get_ports {AXI_GPIO_KEY_tri_io[3]}]
set_property PACKAGE_PIN Y25 [get_ports {AXI_GPIO_KEY_tri_io[3]}]

main.c

#include <stdio.h>
#include "xil_printf.h"
#include "axi_gpio.h"
#include "axi_intr.h"
#include "sleep.h"u8 led1_flag = 0;
u8 led2_flag = 0;int main(){printf("AXI_GPIO_S\r\n");axi_gpio_config();intr_config();
//	LED_ON;while(1){out_axi_gpio(2,led1_flag);out_axi_gpio(3,led2_flag);printf("%lx   %d   %d\r\n",read_axi_reg(),led1_flag,led2_flag);sleep(1);AXI_GPIO_INTR(1);}return 0;
}

axi_gpio.c

#include <stdio.h>          // 标准输入输出函数,用于调试信息输出
#include "xparameters.h"    // 硬件系统参数定义,包含基地址和设备ID等
#include "axi_gpio.h"       // AXI GPIO寄存器定义,提供底层硬件访问XGpio 	AXI_Gpio	;#define GPIO_CHANNEL1			1											//AXI GPIO		通道号#define AXI_GPIO_ID 			XPAR_GPIO_0_DEVICE_ID						//AXI GPIO		器件ID//axi gpio 初始化
void axi_gpio_config(void){XGpio_Initialize(&AXI_Gpio, AXI_GPIO_ID);								//初始化AXI GPIOXGpio_SetDataDirection(&AXI_Gpio,GPIO_CHANNEL1,0x000000003);			//设置对应通道为0011输出输入LED_OFF;
}//读取通道当前状态
u32 read_axi_reg(void){return XGpio_DiscreteRead(&AXI_Gpio,GPIO_CHANNEL1);
}//输出函数
//bit_pos:要修改的数据位
//value:要修改的数据
void out_axi_gpio(u32 bit_pos,u8 value){u32 out_data;out_data = modify_bit(read_axi_reg(),bit_pos,value);XGpio_DiscreteWrite(&AXI_Gpio,GPIO_CHANNEL1,out_data);
}/*** @brief 修改数据的特定位* @param data 要修改的原始数据* @param bit_pos 要修改的位位置(0-31,0表示最低位)* @param value 要设置的值(0或1)* @return 修改后的数据** @details 此函数通过创建掩码来修改数据的特定位,不影响其他位的值* 使用示例:modify_bit(0x00000000, 3, 1) 返回 0x00000008(设置第3位为1)*/
u32 modify_bit(u32 data, u32 bit_pos, u8 value) {// 创建指定位的掩码:将1左移bit_pos位// 例如:bit_pos=3 -> mask = 0b00001000 (0x08)u32 mask = 1U << bit_pos;if (value) {// 设置特定位为1:使用OR操作将指定位设为1data |= mask;} else {// 设置特定位为0:使用AND操作与掩码的反码,清除指定位data &= ~mask;}return data;
}/*** 获取32位数据中特定位的值* @param data 原始数据* @param bit_pos 位位置(0-31,0表示最低位)* @return 指定位的值(0或1)*/
u32 get_bit(u32 data, u32 bit_pos) {// 确保位位置在有效范围内(0-31)if(bit_pos > 31) return 0;// 将数据右移,使目标位移动到最低位,然后与1进行与操作return (data >> bit_pos) & 1;
}

axi_gpio.h

#include <stdio.h>
#include "xparameters.h"
#include "xgpio.h"extern  XGpio 	AXI_Gpio	;#define GPIO_CHANNEL1			1											//AXI GPIO		通道号#define LED_ON		XGpio_DiscreteWrite(&AXI_Gpio,GPIO_CHANNEL1,0X0000000F)							//控制IO输出1
#define LED_OFF		XGpio_DiscreteWrite(&AXI_Gpio,GPIO_CHANNEL1,0X00000003)							//控制IO输出0void axi_gpio_config(void);
u32 read_axi_reg(void);
u32 modify_bit(u32 data, u32 bit_pos, u8 value);
void out_axi_gpio(u32 bit_pos,u8 value);
u32 get_bit(u32 data, u32 bit_pos);

axi_intr.c

#include <stdio.h>
#include "xparameters.h"
#include "xgpio.h"
#include "xil_exception.h"
#include "xscugic.h"
#include "axi_intr.h"
#include "axi_gpio.h"extern	XGpio 	AXI_Gpio	;XScuGic Intc		;#define AXI_GPIO_ID 			XPAR_GPIO_0_DEVICE_ID						//AXI GPIO		器件ID
#define INTC_DEVICE_ID			XPAR_SCUGIC_SINGLE_DEVICE_ID				//中断控制器 		器件ID#define AXI_GPIO_INT_ID			XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR	//AXI GPIO		中断ID#define GPIO_CHANNEL1			1											//AXI GPIO		通道号extern	u8 led1_flag;
extern	u8 led2_flag;void intr_config(void){XGpio_Initialize(&AXI_Gpio, AXI_GPIO_ID);								//初始化AXI GPIOXGpio_SetDataDirection(&AXI_Gpio,GPIO_CHANNEL1,0x00000003);				//设置对应通道为输入SetupInterruptSystem(&Intc,&AXI_Gpio,AXI_GPIO_INT_ID);					//设置中断系统
}void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpio *AXI_Gpio,u16 AXI_GpioIntrId)
{XScuGic_Config *IntcConfig;//查找GIC配置信息,进行初始化IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);XScuGic_CfgInitialize(GicInstancePtr, IntcConfig,IntcConfig->CpuBaseAddress);/*********************************************************************************************************************///初始化ARM处理器异常句柄Xil_ExceptionInit();//给IRQ异常注册处理程序Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,GicInstancePtr);//使能处理器中断Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
/*********************************************************************************************************************///关联IQC异常处理函数XScuGic_Connect(GicInstancePtr,AXI_GpioIntrId,(Xil_ExceptionHandler)IntrHandler,(void *)AXI_Gpio);//使能GIC控制器对应ID中断XScuGic_Enable(GicInstancePtr, AXI_GpioIntrId);//设置优先级0xA0   触发类型 0x3边沿触发(上升沿或下降沿)XScuGic_SetPriorityTriggerType(GicInstancePtr, AXI_GpioIntrId,0xA0, 0x3);//打开AXI GPIO IP中断使能 通道使能XGpio_InterruptGlobalEnable(AXI_Gpio);XGpio_InterruptEnable(AXI_Gpio,0x00000003);
}void IntrHandler(void){printf("from intr\r\n");//关闭AXI GPIO1中断使能AXI_GPIO_INTR(0);
//	//判断AXI KEYif(get_bit(read_axi_reg(),0) == 0){led1_flag = !led1_flag;}if(get_bit(read_axi_reg(),1) == 0){led2_flag = !led2_flag;}
//	else;//清楚中断线XGpio_InterruptClear(&AXI_Gpio,GPIO_CHANNEL1);
}

axi_intr.h

#include <stdio.h>
#include "xparameters.h"
#include "xgpio.h"
#include "xil_exception.h"
#include "xscugic.h"void intr_config(void);
void IntrHandler(void);
void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpio *AXI_Gpio,u16 AXI_GpioIntrId);extern	XScuGic Intc		;
extern  XGpio 	AXI_Gpio	;#define AXI_GPIO_INTR(a) if(a)\XGpio_InterruptEnable(&AXI_Gpio,0x00000003);\else XGpio_InterruptDisable(&AXI_Gpio,0x00000000);

实现AXI GPIO[1:0]做输入,中断控制AXI GPIO[3:2]做输出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919619.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919619.shtml
英文地址,请注明出处:http://en.pswp.cn/news/919619.shtml

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

相关文章

如何通过传感器选型优化,为设备寿命 “续航”?

在当今竞争激烈的工业领域&#xff0c;企业就像在一场没有硝烟的战争中角逐&#xff0c;设备便是企业的“秘密武器”。设备的使用寿命&#xff0c;如同武器的耐用程度&#xff0c;直接决定了企业在生产战场上的“战斗力”。延长设备寿命&#xff0c;已然成为众多企业降低生产成…

WebSocket连接的例子

// 初始化WebSocket连接 const initWebSocket () > {console.log("初始化链接中...")const websocketUrl ws://61.54.84.16:9090/;// WebSocket服务器地址websocket new WebSocket(websocketUrl)//使用真实的webscket// websocket new MockWebSocket(websocket…

c++之指针和引用

一 使用场景 C++ 什么时候使用指针?什么时候使用引用?什么时候应该按值传递?_引用什么时候用比较好-CSDN博客 只使用传递过来的值,而不对值进行修改 需要修改传递过来的值 内置数据类型 按值传递(小型结构) 指针传递 数组 指针传递 指针传递 结构 指针或引用(较大的结构…

pytorch学习笔记-模型训练、利用GPU加速训练(两种方法)、使用模型完成任务

应该算是完结啦~再次感谢土堆老师&#xff01; 模型训练 模型训练基本可以分为以下几个步骤按序执行&#xff1a; 引入数据集-使用dataloader加载数据集-建立模型-设置损失函数-设置优化器-进行训练-训练中计算损失&#xff0c;并使用优化器更新参数-模型测试-模型存储 习惯上会…

深度卷积神经网络AlexNet

在提出LeNet后卷积神经网络在计算机视觉和机器学习领域中报有名气&#xff0c;但是卷积神经网络并没有主导这些领域&#xff0c;因为LeNet在小数据集上取得了很好的效果&#xff0c;在更大&#xff0c;更真实的数据集上训练卷积神经网络的性能 和可行性有待研究&#xff0c;20世…

数据结构-HashSet

在 Java 编程的世界里&#xff0c;集合框架是极为重要的一部分&#xff0c;而 HashSet 作为 Set 接口的典型实现类&#xff0c;在处理不允许重复元素的场景中频繁亮相。今天&#xff0c;我们就一同深入探究 HashSet&#xff0c;梳理它的特点、常用方法&#xff0c;以及和其他相…

心意行药号 · 慈心方的八种用法

心意行药号 慈心方的八种用法慈心方是心意行药号589个珍贵秘方中的一个养生茶方&#xff0c;配伍比例科学严谨&#xff0c;君臣佐使堪称经典&#xff0c;自古就有“小小慈心方&#xff0c;转动大乾坤”之说。自清代光绪年间传承至今&#xff0c;慈心方受益者逾百万计&#xff…

Spring面试宝典:Spring IOC的执行流程解析

在准备Spring框架的面试时&#xff0c;“Spring IOC的工作流程是什么&#xff1f;” 是一个非常经典的问题。虽然网上有很多详细的教程&#xff0c;但它们往往过于复杂&#xff0c;对于没有深入研究过源码的人来说理解起来确实有些困难。今天我们就来简化这个概念&#xff0c;从…

学习日志39 python

1 fromkeys()函数是什么在 Python 中&#xff0c;fromkeys() 是字典&#xff08;dict&#xff09;的一个类方法&#xff0c;用于创建一个新字典。它的作用是&#xff1a;根据指定的可迭代对象&#xff08;如列表、元组等&#xff09;中的元素作为键&#xff08;key&#xff09;…

SpringBoot + MyBatis-Plus 使用 listObjs 报 ClassCastException 的原因与解决办法

在项目中我们经常会遇到这种需求&#xff1a; 根据一组 ID 查询数据库&#xff0c;并返回指定字段列表。 我在写代码的时候&#xff0c;遇到了一个典型的坑&#xff0c;分享出来给大家。一、问题背景我的代码是这样写的&#xff08;查询项目表的负责人信息&#xff09;&#xf…

WT2606B 驱屏语音芯片新增蓝牙功能:功能集成一体化,产品升级自动化,语音交互无线化,场景应用普适化!

小伙伴们&#xff0c;欢迎来到我们的 &#xff03;唯创芯片小讲堂&#xff01;今天我们要为大家介绍一位多才多艺的"芯片全能手"——WT2606B驱屏语音芯片。这颗芯片将在今年8月的I0TE物联网展及ELEXCON 2025深圳国际电子展上大放异彩。在智能设备满天飞的今天&#x…

ORA-16331: container is not open ORA-06512: at “SYS.DBMS_LOGMNR“

使用Flink CDC、Debezium等CDC工具对Oracle进行基于log的实时数据同步时遇到异常ORA-16331: container is not open的解决方案。 1. 异常信息 异常信息通常如下&#xff1a; at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1823) at oracle.jdbc…

「三维共振」:重构实体零售的破局模式

在电商冲击与消费升级的双重浪潮下&#xff0c;传统零售模式正面临前所未有的挑战。wo店首创的 “三维共振” 运营模式&#xff0c;以场景体验为根基、数据驱动为引擎、社群共生为纽带&#xff0c;构建起线上线下深度融合的新型零售生态&#xff0c;至今已实现连续 18 个月客流…

将集合拆分成若干个batch,并将batch存于新的集合

在使用saveAll()等方法时&#xff0c;为了防止集合元素过大&#xff0c;使用splitList将原集合&#xff0c;分割成若干个小集合 import java.util.ArrayList; import java.util.List;public class ListUtils {/*** 将集合拆分成若干个batch,并将batch存于新的集合** param list…

Java主流框架全解析:从企业级开发到云原生

Java作为一门历史悠久且应用广泛的编程语言&#xff0c;其强大的生态系统离不开各种优秀的框架支持。无论是传统的企业级应用开发&#xff0c;还是现代的微服务、云原生架构&#xff0c;Java都提供了丰富的框架选择。本文将全面解析当前主流的Java框架&#xff0c;涵盖Web开发、…

机器学习——网格搜索(GridSearchCV)超参数优化

网格搜索&#xff08;Grid Search&#xff09;详细教学1. 什么是网格搜索&#xff1f;在机器学习模型中&#xff0c;算法的**超参数&#xff08;Hyperparameters&#xff09;**对模型的表现起着决定性作用。比如&#xff1a;KNN 的邻居数量 n_neighborsSVM 的惩罚系数 C 和核函…

【LeetCode】18. 四数之和

文章目录18. 四数之和题目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a;解题思路算法一&#xff1a;排序 双指针&#xff08;推荐&#xff09;算法二&#xff1a;通用 kSum&#xff08;含 2Sum 双指针&#xff09;复杂度关键细节代码实现要点完整题解代码18. 四数…

Go语言入门(10)-数组

访问数组元素&#xff1a;数组中的每个元素都可以通过“[]”和一个从0开始的索引进行访问数组的长度可由内置函数len来确定。在声明数组时&#xff0c;未被赋值元素的值是对应类型的零值。下面看一个例子package mainfunc main(){var planets [8]stringplanets[0] "Mercu…

为什么经过IPSec隧道后HTTPS会访问不通?一次隧道环境下的实战分析

在运维圈子里&#xff0c;大家可能都遇到过这种奇怪的问题&#xff1a;浏览器能打开 HTTP 网站&#xff0c;但一换成 HTTPS&#xff0c;页面就死活打不开。前段时间&#xff0c;我们就碰到这么一个典型案例。故障现象某公司系统在 VPN 隧道里访问 HTTPS 服务&#xff0c;结果就…

【Linux系统】进程信号:信号的产生和保存

上篇文章我们介绍了Syetem V IPC的消息队列和信号量&#xff0c;那么信号量和我们下面要介绍的信号有什么关系吗&#xff1f;其实没有关系&#xff0c;就相当于我们日常生活中常说的老婆和老婆饼&#xff0c;二者并没有关系1. 认识信号1.1 生活角度的信号解释&#xff08;快递比…