首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Microblaze中断

Microblaze中断

一.硬件配置
(1)添加IP核











(2)分配地址












(3)连线










二.软件编写
(1)timer的处理:载入计数值->设置运行选项(向上向下计数,使能中断,自加载计数值等)->使能,开始运行
(2)interupt的处理:使能microblaze中断->在XPS_INTC注册中断服务函数->使能XPS_INTC中断->使能timer在XPS_INTC里的中断
(3)程序架构:
#include "xparameters.h"
#include "xintc.h" //中断子函数头文件
#include "xtmrctr.h" //定时器子函数头文件
void  timer_int_handler(void);//中断函数声明
int main(void)
{

  microblaze_enable_interrupts();

XIntc_RegisterHandler(XPAR_XPS_INTC_0_BASEADDR,
            XPAR_XPS_INTC_0_XPS_TIMER_0_INTERRUPT_INTR,
            (XInterruptHandler)timer_int_handler,
            (void *)XPAR_XPS_TIMER_0_BASEADDR
            );

  XIntc_mMasterEnable(XPAR_XPS_INTC_0_BASEADDR);

  XTmrCtr_mSetLoadReg(XPAR_XPS_TIMER_0_BASEADDR,0,0x20000000);

  XTmrCtr_mSetControlStatusReg(XPAR_XPS_TIMER_0_BASEADDR,0,
  XTC_CSR_ENABLE_TMR_MASK | XTC_CSR_ENABLE_INT_MASK |XTC_CSR_AUTO_RELOAD_MASK|XTC_CSR_DOWN_COUNT_MASK );

XIntc_mEnableIntr(XPAR_XPS_INTC_0_BASEADDR,XPAR_XPS_TIMER_0_INTERRUPT_MASK);  
  while(1);//等待中断   
  return 0;
}
//中断处理程序:
void  timer_int_handler(void)
{  
  unsigned int timer_csr;
  timer_csr = XTmrCtr_mGetControlStatusReg(XPAR_XPS_TIMER_0_BASEADDR, 0);
  //...中断处理

  XTmrCtr_mSetControlStatusReg(XPAR_XPS_TIMER_0_BASEADDR,0, timer_csr);
}

例子:
void InterruptHandler(void);

int main(void)
{
microblaze_register_handler((XInterruptHandler)InterruptHandler, (void*)0);

#ifdef DEBUG
print("* Registered Interrupt Handler *\n\r");
#endif

microblaze_enable_interrupts();

// Something useful here.

return 0;
}



void InterruptHandler(void)
{
#ifdef DEBUG
print("* Entering Interrupt *\r\n");
#endif
microblaze_disable_interrupts();

// Do something useful here .

microblaze_enable_interrupts();

#ifdef DEBUG
print("* Leaving Interrupt *\r\n");
#endif
}

转载自:阳明的博客
记录学习中的点点滴滴,让每一天过的更加有意义!
返回列表