OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 84|回复: 2
打印 上一主题 下一主题

[XILINX] AXU2CGA-XCZU2CG-1SFVC784E

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2026-4-13
在线时间
1 小时
跳转到指定楼层
楼主
发表于 3 天前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
(我的开发板只有PL端有按键和LED,硬件绑定的引脚如下图)PS通过EMIO模块配置PL端的按键,并使用中断方式控制PL端的LED,不知道这个方法可行嘛,例程是参照正点原子的https://www.bilibili.com/video/B ... 307d5917c8&p=32,现在的问题是运行没错误,但是按键按下LED没反应,有无大佬帮忙看看,弄了一天没弄出来


参照视频例程写的代码如下:

#include "xparameters.h"
#include "xgpiops.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "xplatform_info.h"
#include <xil_printf.h>
#include "sleep.h"

/************************** Constant Definitions *****************************/
//以下常量映射到 xparameters.h 文件
#define GPIO_DEVICE_ID      XPAR_XGPIOPS_0_DEVICE_ID //PS 端 GPIO 器件 ID
#define INTC_DEVICE_ID      XPAR_SCUGIC_SINGLE_DEVICE_ID //通用中断控制器 ID
#define GPIO_INTERRUPT_ID   XPAR_XGPIOPS_0_INTR //PS 端 GPIO 中断 ID

//定义使用到的 MIO 引脚号
#define KEY 79 //PL_KEY1 连接到 EMIO79
#define LED 78 //PL_LED1 连接到 EMIO78

/************************** Function Prototypes ******************************/
void intr_handler(void *callback_ref,u32 Bank, u32 Status);
int setup_interrupt_system(XScuGic *GicInstancePtr, XGpioPs *Gpio,u16 GpioIntrId);

/**************************Global Variable Definitions ***********************/
XGpioPs gpio; //PS 端 GPIO 驱动实例
XScuGic intc; //通用中断控制器驱动实例
u32 key_press = 0; //KEY 按键按下的标志
u32 key_val; //用于控制 LED 的键值

/************************** Function Definitions *****************************/
int main(void)
{
int status;
XGpioPs_Config *ConfigPtr; //PS 端 GPIO 配置信息

xil_printf("Gpio interrupt test \r\n");

//根据器件 ID 查找配置信息
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
if (ConfigPtr == NULL) {
return XST_FAILURE;
}
//初始化 Gpio driver
XGpioPs_CfgInitialize(&gpio, ConfigPtr, ConfigPtr->BaseAddr);

//设置 KEY 所连接的 EMIO 引脚的方向为输入
XGpioPs_SetDirectionPin(&gpio, KEY, 0);

//设置 LED 所连接的 EMIO 引脚的方向为输出并使能输出
XGpioPs_SetDirectionPin(&gpio, LED, 1);
XGpioPs_SetOutputEnablePin(&gpio, LED, 1);
//XGpioPs_WritePin(&gpio, LED, 0x0);

//建立中断,出现错误则打印信息并退出
status = setup_interrupt_system(&intc, &gpio, GPIO_INTERRUPT_ID);
    if (status != XST_SUCCESS) {
    xil_printf("Setup interrupt system failed\r\n");
    return XST_FAILURE;
}

//中断触发时,key_press 为 TURE,延时一段时间后判断按键是否按下,是则反转 LED
while (1) {
    if (key_press) {
       sleep(1);
    if (XGpioPs_ReadPin(&gpio, KEY) == 0) {
       key_val = ~key_val;
       XGpioPs_WritePin(&gpio, LED, key_val);
    }

      key_press = FALSE;
     XGpioPs_IntrEnablePin(&gpio, KEY); //使能按键 KEY 中断
//     XGpioPs_IntrClearPin(&gpio, KEY); //清除按键 KEY 中断

   }
   }
     return XST_SUCCESS;
}

//中断处理函数
// @param CallBackRef 是指向上层回调引用的指针
void intr_handler(void *callback_ref,u32 Bank, u32 Status)
{
    XGpioPs *gpio = (XGpioPs *) callback_ref;
    xil_printf("interrupt detect\r\n");
    //读取 KEY 按键引脚的中断状态,判断是否发生中断
    if (XGpioPs_IntrGetStatusPin(gpio, KEY)){

      key_press = 1;
      XGpioPs_IntrDisablePin(gpio, KEY); //屏蔽按键 KEY 中断
    }
}
//建立中断系统,使能 KEY 按键的下降沿中断
// @param GicInstancePtr 是一个指向 XScuGic 驱动实例的指针
// @param gpio 是一个指向连接到中断的 GPIO 组件实例的指针
// @param GpioIntrId 是 Gpio 中断 ID
// @return 如果成功返回 XST_SUCCESS, 否则返回 XST_FAILURE
int setup_interrupt_system(XScuGic *GicInstancePtr, XGpioPs *Gpio,
                        u16 GpioIntrId)
{
     int status;
     XScuGic_Config *IntcConfig; //中断控制器配置信息

    //查找中断控制器配置信息并初始化中断控制器驱动
    IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
    if (NULL == IntcConfig) {
      return XST_FAILURE;
}

status = XScuGic_CfgInitialize(GicInstancePtr, IntcConfig,
                            IntcConfig->CpuBaseAddress);
       if (status != XST_SUCCESS) {
       return XST_FAILURE;
    }


//设置并使能中断异常
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
                  (Xil_ExceptionHandler) XScuGic_InterruptHandler,
                                  GicInstancePtr);
Xil_ExceptionEnable();

//为中断设置中断处理函数
status = XScuGic_Connect(GicInstancePtr, GpioIntrId,
                                (Xil_ExceptionHandler)XGpioPs_IntrHandler,
                                (void *)Gpio);
        if (status != XST_SUCCESS) {
                return status;
        }
        XGpioPs_SetCallbackHandler(Gpio, (void *)Gpio, intr_handler);//用户自定义中断函数

// status = XScuGic_Connect(gic_ins_ptr, GpioIntrId,
//             (Xil_ExceptionHandler) intr_handler, (void *) gpio);
// if (status != XST_SUCCESS) {
// return status;
// }

//使能来自于 Gpio 器件的中断
XScuGic_Enable(GicInstancePtr, GpioIntrId);

//设置 KEY 按键的中断类型为下降沿中断
XGpioPs_SetIntrTypePin(&gpio, KEY, XGPIOPS_IRQ_TYPE_EDGE_FALLING);

//使能按键 KEY 中断
XGpioPs_IntrEnablePin(&gpio, KEY);
//XGpioPs_IntrEnable(gpio, GPIO_BANK, 1 << KEY_BANK_BIT);

return XST_SUCCESS;
}


回复

使用道具 举报

4

主题

2176

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
6254
金钱
6254
注册时间
2018-10-21
在线时间
1846 小时
2#
发表于 昨天 09:12 | 只看该作者
建议使用和教程配套的开发板,例程直接下载,不会出问题
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2026-4-13
在线时间
1 小时
3#
 楼主| 发表于 昨天 19:00 | 只看该作者
QinQZ 发表于 2026-4-15 09:12
建议使用和教程配套的开发板,例程直接下载,不会出问题

已经解决,是我自己的代码问题
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-4-16 03:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表