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

AXI GPIO S——ZYNQ学习笔记10

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.dtcms.com/a/341982.html

相关文章:

  • 基于OpenCV的物体识别与计数
  • 基于SpringBoot的流浪动物领养管理系统【2026最新】
  • 【Android】悬浮窗清理
  • 政务分建用户体系下基于OAuth2.0概念单点登录实现方案
  • CT02-20.有效的括号(Java)
  • 【Linux | 网络】多路转接IO之select
  • Linux软件编程--网络操作
  • FreeRTOS,事件标注组创建,xEventGroupCreate、xEventGroupCreateStatic
  • 【自记】Power BI 中 CALCULATETABLE 第二个及后续参数支持的两种类型说明
  • 基于混合注意力网络和深度信念网络的鲁棒视频水印技术基础理论深度解析
  • 【世纪龙科技】汽车专业虚拟仿真实训基地建设-理实虚一体化实践
  • 【lucene】lucene常用查询一览
  • 一键去除 Windows 图标角标(小箭头、盾牌与双箭头)
  • JeeSite V5.13.0 发布,升级 Spring Boot 3.5,Cloud 2025,AI 1.0,Vite 7
  • ORACLE中如何批量重置序列
  • 如何保证数据库和缓存的一致性?
  • 强化学习中的重要性采样:跨分布复用样本的核心技术
  • 大模型0基础开发入门与实践:第8章 “大力出奇迹”的哲学:大语言模型的核心技术揭秘
  • 【世纪龙科技】汽车专业虚拟仿真实训基地建设方案
  • 嵌入式软件典型架构:层次化模式 vs 递归模式
  • Java Main无法初始化主类的原因与解决方法(VsCode工具)
  • 【Java后端】Spring Boot 实现请求设备来源统计与UA解析全攻略
  • 智慧工厂的 “隐形大脑”:边缘计算网关凭什么重构设备连接新逻辑?
  • 编程刷题-资料分发1 图论/DFS
  • Kotlin-基础语法练习二
  • Android面试指南(四)
  • [新启航]机械深孔加工质控:新启航方案用激光频率梳破解 130mm 深度遮挡瓶颈
  • 闲聊汽车芯片的信息安全需求和功能
  • C# NX二次开发:反向控件和组控件详解
  • 智慧巡检新标杆:智能移动机器人——电力行业的守护者