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

ZYNQ AXI-GPIO学习——ZYNQ学习笔记8

                                                                                                                             --素材来自原子哥

一、简介

        AXI GPIO IP 核为 AXI 接口提供了一个通用的输入/输出接口。 与 PS 端的 GPIO 不同, AXI GPIO 是一个软核( Soft IP),即 ZYNQ 芯片在出厂时并不存在这样的一个硬件电路, 而是由用户通过配置 PL 端的逻辑资源来实现的一个功能模块。 而 PS 端的 GPIO 是一个硬核( Hard IP) ,它是一个生产时在硅片中实现的功能电路。
AXI GPIO 可以配置成单通道或者双通道, 每个通道的位宽可以单独设置。 另外通过打开或者关闭三态缓冲器, AXI GPIO 的端口还可以被动态地配置成输入或者输出接口。其顶层模块的框图如下所示:

        可以看到, 模块的左侧实现了一个 32 位的 AXI4-Lite 从接口, 用于主机访问 AXI GPIO 内
部各通道的寄存器。 当右侧接口输入的信号发生变化时,模块还能向主机产生中断信号(ip2intc_irpt) 。不过只有在配置 IP 核时选择“ 使能中断” , 才会启用模块的中断控制功能。

二、实验目标

        通过调用 AXI GPIO IP 核,使用中断机制,实现底板上 PL 端按键 PL_KEY0 控制 PS端 LED0 亮灭的功能。

三、系统框图

        PS 端的 M_AXI_GP0 作为主端口, 与 PL 端的 AXI GPIO IP 核以 AXI4-Lite 总线相连接。其中, AXI 互联 IP( AXI Interconnect) 用于连接 AXI 存储器映射( memory-mapped) 的主器件和从器件。通用中断控制器( GIC) 用于管理来自 PS 或者 PL 的中断, 并把这些中断发送到 CPU。 

四、硬件设计

五、程序设计

main.c

#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
#include "xil_printf.h" 	//包含 print()函数
#include "xgpio.h"
#include "xil_exception.h"#include "sleep.h"
#include "gpio.h"
#include "intr.h"u8 flag_led = 0;int main(){gpio_config();intr_config();printf("AXI_KEY_EMIO_LED\r\n");while(1){LED(flag_led);usleep(20000);AXI_GPIO_INTR(1);}
}

gpio.c

#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
#include "xil_printf.h" 	//包含 print()函数
#include "xgpio.h"
#include "xil_exception.h"#include "sleep.h"
#include "gpio.h"
#include "intr.h"u8 flag_led = 0;int main(){gpio_config();intr_config();printf("AXI_KEY_EMIO_LED\r\n");while(1){LED(flag_led);usleep(20000);AXI_GPIO_INTR(1);}
}

gpio.h

#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"extern XGpioPs PS_Gpio;		//PS GPIO结构体实例#define GPIO_DEVICE_ID		XPAR_XGPIOPS_0_DEVICE_ID	//GPIO器件ID
#define EMIO_LED			54#define LED_ON		XGpioPs_WritePin(&PS_Gpio, EMIO_LED, 0x1)							//控制IO输出1
#define LED_OFF		XGpioPs_WritePin(&PS_Gpio, EMIO_LED, 0x0)							//控制IO输出0
#define LED(a)		if(a)\XGpioPs_WritePin(&PS_Gpio, EMIO_LED, 0x1);\else XGpioPs_WritePin(&PS_Gpio, EMIO_LED, 0x0)void gpio_config();

intr.c

#include <stdio.h>
#include "xparameters.h"
#include "xgpio.h"
#include "xil_exception.h"
#include "xscugic.h"
#include "intr.h"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 flag_led;void intr_config(void){XGpio_Initialize(&AXI_Gpio, AXI_GPIO_ID);								//初始化AXI GPIOXGpio_SetDataDirection(&AXI_Gpio,GPIO_CHANNEL1,0x00000001);				//设置对应通道为输入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);//设置优先级 触发类型0x1高有效电平敏感XScuGic_SetPriorityTriggerType(GicInstancePtr, AXI_GpioIntrId,0xA0, 0x1);//打开AXI GPIO IP中断使能XGpio_InterruptGlobalEnable(AXI_Gpio);XGpio_InterruptEnable(AXI_Gpio,0x00000001);
}void IntrHandler(void){printf("from intr\r\n");//关闭AXI GPIO1中断使能AXI_GPIO_INTR(0);//判断AXI KEYif(XGpio_DiscreteRead(&AXI_Gpio,0x00000001) == 0){flag_led = !flag_led;}XGpio_InterruptClear(&AXI_Gpio,GPIO_CHANNEL1);
}

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,0x00000001);\else XGpio_InterruptDisable(&AXI_Gpio,0x00000001);

http://www.dtcms.com/a/328514.html

相关文章:

  • 学习游制作记录(背包UI以及各种物品的存储)8.12
  • kafka 消费者组的概念是什么?它是如何实现消息的点对点和发布/订阅模式?
  • Supabase快速入门与实战指南
  • LangChain 入门学习
  • Spring AI Alibaba - 聊天机器人快速上手
  • SpringAI 使用通义千问进行聊天对话开发
  • 考研复习-计算机组成原理-第五章-CPU
  • [NoC]Outstanding和Credit的概念详解
  • Fluent Bit 日志合并正则表达式(上)
  • Nginx 高级配置
  • Python训练Day41
  • 基于PAI-ChatLearn的GSPO强化学习实践
  • LLM - 搭建 Grounded SAM 2 模型的视觉检测与分割服务 API
  • CMake笔记:PUBLIC/PRIVATE/INTERFACE的使用
  • FreeRTOS---基础知识6---事件组
  • Effective C++ 条款37:绝不重新定义继承而来的缺省参数值
  • Linux系统编程Day13 -- 程序地址空间
  • Vue3 整合高德地图完成搜索、定位、选址功能,已封装为组件开箱即用(最新)
  • 前端对接豆包AI(vue3+TS版本)
  • 力扣-739.每日温度
  • Leetcode-138. 复制带随机指针的链表
  • AI智能体的“四大支柱”:CAP框架核心层、执行层、约束层、操作层详解​
  • 手机蓝牙无感开锁在智能柜锁与智能箱包中的整体解决方案
  • Iptables 详细使用指南
  • 10-docker基于dockerfile自动制作镜像
  • 计算机网络摘星题库800题笔记 第5章 传输层
  • Ansible 详细笔记
  • _init__.py的作用
  • 电路板的GND与外壳地EARTH通过电容电阻相连
  • 操作系统1.6:虚拟机