ZYNQ AXI_GPIO_INT

REVIEW

软核AXI_GPIO之前已经简单学习过:

AXI_GPIO_axi-gpio-CSDN博客

PS侧中断也简单调试过:

ZYNQ PS_GPIO中断-CSDN博客

1. 今日摸鱼任务

简单实现AXI_GPIO中断:

ps_key控制pl_led闪烁(MIO中断)

pl_key控制ps_led闪烁(AXI_GPIO中断)

2. Block Design

aaa!!!!就是这条线,之前没注意到!!!

然后再SDK中:XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR

这个变量报错!!!

链接这跟线以后,"xparameters.h"就会自动添加:

3.  SDK

SCU PS_GPIO 传送
ZYNQ PS_GPIO中断-CSDN博客
AXI_GPIO.h

#ifndef _AXI_GPIO_H_
#define _AXI_GPIO_H_


#include "xgpio.h"
#include "SCU_GIC.h"

extern XGpio AXI_GPIO0;

void AXI_GPIO_Init(XGpio *InstPtr, uint16_t DeviceId);
void AXI_GPIO_Intc_Init(XGpio *InstPtr,uint16_t IntrId, uint32_t Channel,
        Xil_InterruptHandler Handler);
void AXI_GPIO_Set_Channel(XGpio *InstPtr, uint8_t Channel, uint32_t Dri, uint32_t Data);
void AXI_GPIO_SetPin(XGpio *InstPtr, uint8_t Channel, uint8_t GPIO_Num, uint32_t Data);
uint8_t AXI_GPIO_GetPin(XGpio *InstPtr, uint8_t Channel, uint8_t GPIO_Num);
void AXI_GPIO_SetPin_Dir(XGpio *InstPtr, uint8_t Channel, uint8_t GPIO_Num, uint8_t Dir);

#endif /* AXI_GPIO_AXI_GPIO_H_ */
 

AXI_GPIO.c

/**
  *****************************************************************************
  *                         AXI_GPIO相关库(基于ACZ702开发板)
  *****************************************************************************
  *
  * @File   : AXI_GPIO.c
  * @By     : Sun
  * @Version: V1.3
  * @Date   : 2021 / 12 / 23
  * @Shop    : https://xiaomeige.taobao.com/
  *
  *****************************************************************************
**/

#include "AXI_GPIO.h"

//AXI GPIO对象
XGpio AXI_GPIO0;

/*****************************************************************************
**  @brief    初始化AXI_GPIO
**  @param    InstPtr        GPIO实例指针
**  @param    DeviceId    GPIO设备ID
**    Sample:    AXI_GPIO_Init(&AXI_GPIO0,GPIO_0_ID);    //初始化AXI GPIO0
*****************************************************************************/
void AXI_GPIO_Init(XGpio *InstPtr, uint16_t DeviceId)
{
    XGpio_Initialize(InstPtr, DeviceId);
}

/**
  *****************************************************
  * @brief    初始化AXI_GPIO中断
  * @param    InstPtr        AXI_GPIO对象指针
  * @param    IntrId        中断ID
  * @param    Mask        通道掩码
  *                     XGPIO_IR_CH1_MASK -> 通道1
  *                     XGPIO_IR_CH2_MASK -> 通道2
  *                     XGPIO_IR_MASK -> 通道1和通道2
  * @param    Handler        中断服务函数
  * @usage    //AXI_GPIO中断初始化,只开启通道1的中断,中断服务函数为AXI_GPIO_IRQ_Handler
  *         AXI_GPIO_Intc_Init(&AXI_GPIO0,XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR,
  *                 XGPIO_IR_CH1_MASK,AXI_GPIO_IRQ_Handler);
  *****************************************************
**/
void AXI_GPIO_Intc_Init(XGpio *InstPtr,uint16_t IntrId, uint32_t Mask,
        Xil_InterruptHandler Handler)
{
    Set_ScuGic_Link(IntrId, 0xA0, HIGH_Level_Sensitive,
            Handler, (void *)InstPtr);

    //启用GPIO通道中断,并启用GPIO设备的中断
    XGpio_InterruptEnable(InstPtr, Mask);
    XGpio_InterruptGlobalEnable(InstPtr);
}

