[X]关闭

Mis603开发板MB SOC开发教程:第六章 GPIO输入中断

文档创建者:Milinker_XU
浏览次数:8315
最后更新:2016-01-14
本帖最后由 Milinker_XU 于 2016-1-14 22:03 编辑

    本章我们再来做一个中断,不过这个中断是外部输入的。我们在硬件系统中添加了个Buttom的输入接口。GPIO输入中断即可通过这个Buttom来执行。
修改ButtomIP配置,勾选支持中断选型。
◎在Ports端口中,为中断控制器添加中断信号源。定时器为0号中断,按键为1号中断。
◎修改完成后,运行Hardware下Generate Netlist,产生网表。回到ISE环境中,完成工程编译。
◎启动SDK,新建个GPIO_INTR工程,以helloworld为模板,将helloworld.c改成gpio_intr.c
◎同上一个定时器中断一样,我们也定义以下几个文件:gpio_intr.h头文件,gpio_intr_handler.c中断处理文件、gpio_intr_initial.c中断初始化文件。

◎在gpio_intr.h中完成头文件添加,函数初始化和变量声明。
  
/*
  
* gpio_intr.h
  
*
  
*   Created on: 2016-1-13
  
*       Author: Administrator
  
*/
  
/*
  
*   gpio_intr.h
  
*
  
*   Created on: 2016-1-13
  
*       Author: Milinker Xu
  
*/
  
#ifndef GPIO_INTR_H_
  
#define GPIO_INTR_H_
  
  
#include  "stdio.h"
  
#include  "xparameters.h"
  
#include  "xgpio.h"
  
#include  "xintc.h"
  
#include  "mb_interface.h"
  
#include  "platform.h"
  
#include  "xil_exception.h"
  
  
XIntc Intc;
  
XGpio Gpio;
  
  
static volatile u32  gpio_intr_times;
  
  
void  gpio_intr_initial(void);
  
void  gpio_intr_handler(void *CallbackRef);
  
void intr_Init(XIntc  *IntcInstancePtr, u16 DeviceId);
  
void  GPIO_Init(XIntc* IntcInstancePtr,XGpio* GpioInstancePtr,u16 DeviceId,u16  IntrId);
  
  
#endif /*  GPIO_INTR_H_ */
◎gpio_intr_intial.c文件中主要包括两个部分:1. MB外部中断初始化,使能中断,中断处理函数调用和外部中断启动等;2.GPIO中断源初始化、GPIO中断与中断控制器之间的映射、GPIO中断使能和GPIO全局中断使能。代码如下所示:
  
/*
  
* gpio_intr_initial.c
  
*
  
*   Created on: 2016-1-13
  
*       Author: Administrator
  
*/
  
/*
  
* gpio_intr_initial.c
  
*
  
*   Created on: 2016-1-13
  
*       Author: Milinker Xu
  
*/
  
#include  "gpio_intr.h"
  
  
void intr_Init(XIntc  *IntcInstancePtr, u16 DeviceId)
  
{
  
    XIntc_Initialize(IntcInstancePtr,  DeviceId);//初始化中断
  
     XIntc_Enable(&Intc,XPAR_INTC_0_GPIO_0_VEC_ID);;//使能中断
  
    Xil_ExceptionInit();                            //外设初始化
  
     Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,  (Xil_ExceptionHandler)XIntc_InterruptHandler,IntcInstancePtr);
  
    Xil_ExceptionEnable();
  
    XIntc_Start(IntcInstancePtr,  XIN_REAL_MODE);//启动中断
  
}
  
  
void  GPIO_Init(XIntc* IntcInstancePtr,XGpio* GpioInstancePtr,u16 DeviceId,u16  IntrId)
  
{
  
    /* 初始化GIPO*/
  
        XGpio_Initialize(GpioInstancePtr, DeviceId);
  
        XIntc_Connect(IntcInstancePtr,  IntrId,(XInterruptHandler)gpio_intr_handler, GpioInstancePtr);
  
        XGpio_InterruptEnable(GpioInstancePtr, 1);
  
        XGpio_InterruptGlobalEnable(GpioInstancePtr);
  
}
  
  
void  gpio_intr_initial(void)
  
{
  
    intr_Init(&Intc,XPAR_INTC_0_DEVICE_ID);
  
    GPIO_Init(&Intc,&Gpio,XPAR_BUTTOM_DEVICE_ID,XPAR_INTC_0_GPIO_0_VEC_ID);
  
}
  
◎gpio_intr_handler.c中包括中断处理子函数,这里采用端口打印的方式,产生一次中断,打印出产生的中断次数,并通过LED灯展示出来。
  
/*
  
* gpio_intr_handler.c
  
*
  
*   Created on: 2016-1-13
  
*       Author: Administrator
  
*/
  
/*
  
* intc.h
  
*
  
*   Created on: 2016-1-13
  
*       Author: Milinker Xu
  
*/
  
#include  "gpio_intr.h"
  
static volatile u32  gpio_intr_times=0; /* Interrupt Handler Flag */
  
void  gpio_intr_handler(void *CallbackRef)
  
{
  
   XGpio *GpioPtr = (XGpio *)CallbackRef;
  
   gpio_intr_times++;
  
   xil_printf("GPIO Interrupt Work %x  \r\n",gpio_intr_times);
  
   XGpio_Out32(XPAR_LED_BASEADDR,~gpio_intr_times);
  
   XGpio_InterruptClear(GpioPtr, 1);//清除中断标志
  
}

◎这样,主函数所在文件gpio_intr.c只要负责调用各个子模块即可。程序结尾做一个死循环,让程序一直运行,否则中断只执行一次就return了。
  
/*
  
* gpio_intr.c
  
*
  
*   Created on: 2016-1-13
  
*       Author: Milinker Xu
  
*/
  
#include "gpio_intr.h"
  
int main()
  
{
  
init_platform();
  
gpio_intr_initial();
  
    while(1)
  
    {
  
     ;
  
    }
  
    return 0;
  
}
  
◎分析下gpio_intr.h中所包含的头文件,可以看到,除以前介绍过的,还包含一个xil_exception.h的投文件,该文件是在MB启动外部中断的情况下所包含的头文件。
◎程序执行过程中,在console中打印出的信息如下。LED灯随着按键输入按二进制编码。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

发表评论已发布 4

shiwuge

发表于 2016-1-13 23:02:22 来自手机 | 显示全部楼层

写的不错,欢迎写这样的入门教程

shiwuge

发表于 2016-1-13 23:02:38 来自手机 | 显示全部楼层

写的不错,欢迎写这样的入门教程

uisrc

发表于 2016-1-14 00:56:33 | 显示全部楼层

许神的销量真高每天一更新
越努力越幸运!加油!

贾文洋

发表于 2016-1-14 09:00:40 | 显示全部楼层

回复

使用道具 举报

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

本版积分规则