加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MicroBlaze定时器(Timer)的使用

(2008-06-26 09:29:31)
标签:

microblaze

定时器

timer

中断

it

分类: Xilinx_FPGA

MicroBlaze的Timer IP比较简单易用,一个XPS_TC IP包含两个32bit定时/计数器。工作方式也比较灵活,可以设置中断、自动加载、Count UP/DOWN等模式,每当timer溢出的时候产生中断,进入中断程序后通过写1 clear中断标志位,通常的做法是csr = = XTmrCtr_mGetControlStatusReg(XPAR_MY_TIMER_BASEADDR, 0);然后再“XTmrCtr_mSetControlStatusReg(XPAR_MY_TIMER_BASEADDR, 0, timer_csr);”,这样可以在不影响别的控制位的前提下clear中断标志位。

同样值得注意的是用了XIntc模块,要将timer中断服务程序连接(注册)到XIntc模块上。

使用Timer IP的流程是:(1)设置Load Regisiter初始值;(2)设置控制/状态寄存器,包括中断时能、timer使能、COUNT方向、Relaod使能等;(3)注册中断服务函数;(4)开MB全局中断和XIntc中断;(5)等待中断发生。(6)在中断服务程序中clear中断标志位。

来看例程(100MHz时钟下MB每秒钟产生一个中断):

#include "xparameters.h"
#include "xutil.h"
#include "xintc.h"
#include "xtmrctr.h"

void timer_int_handler(void);

unsigned int push_button_times, timer_cnt;

int main()
{
 timer_cnt = 0;
 
 xil_printf("--start the program test---\r\n");
 
 XTmrCtr_mSetLoadReg(XPAR_MY_TIMER_BASEADDR, 0, 100000000);
 XTmrCtr_mSetControlStatusReg(XPAR_MY_TIMER_BASEADDR, 0,
        XTC_CSR_ENABLE_TMR_MASK | XTC_CSR_ENABLE_INT_MASK |
        XTC_CSR_AUTO_RELOAD_MASK | XTC_CSR_DOWN_COUNT_MASK);

//must enable mb_enable bit
 microblaze_enable_interrupts();
 
 //must enable xgpio_interruptglobalenable bit;
 //register the isr
 XIntc_RegisterHandler(XPAR_INTC_0_BASEADDR, \
        XPAR_XPS_INTC_0_MY_TIMER_INTERRUPT_INTR,\
        (XInterruptHandler)timer_int_handler, \
        (void *)0);
        
 //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\
      |XPAR_RS232_UART_INTERRUPT_MASK\
      |XPAR_MY_TIMER_INTERRUPT_MASK);
 
 while(1);
 return 0;
}

 

void timer_int_handler(void)
{
 unsigned int timer_csr;
 timer_cnt++;
 timer_csr = XTmrCtr_mGetControlStatusReg(XPAR_MY_TIMER_BASEADDR, 0);
 if(timer_csr & XTC_CSR_INT_OCCURED_MASK)
 {
  xil_printf("--timer interrupt happened times = %d!--\r\n", timer_cnt);
  XTmrCtr_mSetControlStatusReg(XPAR_MY_TIMER_BASEADDR, 0, timer_csr);
 }
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有