zynq7000按键中断驱动

本文档详细介绍了如何基于Zynq7000开发按键中断驱动,从创建硬件工程,设置管脚约束,到构建Petalinux Linux系统,编写设备树,再到编写和调试中断驱动,最后讨论了调试过程中遇到的问题和解决方案。
摘要由CSDN通过智能技术生成

基于zynq7000的按键中断驱动

创建zynq7000硬件工程

1、新建工程

打开Vivado开发环境
在这里插入图片描述
点击create project
如下表操作
在这里插入图片描述
开始创建工程

在这里插入图片描述
创建完成后,点击在这里插入图片描述检查一下工程是否错误,然后Generate Output Products, 完成后Create HDL Wrapper生成顶层文件。完成之后开始写管脚约束
set_property IOSTANDARD LVCMOS33 [get_ports {pl_key_4_tri_i[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pl_key_4_tri_i[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pl_key_4_tri_i[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pl_key_4_tri_i[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pl_led_4_tri_o[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pl_led_4_tri_o[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pl_led_4_tri_o[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pl_led_4_tri_o[0]}]
set_property PACKAGE_PIN M15 [get_ports {pl_led_4_tri_o[0]}]
set_property PACKAGE_PIN G14 [get_ports {pl_led_4_tri_o[1]}]
set_property PACKAGE_PIN M17 [get_ports {pl_led_4_tri_o[2]}]
set_property PACKAGE_PIN G15 [get_ports {pl_led_4_tri_o[3]}]
set_property PACKAGE_PIN M19 [get_ports {pl_key_4_tri_i[0]}]
set_property PACKAGE_PIN M20 [get_ports {pl_key_4_tri_i[1]}]
set_property PACKAGE_PIN L16 [get_ports {pl_key_4_tri_i[2]}]
set_property PACKAGE_PIN F16 [get_ports {pl_key_4_tri_i[3]}]

然后生成bit文件
在这里插入图片描述
完成后,选择File
在这里插入图片描述
Export
在这里插入图片描述
打开SDK软件
launch SDK
进入SDK软件开始裸机测试,看看搭建的硬件环境是否正确
创建工程阶段省略

裸机测试代码为

#include <stdio.h>
#include "platform.h"
#include "xparameters.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "xgpio.h"
#include "xscutimer.h"
#include "xil_types.h"
#include "ax_pwm.h"
#include <unistd.h> // usleep()


// Parameter definitions
#define INTC_DEVICE_ID          XPAR_PS7_SCUGIC_0_DEVICE_ID
#define KEY_DEVICE_ID           XPAR_AXI_GPIO_1_DEVICE_ID
#define LED_DEVICE_ID           XPAR_AXI_GPIO_0_DEVICE_ID

#define INTC_GPIO_INTERRUPT_ID  XPAR_FABRIC_AXI_GPIO_1_IP2INTC_IRPT_INTR
#define KEY_INT_MASK            XGPIO_IR_CH1_MASK

#define PL_LED_REG_BASSADDR			0x41200000
#define PL_KEY_REG_BASSADDR			0x41210000
#define PL_KEY_REG_INTERRUPT		0x41210128
#define PL_KEY_REG_GIER				0x4121011C
#define PL_KEY_INT_CLEAR			0x41210120

// global variable
XGpio LEDInst;
XGpio KEYInst;
XScuGic INTCInst;
static u8 keyVal;

// forward declaration
static void KeyIntrHandler(void * InstancePtr);
static int IntcInitFunction(u16 DeviceId);
static int InterruptSystemSetup(XScuGic * XScuGicInstancePtr);

int Gunner_In32(int Addr)
{
	return *(volatile int *) Addr;
}

void Gunner_Out32(int OutAddress, int Value)
{
	*(volatile int *) OutAddress = Value;
}


int main(void)
{
    init_platform();

    int status;

    status = XGpio_Initialize(&KEYInst, KEY_DEVICE_ID);
    if(status != XST_SUCCESS)
        return XST_FAILURE;

    // initial LED
    status = XGpio_Initialize(&LEDInst, LED_DEVICE_ID);
    if(status != XST_SUCCESS)
        return XST_FAILURE;

    // initial interrupt controller
    status = IntcInitFunction(INTC_DEVICE_ID);
    if(status != XST_SUCCESS)
        return XST_FAILURE;

    Gunner_Out32(XPAR_AX_PWM_0_S00_AXI_BASEADDR, 17179);//200hz

    printf(">>> Press PL KEY1 ~ KEY4 one by one, and check the PL LED1 ~ LED4\n");

  
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值