/*****************************************************************************
**  @brief    修改AXI GPIO某通道的某PIN的输入输出模式
**  @param    InstPtr        GPIO实例指针
**  @param    Channel        GPIO通道,1或2
**  @param    GPIO_Num    GPIO脚编号,0~31
**  @param    Dir            输入/输出:OUTPUT(0)为输出,INPUT(1)为输入
**  Sample:    //设置Gpio0的通道1的第0号端口为输出模式
**          AXI_GPIO_SetPin_Dir(&AXI_GPIO0, XGPIO_IR_CH1_MASK, 0, OUTPUT);
*****************************************************************************/
void AXI_GPIO_SetPin_Dir(XGpio *InstPtr, uint8_t Channel, uint8_t GPIO_Num, uint8_t Dir)
{
    uint32_t Mode;
    Mode = XGpio_GetDataDirection(InstPtr, Channel);
    if(Dir == 1)
        Mode = Mode | (1 << GPIO_Num);//把对应Pin位设为1
    else if(Dir == 0)
        Mode = Mode & (~(1 << GPIO_Num));//把对应Pin位设为0
    XGpio_SetDataDirection(InstPtr, Channel, Mode);
}

/*****************************************************************************
**  @brief    控制特定GPIO口输出高/低电平,使用前必须先设置该GPIO口为"输出"模式
**  @param    InstPtr        GPIO实例指针
**  @param    Channel        GPIO通道,1或2
**  @param    GPIO_Num    GPIO脚的编号,0~31
**  @param    Data        输出电平高低:0为低,1为高
**  Sample:    //控制GPIO0的通道1的1号脚输出高电平
**          AXI_GPIO_SetPort(&AXI_GPIO0, XGPIO_IR_CH1_MASK, 1, 1);
*****************************************************************************/
void AXI_GPIO_SetPin(XGpio *InstPtr, uint8_t Channel, uint8_t GPIO_Num, uint32_t Data)
{
    if(Data)
        XGpio_DiscreteSet(InstPtr,Channel,1 << GPIO_Num);
    else
        XGpio_DiscreteClear(InstPtr,Channel,1 << GPIO_Num);
}
/*****************************************************************************
**  @brief    读取特定GPIO口的输入电平,使用前必须设置该GPIO口为"输入"模式
**  @param    InstPtr        GPIO实例指针
**  @param    Channel        GPIO通道,1或2
**  @param    GPIO_Num    GPIO脚编号,从0开始
**  @return 返回采集的GPIO电平值,0为低,1为高
**  Sample:    //采集GPIO0的通道1的1号脚的电平,存放在state里
**          state = AXI_GPIO_GetPort(&Gpio0, XGPIO_IR_CH1_MASK, 1);
*****************************************************************************/
uint8_t AXI_GPIO_GetPin(XGpio *InstPtr, uint8_t Channel, uint8_t GPIO_Num)
{
    uint32_t State;
    State = XGpio_DiscreteRead(InstPtr,Channel);
    State = (State >> GPIO_Num) & 0x1;
    return State;
}

/*****************************************************************************
**  @brief    设定AXI GPIO某通道的模式与状态
**  @param    InstPtr        GPIO实例指针
**  @param    Channel        GPIO通道,1或2
**  @param    Dir            输入/输出:0为输出,1为输入,每一位表示一个引脚
**  @param    Data        输出电平高低:0为低,1为高,每一位表示一个引脚
**  Sample:    //设置Gpio0的通道1全为输出模式,且全输出为低电平
**          AXI_GPIO_Set_Channel(&AXI_GPIO0, XGPIO_IR_CH1_MASK, 0, 0);
*****************************************************************************/
void AXI_GPIO_Set_Channel(XGpio *InstPtr, uint8_t Channel, uint32_t Dri, uint32_t Data)
{
    XGpio_SetDataDirection(InstPtr, Channel, Dri);
    XGpio_DiscreteWrite(InstPtr, Channel, Data);
}

