hclmcu

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

  自己最近在玩Microblaze,下面简单的贴个定时器中断的例程出来,供大家参考,自己加了一点汉语注释,方便大家阅读,不过本人还是提倡大家提高原文阅读能力,本例程实现一秒定时,并在led灯上显示。(如需转载请注明出处)

废话太多,贴代码:

#include <xtmrctr.h>
#include <xintc_l.h>
#include <xgpio.h>
#include <xparameters.h>
#define LEDChan  1

unsigned int count = 0;
XGpio gpio;


void timer_int_handler(void * baseaddr_p) //中断句柄函数(中断服务程序)

{
 unsigned int csr;
 /* 读取定时器0的控制状态寄存器,判断中断是否产生 */
 csr = XTmrCtr_mGetControlStatusReg(XPAR_DELAY_BASEADDR,0);
 /* 如果中断产生,标志变量自加1 */
 if(csr &XTC_CSR_INT_OCCURED_MASK)
 {
  count++;
 } 
 /* 中断服务程序的最后,清除中断标志位 */
 XTmrCtr_mSetControlStatusReg(XPAR_DELAY_BASEADDR,0, csr);
}


int main()

{    
  /* 注册定时器的中断服务程序 */
  XIntc_RegisterHandler(XPAR_XPS_INTC_0_BASEADDR,
                             XPAR_XPS_INTC_0_DELAY_INTERRUPT_INTR,
                             (XInterruptHandler) timer_int_handler,
                             (void *)XPAR_DELAY_BASEADDR);

 

  /* 使能中断控制器 */
  XIntc_mMasterEnable(XPAR_XPS_INTC_0_BASEADDR);
  XIntc_mEnableIntr(XPAR_XPS_INTC_0_BASEADDR, 0x1);

  /* 给装载寄存器装载初值 */
  XTmrCtr_mSetLoadReg(XPAR_DELAY_BASEADDR, 0, 50000000); 
 
  /* 使能中断控制器中的计数器中断*/
  XIntc_mEnableIntr(XPAR_DELAY_BASEADDR, XPAR_DELAY_INTERRUPT_MASK);
 
  /* 设置计数器计数模式并开始计数*/
  XTmrCtr_mSetControlStatusReg(XPAR_DELAY_BASEADDR, 0, XTC_CSR_ENABLE_TMR_MASK | XTC_CSR_ENABLE_INT_MASK |
      XTC_CSR_AUTO_RELOAD_MASK | XTC_CSR_DOWN_COUNT_MASK); 
 
  /* 使能Microblaze中断*/
   microblaze_enable_interrupts();
 
  /*初始化gpio口并设置其输入输出方向*/
 XGpio_Initialize(&gpio, XPAR_LED_DEVICE_ID);
 XGpio_SetDataDirection(&gpio,LEDChan, 0);


  while(1)
  {
  /* 把count赋给gpio口,将其显示在led灯上*/
  XGpio_DiscreteWrite(&gpio,1,count);
  if(count==256)
   count=0;
  }
  return 0;
}

 

注:程序中函数中的参变量多数是在xtmrctr_l.h文件里的,右以在其中查阅其值及含义,然后对照后面本文的Control/Status Register 0 (TCSR0)

的相关信息,每个函数的作用便很清楚了。

 

microblaze定时器中断在generate mode 下的主要特性如下:

microblaze定时器中断主要寄存器的设置如下:

posted on 2010-08-14 12:56  hclmcu  阅读(4096)  评论(0编辑  收藏  举报