原创 MicroBlaze的GPIO中断

2009-8-18 12:50 4015 4 6 分类: FPGA/CPLD

首先感谢下coosign大侠,参考了他blog上不少东东。
MicroBlaze的GPIO中断是相对比较简单的一种中断,其概念比较好理解。


1、首先要将XGpio IP中的“GPIO Supports Interrupts”选项使能,使得GPIO支持中断方式。


2、(推荐)使用XPS中断控制器IP,方便中断管理:


加入XPS_INTC Instance,使其Irq和MicroBlaze Processor的Interrupt输入相连,然后Intr断接来自GPIO等外设的中断信号,如有多个中断接入,可用“Intr = RS232_Uart_Intq&DIP_Switches_8Bit_Irq&Push_Buttons_Intq”的方式将它们共同连到Intr端口,注意这些中断的优先级从前到后依次升高,这个设置在XPS GUI窗口中可以设置。


3、写中断服务程序(ISR):


注意在进入中断服务函数后需要及时清中断,否则跳出中断后又会马上进该中断。


4、注册(连接)中断服务函数、中断使能、等待中断:


用函数XIntc_RegisterHandler(Xuint32 BaseAddress, int InterruptId, XInterruptHandler Handler, void *CallBackRef)注册中断服务程序。其中Xuint32 BaseAddress是XIntc实例的基地址,int InterruptId是中断ID号,由MHS文件生成,格式为XPAR_<产生中断的元件的实例名>_<中断信号名> _INTR,可在头文件xparameter.h中找到。XInterruptHandler Handler就是中断函数名了,由用户定义。当中断函数被调用时void *CallBackRef被用来传递参数,可视情况来定启用与否,不用的话设为0或NULL;当是外部中断时就用NULL。int XIntc_Connect (XIntc *InstancePtr, u8 Id, XInterruptHandler Handler, void *CallBackRef)也可完成类似功能。


实例:


//register the isr
 XIntc_RegisterHandler(XPAR_INTC_0_BASEADDR, \
        XPAR_XPS_INTC_0_PUSH_BUTTONS_POSITION_IP2INTC_IRPT_INTR,\
        (XInterruptHandler)push_button_int_handler, \
        (void *)0);
 XIntc_RegisterHandler(XPAR_INTC_0_BASEADDR, \
        XPAR_XPS_INTC_0_DIP_SWITCHES_8BIT_IP2INTC_IRPT_INTR,\
        (XInterruptHandler)dip_switch_int_handler, \
        (void *)0);


接下来就是中断使能了:


//must enable mb_enable bit
 microblaze_enable_interrupts(); 
 //must enable xgpio_interruptglobalenable bit;
 XGpio_InterruptGlobalEnable (&Push_Buttons_Position);
 XGpio_InterruptGlobalEnable (&DIP_Switches_8Bit);
 //must enable xgpio_instance_enable bit
 XGpio_InterruptEnable (&Push_Buttons_Position, XGPIO_IR_CH1_MASK);
 XGpio_InterruptEnable (&DIP_Switches_8Bit, XGPIO_IR_CH1_MASK);


//must enable XIntc_mMasterEnable
 XIntc_mMasterEnable(XPAR_INTC_0_BASEADDR);
 //must enable specific interrupt(s) in the interrupt controller.
 XIntc_mEnableIntr(XPAR_INTC_0_BASEADDR, \
      XPAR_PUSH_BUTTONS_POSITION_IP2INTC_IRPT_MASK\
      |XPAR_DIP_SWITCHES_8BIT_IP2INTC_IRPT_MASK);


OK,开始等待中断的到来吧。


 


在coosign的一个文档中提到:“


说明:


当初,我设定了一个全局变量:


 Char flag ;


在中断子程序里面赋值 flag = 1 ;


while循环里:


 If (flag) led_on() ;


发现led灯不亮,原因未知。建议大家不要通过标志位来操作。


但是我针对这个问题的测试并没有出现这个情况。也许是coosign软件版本的bug吧。

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户74457 2009-9-17 16:45

问楼主个问题:中断注册函数中的传递参数void *CallBackRef是不是就是连接到中断服务函数的参数void *xxxxxx? 比如中断注册函数中定义了这个传递参数为void* callbackref 中断服务函数为:timer_ctr_intc_handler(void *baseaddr_p) 那么void *baseaddr_p = void *callbackref

tengjingshu_112148725 2009-8-19 11:38

真的谢谢,刚好也正在学习MicroBlaze
相关推荐阅读
用户212692 2009-08-18 14:05
12864点阵型液晶显示屏的基本原理与使用方法
  在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有6000以上...
用户212692 2009-08-17 13:31
深入浅出大端和小端
文章一: 端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖...
用户212692 2009-08-13 13:59
c语言 头文件 库文件
头文件与库文件先说明这完全是我教导一位菜鸟的个人经验。贴在此处供菜鸟们阅读,内容粗浅。1.为什么我只要包括<iostream>就能使用cout这样的东西。我看过iostream里面,只有一...
用户212692 2009-08-12 14:45
一个用Verilog实现PWM硬件的开发实例
本文举例说明了一个使用FPGA的新设计流程,我们从中可以知道如何用软件实现PWM,然后如何将该设计转换成一个可以在FPGA中运行的逻辑块,并能利用存储器映射I/O接口通过软件完成对该逻辑块的控制。软硬...
用户212692 2009-08-12 10:11
c语言 #ifndef
 #ifndef x  #define x   ...  #endif  这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等  #ifndef x  //先测试x是否被...
我要评论
2
4
关闭 站长推荐上一条 /3 下一条