main.c

/*
 * main.c
 *
 *  Created on: 2024年10月24日
 *      Author: Administrator
 */


//系统头文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stdarg.h>
#include <stdint.h>

//Xilinx头文件
#include "sleep.h"
#include "xgpiops.h"
#include "xparameters.h"

#include "PS_GPIO.h"
#include "AXI_GPIO.h"
#include "SCU_GIC.h"

#define INPUT  1
#define OUTPUT 0
#define GPIO_0_ID XPAR_AXI_GPIO_0_DEVICE_ID
#define PS_KEY 47
#define PS_LED 7

void PS_MIO_IRQ_Handler(void *CallBackRef, u32 Bank, u32 Status);
void AXI_GPIO_IRQ_Handler(void *CallBackRef, u32 Bank, u32 Status);

int main(void)
{

        //GIC 通用中断控制器初始化
            ScuGic_Init();
        //初始化 PS 端 GPIO
            PS_GPIO_Init();
        //设置 PS_KEY(MIO47)方向为输入
            PS_GPIO_SetMode(PS_KEY, INPUT, 0);
        //设置 PS_KEY(MIO47)触发方式
            PS_GPIO_SetInt(PS_KEY , XGPIOPS_IRQ_TYPE_LEVEL_LOW);
        //初始化 PS GPIO 中断
            PS_GPIO_Int_Init(PS_MIO_IRQ_Handler);
        //设置 PS_LED(MIO7)方向为输出
            PS_GPIO_SetMode(PS_LED, OUTPUT, 0);

        //初始化AXI GPIO0
            AXI_GPIO_Init(&AXI_GPIO0,GPIO_0_ID);
        //设置i/o
            AXI_GPIO_Set_Channel(&AXI_GPIO0, XGPIO_IR_CH1_MASK, 0x0002, 0);
        //AXI_GPIO中断初始化
            AXI_GPIO_Intc_Init(&AXI_GPIO0,XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR,
                                XGPIO_IR_CH1_MASK,(void *)AXI_GPIO_IRQ_Handler);

            while(1)
                    {

                    }

    return 0;
}


void PS_MIO_IRQ_Handler(void *CallBackRef, u32 Bank, u32 Status)
{
    uint32_t Int_State;
    uint8_t i = 0 ;
    Int_State = XGpioPs_IntrGetStatusPin(&GpioPs, PS_KEY);
    if(Int_State)
    {
        for(i=0 ; i<3 ; i++)
        {
              AXI_GPIO_SetPin(&AXI_GPIO0, XGPIO_IR_CH1_MASK, 0, 1);
              usleep(500000);
              AXI_GPIO_SetPin(&AXI_GPIO0, XGPIO_IR_CH1_MASK, 0, 0);  // 通道设置
              usleep(500000);
        }
    }
}

void AXI_GPIO_IRQ_Handler(void *CallBackRef, u32 Bank, u32 Status)
{
    uint32_t Int_State;
    uint8_t i = 0 ;
    Int_State = AXI_GPIO_GetPin(&AXI_GPIO0, XGPIO_IR_CH1_MASK,1);
    if(!Int_State)//硬件是这样的
    {
        for(i=0 ; i<3 ; i++)
        {
            PS_GPIO_SetPort(PS_LED, 1);
              usleep(500000);
            PS_GPIO_SetPort(PS_LED, 0);
              usleep(500000);
        }
    }
}

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

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

相关文章

js(深浅拷贝,节流防抖,this指向,改变this指向的方法)

一、深浅拷贝 1.基本数据类型和引用数据类型的区别&#xff1a; 1. 基本数据类型的变量存储的是值 引用数据类型的变量存储的是地址值 2. 基本数据类型的变量存储的值在栈内存 引用数据类型的变量存储的值在堆内存 3. 基本数据类型的变量存储的是值和值之间相互不影响 引用数据…

