User Tools

Site Tools


Sidebar

Go Back

Refresh

You are not allowed to add pages

Direct Link

library:fpga:microblazeinterrupt

Microblaze 中断系统


1. 概述

  • Unordered List ItemMicroBlaze 只支持一个外部中断源(连接于Interrupt 端口),所以需要多个中断输入的话,就得添加中断控制器(xps_intc)了。
  • Unordered List Item只有当机器状态寄存器(Machine Status Register,MSR)中的中断使能位(interrupt enable)置'1',MicroBlaze才能响应中断。
  • Unordered List ItemMicroBlaze响应中断,PC指向中断向量(地址:0x10),R14存储了中断返回地址。

2. 中断信号的物理连接

system.mhs文件定义了物理硬件的相关信息,包括总线架构、外围设备、处理器、系统内部信号互连和地址空间等。
所以这里就通过MHS定义文件给出关于中断信号互连的信息。

MicroBlaze的中断输入,可以配置成电平触发或者边沿触发,在配置MicroBlaze的GUI或者在MicroBlaze.mpd中通过
设置 C_INTERRUPT_IS_EDGE ,C_EDGE_IS_POSITIVE来完成对中断的触发的配置。

MHS文件中,PORT Interrupt = Interrupt 和 PORT Irq = Interrupt 将Interrupt控制器连接到Microblaze的中断输入口。

mhs

mhs

BEGIN microblaze
  . . . 
  PORT MB_RESET = mb_reset
  PORT Interrupt = Interrupt
END


BEGIN xps_uartlite
  . . .  
  PORT Interrupt = RS232_Uart_1_Interrupt
END

BEGIN xps_intc
  . . .
  PORT Irq = Interrupt
  PORT Intr = RS232_Uart_1_Interrupt&plb_ps2_controller_0_IP2INTC_Irpt
END

BEGIN plb_ps2_controller
  . . .
  PORT IP2INTC_Irpt = plb_ps2_controller_0_IP2INTC_Irpt
  PORT mouse_clk = plb_ps2_controller_0_mouse_clk
  PORT mouse_data = plb_ps2_controller_0_mouse_data
  PORT key_clk = plb_ps2_controller_0_key_clk
  PORT key_data = plb_ps2_controller_0_key_data
END

3. 中断API

3.1 注册中断服务程序

XIntc_RegisterHandler(Xuint32 BaseAddress, int InterruptId, XInterruptHandler Handler, void *CallBackRef)
Or
int XIntc_Connect (XIntc *InstancePtr, u8 Id, XInterruptHandler Handler, void *CallBackRef)

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

3.2 中断使能

microblaze_enable_interrupts()

XGpio_InterruptGlobalEnable (&Push_Buttons_Position)
XGpio_InterruptGlobalEnable (&DIP_Switches_8Bit)
XGpio_InterruptEnable (&Push_Buttons_Position, XGPIO_IR_CH1_MASK)
XGpio_InterruptEnable (&DIP_Switches_8Bit, XGPIO_IR_CH1_MASK)

XIntc_mMasterEnable(XPAR_XPS_INTC_0_BASEADDR)
XIntc_mEnableIntr(XPAR_XPS_INTC_0_BASEADDR, XPAR_PUSH_BUTTONS_POSITION_IP2INTC_IRPT_MASK|XPAR_DIP_SWITCHES_8BIT_IP2INTC_IRPT_MASK);
library/fpga/microblazeinterrupt.txt · Last modified: 2022/05/02 00:32 (external edit)