集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 6211|回复: 4

MicroBlaze的GPIO怎么操作?基地址和高地址怎么意思?

[复制链接]
vvt 发表于 2010-7-29 03:03:56 | 显示全部楼层 |阅读模式
本帖最后由 fpgaw 于 2011-1-15 05:53 编辑

MicroBlaze的GPIO怎么操作?基地址和高地址怎么意思?
TCL 发表于 2010-7-29 03:11:30 | 显示全部楼层
=当我向Gpio输出一个数据时:

    Mask ^= 0x00038003;XGpio_DiscreteWrite( &P1, 1, Mask);

    可以通过波形串口看到P1的输出位顺序为        

    P1:0xC001C000

    所以,当以后我们要通过MicroBlaze的GPIO控制外围器件时千万小心其顺序排列。

    在验证的过程中,没有给P1分配地址,结果其在xparameters.h文件里的基地址被写成0xffffffff,虽然在编译时没有错误但是在运行时就怎么也无法操作P1了,所以对于IP核的加入千万注意有没有分配地址,确认之后再生成BSP包。
TCL 发表于 2010-7-29 03:15:22 | 显示全部楼层
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吧。
liujieaa 发表于 2010-7-30 09:18:04 | 显示全部楼层
回复 2# TCL


    向您请教个问题,我在用microblaze设计一个ps2口的外设时,设计的ip最后没有输入口,但是我在向导模板中定义了输入口。怎么回事?或者您给我个具体过程。谢谢了。我是个新手。
Sunlife 发表于 2015-7-20 11:50:06 | 显示全部楼层
加入XPS_INTC Instance,使其Irq和MicroBlaze Processor的Interrupt输入相连,然后Intr断接来自GPIO等外设的中断信号,如有多个中断接入,可用“Intr = RS232_Uart_Intq&DIP_Switches_8Bit_Irq&Push_Buttons_Intq”的方式将它们共同连到Intr端口,注意这些中断的优先级从前到后依次升高,这个设置在XPS GUI窗口中可以设置。
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-5-6 06:36 , Processed in 0.063036 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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