矩阵基础知识

矩阵定义 矩阵的定义 1.矩阵是由一组数按照矩形排列而成的数表。矩阵通常用大写字母表示&#xff0c;例如 AA、BB 等。矩阵中的每个数称为矩阵的元素或元。 一个 mn的矩阵 AA 可以表示为&#xff1a; 其中 aij表示矩阵 A中第i行第j列的元素。 矩阵的维度 1.矩阵的维度由它…

【多线程和高并发】多线程和高并发提纲

文章目录 多线程(多线程问题的)三大源头两个主要问题两大解决方案 高并发问题解决方案 对多线程和高并发相关问题整理了一个简单的提纲。 通过这个提纲&#xff0c;足够引出对并发编程中大部分问题的讨论~ 多线程 (多线程问题的)三大源头 线程并发执行带来的原子性问题。这是…

去梯之言:招聘行业运作的秘密——之找到一份工作

一、前言 招聘行业是一个水很深的行当。不过&#xff0c;尽管它很复杂&#xff0c;了解该行业的工作方式还是很重要的&#xff0c;这样你就可以在这片波涛汹涌的水域中平安航行&#xff0c;获得自己心仪的软件开发职位。反过来&#xff0c;如果你对这个波谲云诡的行业一无所知&…

接口测试(四)jmeter——文件上传

一、文件上传&#xff08;注&#xff1a;示例仅供参考模仿&#xff09; 1. 添加【HTTP信息头管理器】&#xff0c;配置【HTTP信息头管理器】如下&#xff1a; 2. 添加【HTTP请求默认值】&#xff0c;配置【HTTP请求默认值】如下&#xff1a; 3. 添加【HTTP请求】&#xff0…

window7虚拟机VMware与主机共享文件

文件管理器》计算机网络右键》属性》高级共享设置——全部启用 新建文件夹》右键》属性》共享》选择可以共享的用户——我这里选的是所有用户 点击高级共享》权限》保存设置——设置文件权限 文件管理器》计算机网络》右键》属性》————查看虚拟机计算机名称 主机访问 主机…

GIS常见前端开发框架

#1024程序员节&#xff5c;征文# 伴随GIS的发展&#xff0c;陆续出现了众多开源地图框架&#xff0c;这些地图框架与众多行业应用融合&#xff0c;极大地拓展了GIS的生命力&#xff0c;这里介绍几个常见的GIS前端开发框架&#xff0c;排名不分先后。 1.Leaflet https://leafl…

android 微信分享报:签名不对,请检查签名是否与开发平台签名一致的解决

1、微信分享会检查签名与开发平台的签名是否一致&#xff1a; 基本信息 | 微信开放文档 官方文档 下载签名工具&#xff0c;并且&#xff0c;将包名输入&#xff0c;然后点击生成&#xff0c;得到这个一串字符串。 2、到开发平台中&#xff1a;微信开放平台 登录&#xff0c;…

Vue2、Element中实现Enter模拟Tab,实现切换下一个框的效果

目录 &#x1f4c3;前序 &#x1f449;开发历程 &#x1f4bb;实际代码 &#x1f4fd;实现效果图 前序 在几乎所有的浏览器中&#xff0c;都具备通过 Tab 键来切换焦点的功能。然而&#xff0c;有些用户提出了强烈要求&#xff0c;希望能够增加通过 Enter 键…

批量合并PDF 文件的 5 大解决方案

PDF 可以将一个、两个、三个甚至更多的记录封装在一起&#xff0c;以显示完整的信息和用于逻辑和交互式结构化的不同元素。由于 PDF 可以提出多层结构&#xff0c;因此当用户知道如何最大化这种格式时&#xff0c;将所有文件组织到其中非常有效。正如许多经验丰富的用户和 PDF …

selenium案例——爬取哔哩哔哩排行榜

案例需求&#xff1a; 1.使用selenium自动化爬虫爬取哔哩哔哩排行榜中舞蹈类的数据&#xff08;包括视频标题、up主、播放量和评论量&#xff09; 2.利用bs4进行数据解析和提取 3.将爬取的数据保存在本地json文件中 4.保存在excel文件中 分析&#xff1a; 1.请求url地址&…

03 springboot-国际化

Spring Boot 提供了很好的国际化支持&#xff0c;可以轻松地实现中英文国际化。 项目创建&#xff0c;及其springboot系列相关知识点详见&#xff1a;springboot系列 springboot系列&#xff0c;最近持续更新中&#xff0c;如需要请关注 如果你觉得我分享的内容或者我的努力对…

2024年软件设计师中级(软考中级)详细笔记【11】知识产权基础知识(分值2~3分)

目录 前言第11章 知识产权基础知识【2-3分】11.1 标准化基础知识11.2 知识产权基础知识11.2.2 计算机软件著作权11.2.3 计算机软件的商业秘密权11.2.4 专利权概述习题 结语 前言 在备考软件设计师中级考试的过程中&#xff0c;我遇到了些许挑战&#xff0c;也收获了宝贵的经验…

基于django的个人相册日记管理系统

你是否还在为毕业设计苦思冥想&#xff0c;不知道怎么选择一个合适又实用的技术项目&#xff1f;今天给大家介绍一款功能全面的Django项目——个人相册日记管理系统&#xff0c;堪称毕业设计的完美选择&#xff01; 首先&#xff0c;这不是简单的相册或日记本&#xff0c;而是…

苍穹外卖05

redis 1. 启动redis .\redis-server.exe redis.windows.conf 2. 连接redis到客户端(这里我们使用ARDM图形化工具) 新建连接 一旦建立好后就永久直接可用(和mysql一个道理) 连接成功界面

【华为HCIP实战课程十八】OSPF的外部路由类型,网络工程师

一、外部路由类型: 上节讲的外部路由类型,无关乎COST大小,OSPF外部路由类型1优先于外部路由类型2 二、转发地址实验拓扑 我们再SW3/R5/R6三台设备运行RIP,SW3即运行RIP又运行OSPF SW3配置rip [SW3-rip-1]ver 2 [SW3-rip-1]network 10.0.0.0 AR5去掉ospf配置和AR6配置rip…

win10中mysql数据库binlog恢复

win10中mysql数据库binlog恢复 昨天有朋友江湖救急&#xff0c;说测试库里的表不小心删除更新了数据。这里也复习下binlog数据恢复&#xff0c;当然需要一定的条件&#xff1a;首先mysql开启binlog&#xff0c;然后每天需要备份对应的数据库 1 单库单表准备 在恢复数据前&am…

使用Python和Matplotlib模拟3D海浪动画

使用Python和Matplotlib模拟3D海浪动画 在计算机图形学和动画领域&#xff0c;模拟逼真的海洋表面一直是一个具有挑战性的问题。本文将介绍如何使用Python的Matplotlib库和Gerstner波浪模型&#xff0c;创建一个动态的3D海浪动画。通过叠加多个波浪&#xff0c;我们可以生成复…

vim的使用方法

常见的命令可参考&#xff1a; Linux vi/vim | 菜鸟教程​www.runoob.com/linux/linux-vim.html​编辑https://link.zhihu.com/?targethttps%3A//www.runoob.com/linux/linux-vim.html 1. vim的工作模式 vi/vim 共分为三种模式&#xff0c;命令模式、编辑输入模式和末行&am…

高薪、高含金量、高性价比的“三高”证书——PMP证书

24年感觉什么都不好做&#xff0c;经济大环境也不太好&#xff0c;工作也卷&#xff0c;裁员降薪&#xff0c;为什么有的人没有危机&#xff0c;不降反增了呢&#xff1f;古语云往往越是危机的时候&#xff0c;越是机会多的时候&#xff0c;今天分享一个高薪、高含金量、高性 如…